V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
wuruxu

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

  •  
  •   wuruxu ·
    wuruxu · Aug 20, 2015 · 4947 views
    This topic created in 3910 days ago, the information mentioned may be changed or developed.

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

    46 replies    2015-09-14 14:36:47 +08:00
    sablib
        1
    sablib  
       Aug 20, 2015
    为了实现自举吧。
    wakemecn
        2
    wakemecn  
       Aug 20, 2015
    我今天第一次下载 go 就用了新版==
    tabris17
        3
    tabris17  
       Aug 20, 2015
    为了逼格,向 C 致敬
    Bown
        4
    Bown  
       Aug 20, 2015
    - 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  
       Aug 20, 2015
    自举
    vipygd
        6
    vipygd  
       Aug 20, 2015
    自举
    windyboy
        7
    windyboy  
       Aug 20, 2015
    我只能说真的强悍
    yakczh
        8
    yakczh  
       Aug 20, 2015
    为啥 perl6 自举失败了
    oska874
        9
    oska874  
       Aug 20, 2015
    以前不举,现在终于硬了。
    hooluupog
        10
    hooluupog  
       Aug 20, 2015
    loading
        11
    loading  
       Aug 20, 2015 via Android
    go 很早就完成自举了,不是新鲜事!
    songjiaxin2008
        12
    songjiaxin2008  
       Aug 20, 2015
    先有鸡先有蛋的问题吗
    lujiajing1126
        13
    lujiajing1126  
       Aug 20, 2015 via Android
    实现自举
    janxin
        14
    janxin  
       Aug 20, 2015
    为了自举。就是信仰
    echo1937
        15
    echo1937  
       Aug 20, 2015
    其实自举的语言太多了, C 干过, C 艹干过, Java 干过, rust 干过, Python 的 Pypy 也干过,不少见。
    mathgl
        16
    mathgl  
       Aug 20, 2015 via Android
    @yakczh perl6 改东西太多,自己挖坑,一头掉下去了。
    undeflife
        17
    undeflife  
       Aug 20, 2015
    @loading 用 Go 重新写 Compiler 才能叫自举(bootstrapping ) 你所谓的早就完成是什么意思?
    timothyye
        18
    timothyye  
       Aug 20, 2015 via Android
    自举是一种信仰,哈哈
    realpg
        19
    realpg  
    PRO
       Aug 20, 2015
    一直觉得自举就是为了那啥而那啥

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

    你编译这个编译器用的还不是 C 写的编译器 6
    phx13ye
        20
    phx13ye  
       Aug 20, 2015
    bootstrap
    msg7086
        21
    msg7086  
       Aug 20, 2015
    @realpg 不是吧。
    zwy100e72
        22
    zwy100e72  
       Aug 20, 2015   ❤️ 4
    @realpg 我想您有地方理解不是很恰当。

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

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

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

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

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

    (另外不是所有的可执行文件都需要 .exe 后缀)
    qige023
        33
    qige023  
       Aug 21, 2015
    @mxalbert1996 的例子很好

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

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

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

    (最近被项目的老代码搞烦了,掉前人坑里了)
    huobazi
        44
    huobazi  
       Sep 6, 2015
    google 就可以招聘 golang 程序员来写 golang 了
    huobazi
        45
    huobazi  
       Sep 6, 2015
    自己造的变成语言,自己工作中却不能用,这是什么感觉?
    likuku
        46
    likuku  
       Sep 14, 2015
    刚刚在 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
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1143 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 129ms · UTC 17:22 · PVG 01:22 · LAX 10:22 · JFK 13:22
    ♥ Do have faith in what you're doing.