V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
drymonfidelia
V2EX  ›  程序员

为什么 il2cpp、Nuitka 等把其它语言编译成机器码都需要使用 C++作为中间语言编译两次,.NET 8 的 AOT 可以一步到位?中间语言为什么是 C++,不是 C、更安全的 Rust?

  •  
  •   drymonfidelia · 8 小时 58 分钟前 · 449 次点击
    5 条回复    2025-03-14 23:08:34 +08:00
    pursuer
        1
    pursuer  
       8 小时 34 分钟前
    从 LLVM 出现之后,大部分语言中间语言都用 LLVM IR 了,先编译成另一个语言再编译要解析代码两次浪费时间,以前还没有 LLVM ,没有标准的中间表示所以会选 C/C++,这样支持的平台比较多。
    kneo
        2
    kneo  
       7 小时 41 分钟前   ❤️ 2
    你想想为什么要通过中间语言,不直接生成机器码呢?
    1. 中间语言和源语言特性接近,编译器比较简单。
    2. 利用中间语言的生态,比如把中间语言作为库使用,或者使用中间语音的库。

    Rust 不用想了,让程序生成正确的 Rust 代码,可能比直接生成机器码还麻烦。除非你的语言本身就是建立在 Rust 之上的。比如你的语言本身也有 borrow checker 。
    同时,Rust 本身的完全特性是防止人类手写代码犯错的。对于程序生成的代码,往往是不必要的。比如程序如果有内存泄漏,找到原因,在编译器端修一次可能就解决了,不像你每次新写的 C 代码,每次都要记得释放内存。

    中间语言应该有足够的灵活性,足够快的编译速度,比较少的类型检查。JS 和 C 是比较常见的选择。

    il2cpp 选择 C++可能是因为 C++的 class 比较利于映射到 IL 里的类吧。Nuitka 好像生成的是 C 代码。
    drymonfidelia
        3
    drymonfidelia  
    OP
       7 小时 27 分钟前
    @kneo 看了下 Nuitka 生成的确实是 C 。但是 C++编译不快吧,大的项目都要编译几十分钟。
    kneo
        4
    kneo  
       6 小时 58 分钟前 via Android
    @drymonfidelia 如果你不用模板,C++也可以很快。
    jhdxr
        5
    jhdxr  
       6 小时 28 分钟前
    rust 也算是编译两次吧,先到 LLVM IR ,然后再到机器码。这样自己只要维护前端即可
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   964 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 21:37 · PVG 05:37 · LAX 14:37 · JFK 17:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.