Compiler construction Go1编译器是如何工作的?

Compiler construction Go1编译器是如何工作的?,compiler-construction,go,Compiler Construction,Go,为了一个学校项目,我花了大约一个月的时间研究Go,我注意到src/pkg/Go文件夹中的Go/ast、Go/token、Go/parser等包。但是,gc编译器基于src/cmd/gc中的C文件 我的问题是关于Go1中构建和运行程序的新go命令:这个工具是否依赖于我上面提到的包?i、 e.如果我在/go/token/token.go中添加了一个新的令牌,它会被新的go编译器识别吗?这个工具是否依赖于我上面提到的包 “go”工具确实依赖于这些包 如果我在/go/token/token.go中添加了

为了一个学校项目,我花了大约一个月的时间研究Go,我注意到src/pkg/Go文件夹中的Go/ast、Go/token、Go/parser等包。但是,gc编译器基于src/cmd/gc中的C文件

我的问题是关于Go1中构建和运行程序的新go命令:这个工具是否依赖于我上面提到的包?i、 e.如果我在/go/token/token.go中添加了一个新的令牌,它会被新的go编译器识别吗?

这个工具是否依赖于我上面提到的包

“go”工具确实依赖于这些包

如果我在/go/token/token.go中添加了一个新的令牌,它会被新的go编译器识别吗


否。

Go编译器是用纯C编写的,不使用
Go/
下的包。在Go源代码树中,其lexer位于src/cmd/gc/lex.c中,其Bison语法为src/cmd/gc/Go.y

go/
包用于godoc、gofmt和各种go工具子命令等工具中。也许有一天它们也可以用来在Go中编写Go编译器,但还没有人在这方面走得很远。

注意(2013年12月18日),有计划将编译器从C迁移到Go本身:

“”(罗斯·考克斯)

在这种情况下,将涉及像go/parser这样的包,“阶段5”提到:

将前端更换为最新版本的
go/parser
go/types

Robert Griesemer根据当前API的经验(并以新名称命名,以保持go 1兼容性),讨论了在某个时候设计新的
go/解析器
go/类型
API的可能性。
将它们连接到编译器后端的工作可能有助于指导新API的设计


这可能是语言变得多么稳定的一个证据,因为前面提到的旧“(2012年6月)明确指出:

Go本身没有编写,这一事实也使得进行重大的语言更改变得更加容易。
在最初发布之前,我们经历了一些大规模的语法变化,我很高兴我们不必担心如何重新启动编译器,或者在这些变化期间确保某种向后兼容性

当时(2012年6月)提到的问题“是否有计划在Go中引导Go,在Go中编写Go编译器?”:

没有立即的计划。Go确实附带了一个用Go编写的Go程序解析器,所以第一部分已经完成了,还有一个实验性的类型检查器正在工作中,但这些主要用于编写程序分析工具

我过去研究过自举语言,我发现自举并不一定适合频繁变化的语言。这让我想起了爬上悬崖,偶尔在悬崖上拧上钩子,以便在你摔倒时抓住你


如果我添加了一个新的令牌,以及相应的ast节点和解析方法,会怎么样?或者说我完全走错了正轨——go工具调用go编译器,但go编译器是一个C项目,它不使用go解析器包。用它应该编译的语言编写编译器有一个直接的优势:dog fooding可以让你感受你的语言。然而,它也带来了一个障碍:可移植性。为您的语言提供一个C编译器意味着您可以让编译器在您喜欢的任何平台上工作。当然,运行时和codegen可能仍然需要工作,但差距较小(尽管仍然很困难)。实际上,llgo是一个使用llvm作为后端用Go编写的Go编译器,它还没有完成,但似乎相当先进:请注意:这是我63个月来关于堆栈溢出的第900个答案!事故发生后不到6个月。在此之前:,,和。