【问题标题】:How is it possible for the Go runtime to be written in Go?Go 运行时如何用 Go 编写?
【发布时间】:2016-01-13 00:16:18
【问题描述】:

read 从 Go 1.4 开始,Go 运行时是用 Go 本身(而不是 C)编写的。

这怎么可能?如果 Go 程序运行在运行时之上,并且运行时是 Go 程序,那么运行时是否运行在自身之上?

【问题讨论】:

  • 这个问题可能有用:Writing a compiler in its own language
  • @TimCooper - 谢谢,这很有用。似乎用那种语言为一种语言编写编译器是可能的,因为一旦启动,编译器就能够自行编译。但是,在我看来,运行时无法支持自己:例如,垃圾收集器可以收集自己的垃圾吗?
  • 为什么很难理解一种语言可以使用以相同语言编写(并由相同编译器编译)的库(和框架)?为什么它能够像使用该语言的其他任何东西一样进行自己的垃圾收集?
  • 不要把 Go 的运行时想成 Ruby 或 Java 的。 Go 的运行时实际上只是一个链接到您的本机应用程序的库,它执行诸如 GC、管理网络 I/O 等之类的事情……而说,由于 java 缺乏本机编译,Java 的运行时不能用 java 编写。

标签: go runtime bootstrapping


【解决方案1】:

简而言之:小心。

In long: unsafe 包允许你做指针算术和任意转换,你需要实现 go 的 gc。您避免在 gc go 代码中使用 gc,就像在普通 go 代码中一样:通过使用堆栈或静态分配的数据。下面的链接提到主线 go 编译器通过未记录的选项在运行时强制执行此操作。一些汇编位让您可以进行系统调用,这让您可以完成从生成进程到打开文件的所有操作。

更长更权威:见Ian Lance Taylor (of the go team)'s post on golang-nuts

【讨论】: