Go1编译器如何工作?

时间:2012-04-21 18:26:29

标签: compiler-construction go

我一直在和Go一起学习一个学期的项目,我注意到了src / pkg / go文件夹中的go / ast,go / token,go / parser等软件包。但是,gc编译器基于位于src / cmd / gc。

中的C文件

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

3 个答案:

答案 0 :(得分:5)

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

{god},gofmt和各种go工具子命令等工具中使用了go/个包。也许有一天它们可以用来在Go中编写Go编译器,但是还没有人在这条道路上走得很远。

答案 1 :(得分:2)

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

  

Go 1.3+ Compiler Overhaul”(Russ Cox)

在该上下文中将涉及go / parser之类的包,并且“Phase 5”提到:

  

将前端替换为go/parsergo/types的最新(可能是新的)版本   Robert Griesemer根据对当前版本的经验(以及新名称,以保持Go 1兼容性)讨论了在某些时候设计新的go/parsergo/types API的可能性。   将它们连接到编译器后端的工作可能有助于指导新API的设计。


这可能证明了语言的稳定程度,因为之前提到的旧“A Tour of Go”(2012年6月)明确指出:

  

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

问题“是否有计划引导Go in Go,编写Go编译Go?”当时提到(2012年6月再次发布):

  

没有即时计划。 Go确实附带了一个用Go编写的Go程序解析器,因此第一部分已经完成,并且有一个实验型的检查器正在开发中,但这些主要用于编写程序分析工具。

     

过去我曾经使用过自举语言,我发现自举并不一定适合经常变化的语言。它让我想起如果你跌倒的话,我会偶尔爬上一个悬崖并将钩子拧进悬崖。

答案 2 :(得分:1)

这个工具是否依赖于我上面引用的包?

'go'工具确实依赖于那些包

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

没有

相关问题