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
yatseni

Go 代码编译为 C 代码

  •  1
     
  •   yatseni · Feb 27, 2020 · 5481 views
    This topic created in 2255 days ago, the information mentioned may be changed or developed.
    https://github.com/kitech/cygo

    额外添加一点语法,给内置的 string/array/map 加方法,用着更方便。
    Supplement 1  ·  Feb 27, 2020

    这个项目基于几个在用 Go 的时候遇到的问题:

    • 编译出来的程序非常大 我的另外两个项目,https://github.com/kitech/qt.gohttps://github.com/kitech/php-go ,都有人反馈过。其中 qt.go 这个是 Qt Gui 库的绑定,生成的绑定代码量就有 20w+,用它做出来的一个GUI 程序编译完 到了 60-70M了。 有几个代码量大的其他开源也碰到这个问题, 像 CockroachDB 的作者还写了一篇很长的文章。
    • 操作字符串时大量使用 strings/strconv 包,一堆这样的代码看着不大好,直接做成 builtin 的方法更好
    • Go 的语法确实简洁很好,不过用了时间长了,觉得有些地方还是能改进一下写法的
    • 试着改进错误处理,实验性实现一个不需要try,只要 catch 语句的错误处理语法

    理想的目标成为 Go 语言的一个第三方编译器,当然要完全兼容实现 Go 的所有功能,难度是相当大的。 不过,离理想比较远的话,由于 Go 的简洁语法还是挺好的,会成为基于 Go 语言语法的一种方言吧,还可以做一些新语法实验。

    Supplement 2  ·  Feb 27, 2020
    还有一点,Go 与 C 语言的相互调用不是 0 代价的。
    16 replies    2020-02-29 14:36:48 +08:00
    guonaihong
        1
    guonaihong  
       Feb 27, 2020
    建议,加些文档。example 最好在 readme 里面有连接可以点进去。
    Mitt
        2
    Mitt  
       Feb 27, 2020   ❤️ 1
    不是很懂为什么认为把 go 的功能用 c 再编译一遍能比 go 高效,难道认为 go 是脚本语言吗?这样下去的结果不是又实现了一个 go?
    CismonX
        3
    CismonX  
       Feb 27, 2020
    很赞。最近我也在学习编译原理,希望这个项目能对我有所帮助
    FrankHB
        4
    FrankHB  
       Feb 27, 2020
    不需要 try 只需要 catch 是打算长什么样的?就是隐含了 expand 到 block,顺带不让用户选择要 catch 的范围?
    janxin
        5
    janxin  
       Feb 27, 2020
    LLVMGo 直接编译也可以吧?
    yatseni
        6
    yatseni  
    OP
       Feb 27, 2020
    @FrankHB

    `catch` 语法这个样子的,catch 范围是整个函数级的,不太喜欢 try {} 块,改变了代码的层级结构:
    https://github.com/kitech/cygo/blob/0f213381f06116d0f6f2ca6bf2ccbe70ab088882/bysrc/tpkgs/catch2/t.go#L18
    yatseni
        7
    yatseni  
    OP
       Feb 27, 2020
    @janxin 从 LLVMGo 进度上看好像不会大力开发,还不如像 tinygo, mingo 这样第三方的
    FrankHB
        8
    FrankHB  
       Feb 27, 2020
    看来和我理解的差不多。
    按我的口味,我不喜欢 try ... catch ... 这种要求语法上是内嵌“代码块”。技术意义上,这种 try 和 catch 必须是“语法”,其中 ... 不能一等对象,因此整个基本上不得不用宏实现(如 https://gist.github.com/sebfisch/2235780 )而不能拆分成函数。
    不过都打算直接内建在语言里写死了,这倒是无所谓了。
    ai277014717
        9
    ai277014717  
       Feb 27, 2020
    包大小是个问题不过用 gzexe upx 啥的大概能减少一半大小
    dick20cm
        10
    dick20cm  
       Feb 27, 2020
    v 站的老哥个个都是人才,楼主水平估计可以一个人吊打沸腾厂方舟编译器
    janxin
        11
    janxin  
       Feb 27, 2020
    @yatseni llvmgo 确实力量不足,算是个人项目。tinygo 之类的和 llvmgo 还不一样,他们没有全兼容 Go 功能的预期,主要是把语言使用场景做了拓展,无论语言本身功能和标准库支持都不在一个水平上
    secondwtq
        12
    secondwtq  
       Feb 27, 2020
    粗略翻了一下 commit history,发现已经做了一年多了 ...

    问下 history 里面的 drswinghead,kitech,egitop,pwaller 这几个 ID 背后有几个人?
    yatseni
        13
    yatseni  
    OP
       Feb 27, 2020
    @secondwtq 一个人,不同的 git 环境,配置不一样

    @janxin 所以对这项目有点用不上的感觉
    ChristopherWu
        14
    ChristopherWu  
       Feb 28, 2020
    @yatseni 那个,我可以给楼主加一个错误处理的语法糖吗。。
    dexter
        15
    dexter  
       Feb 28, 2020
    已点赞
    yatseni
        16
    yatseni  
    OP
       Feb 29, 2020
    @ChristopherWu 我看可以,不妨说说
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2383 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 53ms · UTC 11:40 · PVG 19:40 · LAX 04:40 · JFK 07:40
    ♥ Do have faith in what you're doing.