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
6
简而言之:小心谨慎。 详细来说:unsafe 包允许您执行指针算术和任意类型转换,这是实现 Go 的 gc 所必需的。在 gc Go 代码中,您避免使用 gc,就像在普通的 Go 代码中一样:通过使用堆栈或静态分配的数据。下面的链接提到,主流的 Go 编译器通过一个未记录的选项在运行时强制执行此操作。一些汇编位让您进行系统调用,这使您可以做任何事情,从生成进程到打开文件。 更长更权威的解释请参见:Go 团队的 Ian Lance Taylor 在 golang-nuts 上发布的文章。
- W. Cybriwsky
1
我想知道为什么答案只谈到了垃圾回收,而运行时还为基于普通协程的应用程序提供了执行框架。对于像我这样不使用Go的程序员来说,这并没有完全解释Go的低级和高级部分。 - Pavel Šimerda