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 · 3935 次点击
    这是一个创建于 3177 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天看到 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  
       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   ·   我们的愿景   ·   实用小工具   ·   2197 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 02:36 · PVG 10:36 · LAX 19:36 · JFK 22:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.