为什么 Go 1.5 要用 Go 重新写 compiler ?

2015-08-20 17:09:57 +08:00
 wuruxu

今天看到 Go1.5 全部采用 Go lang 重新写了。
为什么抛弃 C, 是不是这样更快点?这样做法有什么优势吗?

3983 次点击
所在节点    Go 编程语言
46 条回复
msg7086
2015-08-20 22:53:49 +08:00
@realpg 不是吧。
zwy100e72
2015-08-20 23:09:14 +08:00
@realpg 我想您有地方理解不是很恰当。

大部分编译器生成的代码都是机器码,也可以等价的认为是汇编代码
然而汇编语言抽象层次不高,难以直接用汇编语言写出复杂的编译器

编译器不只编译,而且还做语法分析、代码优化等多种工作
用本语言写本语言的编译器是对语言功能的一种检验,也算是一个比较好的例子

第一个 C 语言的编译器当然不是用 C 语言写的,但是用 c 写出一个高性能的编译器在我看来绝对是对 C 语言性能的一个最好证明,也大概是 C 语言能风靡世界的一个重要原因

小弟一家之言,还基本上是重新整合了一下以前看过的几篇文章,您随便看看。。有什么问题咱们一起讨论
fx
2015-08-20 23:50:04 +08:00
@zwy100e72 正解
hucsmn
2015-08-20 23:51:41 +08:00
自举了以后 Go 开发团队方便干活而已,这只是个开始
barbery
2015-08-20 23:52:31 +08:00
好犀利
qige023
2015-08-20 23:59:19 +08:00
看了下 @zwy100e72 的回复,我理解下

第一个 go 编译器肯定是 c 写的,当 go 成熟之后,官方写了一个 c -> go 的转换器,将 c 写的 go 编译器代码 全部装换成 go 的代码。整个过程就是 用 c 语言作为一个桥梁,沟通了汇编 和 go
rock_cloud
2015-08-21 00:06:11 +08:00
@qige023 你这个 C -> Go 的转换器就是一个 C 语言到 Go 语言的编译器啊,哈哈哈~
zwy100e72
2015-08-21 00:12:18 +08:00
@qige023 并不是。
编译器本身就是您说的桥梁,官方在 Go 成熟之后是用 Go 写了一个 Go -> 机器码 的转换器,并用之前的 C 语言 版的编译器将新编译器编译成可执行文件,从而达到 Go 语言可以编译 Go 语言 的目的
另外,您提到的 C -> Go 的转换器可以看成是翻译器,印象当中豆瓣网站就用了这样的工具将 Python 翻译成 C 以获得高性能。
julyclyde
2015-08-21 00:17:07 +08:00
其实就是讲政治
问题是再讲政治,也抹不掉最早的版本被其它编译的黑历史
mxalbert1996
2015-08-21 00:22:51 +08:00
@qige023
你想创造一门 V 语言而且用 V 语言来写 V 编译器的话,你得按照下面的方法做:
1 、用 C++把那个编译器( A )写出来,顺便留下很多测试用例。
2 、用 V 语言把那个编译器写( B )出来,用 A.exe 来编译 B ,修改直到所有测试用例都通过为止。
3 、 B.exe 来编译 B 自己得到 B2.exe ,修改直到 B2.exe 所有测试用例都通过为止。这是为了保证,就算 B 本身有很多 bug ,至少编译自己是没有 bug 的,从而你就可以走到第四步。
4 、当你觉得有信心了,用 A.exe 把 B 编译一遍,就得到了 B.exe 。然后 A 的代码和 A.exe 都在也不需要存在了,删掉他们。以后你就不断的用 B.exe 来编译下一个版本的 B 就好了。就自举了。
zonghua
2015-08-21 00:34:43 +08:00
量子计算机什么时候能够面世?苏联的三进制计算机 blog.renren.com/share/100254538/5981159080
zwy100e72
2015-08-21 00:57:59 +08:00
@mxalbert1996 说的很对,一个小瑕疵:
1. 用 X 语言将 A 写出来,并不局限为 C/C++ ,可以是任意语言
例子:汇编语言的汇编器没问题的话此处 X = 机器语言,
Ada 语言的编译器此处 X = 汇编语言

(另外不是所有的可执行文件都需要 .exe 后缀)
qige023
2015-08-21 01:09:32 +08:00
@mxalbert1996 的例子很好

@zwy100e72 如你所说的话,那就是官方为了实现自举的话,得用 go 实现 go -> 平台特定( x86 、 x64 、 PowerPC 等)的汇编码的过程,然后用平台特定的汇编编译器编译成可执行程序,这样理解正确吗?
zwy100e72
2015-08-21 02:15:19 +08:00
@qige023
有一部分编译器借助了这个过程,更多的是直接生成机器码
另外并不存在特定官方的说法,只是如今部分语言有主要推动者,出力比较多 (MS-Visual X / Apple-Swift&ObjC / Google-Go )。。。
如果不满意官方的,完全可以另起炉灶,或者在官方基础上形成分支,或者直接影响官方的版本
echo1937
2015-08-21 02:23:05 +08:00
@zwy100e72 自起炉灶要大量的人力和财力去支撑,现在差不多用途的语言都有先来者占着了,除非有大公司撑腰或者社区有极大热情的,否则前景都不会太好。最典型的恐怕就是 dart 和 JS , go 和 rust 了。

perl6 掉进坑里了,真是心酸, python 的 pypy 要是能发展快一点多好啊。
loading
2015-08-21 06:32:52 +08:00
@undeflife 记错了,那是 rust
hitmanx
2015-08-21 10:57:41 +08:00
@mxalbert1996 学习了。尤其是里面提到了测试用例
tonic
2015-08-21 11:00:46 +08:00
不然养着这个作者做什么呢...
caoyue
2015-08-21 12:07:17 +08:00
我猜:
一是显示这门语言已经足够成熟强大了给社区信心嘛
二是用自己的语言写编译器当然更方便写起来更爽啊
lucifer9
2015-08-21 16:17:20 +08:00
显然是被 rust 黑烦了
现在不用再听 rust 唠叨了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/214606

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX