Go运行时如何用Go语言编写的?

4

阅读到自Go 1.4起,Go运行时是用Go本身编写的(而不是用C编写的)。

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


2
这个问题可能会有用:使用自己的语言编写编译器 - user142162
1
@TimCooper - 谢谢,这很有用。似乎使用某种语言编写该语言的编译器是可能的,因为一旦引导完成,编译器就能够编译自身。然而,在我看来,运行时无法支持自身:例如,垃圾收集器能否收集自己的垃圾? - user200783
1
为什么很难理解一种语言可以使用用同一语言编写(并由同一编译器编译)的库(和框架)?而且,为什么它不能像使用该语言的任何其他东西一样进行自己的垃圾回收呢? - Ken White
不要把Go的运行时想象成Ruby或Java的那样。Go的运行时实际上只是一个链接到本地应用程序中的库,它执行诸如GC、管理网络I/O等操作...相比之下,Java的运行时无法使用Java编写,因为Java缺乏本地编译的能力。 - David Budworth
@KenWhite 因为运行时不仅仅是一个库。显然,提供任务执行和垃圾回收的Go运行时不能使用这些特性来编写。但是,显然Go团队已经完成了这项工作,并修改了语言,以便它提供了类似Rust和Tokio的低级层和高级层,其中Tokio是用Rust编写的,但您的应用程序是使用为Tokio编写的协程而不是为Rust编写的。同样,Go运行时也不能像Go应用程序一样编写。 - Pavel Šimerda
1个回答

6
简而言之:小心谨慎。
详细来说:unsafe 包允许您执行指针算术和任意类型转换,这是实现 Go 的 gc 所必需的。在 gc Go 代码中,您避免使用 gc,就像在普通的 Go 代码中一样:通过使用堆栈或静态分配的数据。下面的链接提到,主流的 Go 编译器通过一个未记录的选项在运行时强制执行此操作。一些汇编位让您进行系统调用,这使您可以做任何事情,从生成进程到打开文件。
更长更权威的解释请参见:Go 团队的 Ian Lance Taylor 在 golang-nuts 上发布的文章

我想知道为什么答案只谈到了垃圾回收,而运行时还为基于普通协程的应用程序提供了执行框架。对于像我这样不使用Go的程序员来说,这并没有完全解释Go的低级和高级部分。 - Pavel Šimerda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接