Go 代码编译为 C 代码 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
yatseni
V2EX    Go 编程语言

Go 代码编译为 C 代码

  •  1
     
  •   yatseni 2020-02-27 12:29:13 +08:00 5306 次点击
    这是一个创建于 2133 天前的主题,其中的信息可能已经有所发展或是发生改变。
    https://github.com/kitech/cygo

    额外添加一点语法,给内置的 string/array/map 加方法,用着更方便。
    第 1 条附言    2020-02-27 13:45:54 +08:00

    这个项目基于几个在用 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 语言语法的一种方言吧,还可以做一些新语法实验。

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

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

    问下 history 里面的 drswinghead,kitech,egitop,pwaller 这几个 ID 背后有几个人?
    yatseni
        13
    yatseni  
    OP
       2020-02-27 18:28:55 +08:00
    @secondwtq 一个人,不同的 git 环境,配置不一样

    @janxin 所以对这项目有点用不上的感觉
    ChristopherWu
        14
    ChristopherWu  
       2020-02-28 11:28:22 +08:00
    @yatseni 那个,我可以给楼主加一个错误处理的语法糖吗。。
    dexter
        15
    dexter  
       2020-02-28 12:59:31 +08:00
    已点赞
    yatseni
        16
    yatseni  
    OP
       2020-02-29 14:36:48 +08:00
    @ChristopherWu 我看可以,不妨说说
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1069 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 23:14 PVG 07:14 LAX 15:14 JFK 18:14
    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