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 · 4799 次点击
    这是一个创建于 1730 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 直接编译也可以吧?
    yatseni
        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   ·   实用小工具   ·   2754 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 11:39 · PVG 19:39 · LAX 03:39 · JFK 06:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.