为什么 Go 1.5 要用 Go 重新写 compiler ? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
wuruxu
V2EX    Go 编程语言

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

  •  
  •   wuruxu
    wuruxu 2015-08-20 17:09:57 +08:00 4573 次点击
    这是一个创建于 3765 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    46 条回复    2015-09-14 14:36:47 +08:00
    sablib
        1
    sablib  
       2015-08-20 17:29:54 +08:00
    为了实现自举吧。
    wakemecn
        2
    wakemecn  
       2015-08-20 17:43:54 +08:00
    我今天第一次下载 go 就用了新版==
    tabris17
        3
    tabris17  
       2015-08-20 17:45:07 +08:00
    为了逼格,向 C 致敬
    Bown
        4
    Bown  
       2015-08-20 17:49:43 +08:00
    - It is easier to write correct Go code than to write correct C code.
    - It is easier to debug incorrect Go code than to debug incorrect C code.
    - Work on a Go compiler necessarily requires a good understanding of Go. Implementing the compiler in C adds an unnecessary second requirement.
    - Go makes parallel execution trivial compared to C.
    - Go has better standard support than C for modularity, for automated rewriting, for unit testing, and for profiling.
    - Go is much more fun to use than C.

    https://docs.google.com/document/d/1P3BLR31VA8cvLJLfMibSuTdwTuF7WWLux71CYD0eeD8/edit
    chmlai
        5
    chmlai  
       2015-08-20 18:03:51 +08:00
    自举
    vipygd
        6
    vipygd  
       2015-08-20 19:41:08 +08:00
    自举
    windyboy
        7
    windyboy  
       2015-08-20 19:48:19 +08:00
    我只能说真的强悍
    yakczh
        8
    yakczh  
       2015-08-20 19:56:37 +08:00
    为啥 perl6 自举失败了
    oska874
        9
    oska874  
       2015-08-20 20:01:20 +08:00
    以前不举,现在终于硬了。
    hooluupog
        10
    hooluupog  
       2015-08-20 20:07:59 +08:00
    loading
        11
    loading  
       2015-08-20 20:15:28 +08:00 via Android
    go 很早就完成自举了,不是新鲜事!
    songjiaxin2008
        12
    songjiaxin2008  
       2015-08-20 20:16:13 +08:00
    先有鸡先有蛋的问题吗
    lujiajing1126
        13
    lujiajing1126  
       2015-08-20 20:27:21 +08:00 via Android
    实现自举
    janxin
        14
    janxin  
       2015-08-20 20:35:37 +08:00
    为了自举。就是信仰
    echo1937
        15
    echo1937  
       2015-08-20 20:38:55 +08:00
    其实自举的语言太多了, C 干过, C 艹干过, Java 干过, rust 干过, Python 的 Pypy 也干过,不少见。
    mathgl
        16
    mathgl  
       2015-08-20 21:17:18 +08:00 via Android
    @yakczh perl6 改东西太多,自己挖坑,一头掉下去了。
    undeflife
        17
    undeflife  
       2015-08-20 22:00:21 +08:00
    @loading 用 Go 重新写 Compiler 才能叫自举(bootstrapping ) 你所谓的早就完成是什么意思?
    timothyye
        18
    timothyye  
       2015-08-20 22:04:06 +08:00 via Android
    自举是一种信仰,哈哈
    realpg
        19
    realpg  
    PRO
       2015-08-20 22:10:41 +08:00
    一直觉得自举就是为了那啥而那啥

    用汇编写个编译器才是王道……

    你编译这个编译器用的还不是 C 写的编译器 6
    phx13ye
        20
    phx13ye  
       2015-08-20 22:39:31 +08:00
    bootstrap
    msg7086
        21
    msg7086  
       2015-08-20 22:53:49 +08:00
    @realpg 不是吧。
    zwy100e72
        22
    zwy100e72  
       2015-08-20 23:09:14 +08:00   4
    @realpg 我想您有地方理解不是很恰当。

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

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

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

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

    第一个 go 编译器肯定是 c 写的,当 go 成熟之后,官方写了一个 c -> go 的转换器,将 c 写的 go 编译器代码 全部装换成 go 的代码。整个过程就是 用 c 语言作为一个桥梁,沟通了汇编 和 go
    rock_cloud
        27
    rock_cloud  
       2015-08-21 00:06:11 +08:00
    @qige023 你这个 C -> Go 的转换器就是一个 C 语言到 Go 语言的编译器啊,哈哈哈~
    zwy100e72
        28
    zwy100e72  
       2015-08-21 00:12:18 +08:00
    @qige023 并不是。
    编译器本身就是您说的桥梁,官方在 Go 成熟之后是用 Go 写了一个 Go -> 机器码 的转换器,并用之前的 C 语言 版的编译器将新编译器编译成可执行文件,从而达到 Go 语言可以编译 Go 语言 的目的
    另外,您提到的 C -> Go 的转换器可以看成是翻译器,印象当中豆瓣网站就用了这样的工具将 Python 翻译成 C 以获得高性能。
    julyclyde
        29
    julyclyde  
       2015-08-21 00:17:07 +08:00
    其实就是讲政治
    问题是再讲政治,也抹不掉最早的版本被其它编译的黑历史
    mxalbert1996
        30
    mxalbert1996  
       2015-08-21 00:22:51 +08:00   1
    @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
        31
    zonghua  
       2015-08-21 00:34:43 +08:00
    量子计算机什么时候能够面世?苏联的三进制计算机 blog.renren.com/share/100254538/5981159080
    zwy100e72
        32
    zwy100e72  
       2015-08-21 00:57:59 +08:00
    @mxalbert1996 说的很对,一个小瑕疵:
    1. 用 X 语言将 A 写出来,并不局限为 C/C++ ,可以是任意语言
    例子:汇编语言的汇编器没问题的话此处 X = 机器语言,
    Ada 语言的编译器此处 X = 汇编语言

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

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

    perl6 掉进坑里了,真是心酸, python 的 pypy 要是能发展快一点多好啊。
    loading
        36
    loading  
       2015-08-21 06:32:52 +08:00 via Android
    @undeflife 记错了,那是 rust
    hitmanx
        37
    hitmanx  
       2015-08-21 10:57:41 +08:00
    @mxalbert1996 学习了。尤其是里面提到了测试用例
    tonic
        38
    tonic  
       2015-08-21 11:00:46 +08:00
    不然养着这个作者做什么呢...
    caoyue
        39
    caoyue  
       2015-08-21 12:07:17 +08:00
    我猜:
    一是显示这门语言已经足够成熟强大了给社区信心嘛
    二是用自己的语言写编译器当然更方便写起来更爽啊
    lucifer9
        40
    lucifer9  
       2015-08-21 16:17:20 +08:00
    显然是被 rust 黑烦了
    现在不用再听 rust 唠叨了
    datou552211
        41
    datou552211  
       2015-08-21 18:49:45 +08:00 via iPhone
    然而编译速度慢了好多。编译一个 30m 的东西,新款 13 寸 mac 要 40 秒左右
    janxin
        42
    janxin  
       2015-08-21 20:48:56 +08:00
    @datou552211 编译到无所谓,不过现在 STW 改善了好多这个点赞
    yuekcc
        43
    yuekcc  
       2015-08-22 09:22:50 +08:00
    现在 Go 自举了,感觉编译也烦了。首先用 C 编译 1.4 ,然后又用 1.4 编译 1.5 。

    是不是往后都这样?那不是要同时维护 1.4 和 新版本的代码库??

    (最近被项目的老代码搞烦了,掉前人坑里了)
    huobazi
        44
    huobazi  
       2015-09-06 12:17:11 +08:00
    google 就可以招聘 golang 程序员来写 golang 了
    huobazi
        45
    huobazi  
       2015-09-06 12:19:36 +08:00
    自己造的变成语言,自己工作中却不能用,这是什么感觉?
    likuku
        46
    likuku  
       2015-09-14 14:36:47 +08:00
    刚刚在 freebsd 10.1 release 下 用 ports 安装 ports/lang/go ,最新的就是 go-1.5

    因为 ports 是自动源代码编译,所以安装 go-1.5 就会依赖 go-1.4 ,
    整个自动化过程:
    先根据依赖自动安装 go-1.4 ,用系统自带的 llvm/clang 编译安装好 go-1.4 ,
    接着使用 go-1.4 编译安装了 go-1.5
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5667 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 02:07 PVG 10:07 LAX 18:07 JFK 21:07
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86