Go 《从头实现 µGo 语言》

chai2010-github · 2021年11月21日 · 最后由 1519868095 回复于 2021年11月29日 · 1013 次阅读

Go 语言本身很小,但是背后的支持工具却异常丰富。之前整理了 AST 部分的内容,但是对 Go 前端的实现没有涉及。这个本书希望展示如何从头实现一个 Go 语言的子集µGo 语言。内容计划包含 Go 语言词法解析、语法树构建、语言特性底层实现等内容,最终通过输出 LLVM 编译为本地可执行程序。感谢关注

这个不错,学习一下。

这个报错正常吗?运行不了。

$./ugo -ast -file ../examples/ch1.1/01/hello.ugo
fatal error: panic while printing panic value
[signal SIGSEGV: segmentation violation code=0x1 addr=0x8 pc=0x10b45d8]

goroutine 1 [running]:
runtime.throw({0x10e7ec8, 0x10994a5})
    /usr/local/go/src/runtime/panic.go:1198 +0x71 fp=0xc000076a70 sp=0xc000076a40 pc=0x1030231
runtime.preprintpanics.func1()
    /usr/local/go/src/runtime/panic.go:695 +0x45 fp=0xc000076a90 sp=0xc000076a70 pc=0x1058a05
runtime.deferCallSave(0xc000076b98, 0x10eb670)
    /usr/local/go/src/runtime/panic.go:950 +0x82 fp=0xc000076aa0 sp=0xc000076a90 pc=0x102f9c2

chenge 回复

ugo 还在完善中,目前只能输出 file.ugo 的语法树,不能执行。内容也可能有变动导致代码不能跑,建议每个 ch 的例子独立运行

好的,谢谢

5 楼 已删除

我把代码补齐了,书中没有提供 main,建议加上,我是猜测的。

ugo 项目对于推广 go 语言和编译器都很有帮助,谢谢分享,加油!

我看到了,代码在 examples 目录。

package main

import (
    "fmt"
    "iol"
    "os"
    "os/exec"
)

func compile(code string) {
    output := fmt.Sprintf(tmpl, code)
    os.WriteFile("a.out.ll", []byte(output), 0666)
    exec.Command("clang", "-Wno-override-module", "-o", "a.out", "a.out.ll").Run()
}

const tmpl = `
define i32 @main() {
    ret i32 %v
}
`

func main() {
    code, _ := io.ReadAll(os.Stdin)
    compile(string(code))
}

chenge 回复

👍,ugo 目录会提供一个最终版本的实现,但是目前还在初级阶段。examples 下每个 ch 子目录,可以看作是 ugo 中间实现过程中更不完整的版本。目前只是空闲时间边实现边完善内容,进度可能比较慢,也欢迎 PR

谢谢,不用着急。我发现https://github.com/CheungChan/duanggo小编译器。也是

我目前还水平有限,不过我有购买一个编译器课程,是我的三个兴趣方向之一。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号