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

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

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

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

il2cpp 选择 C++可能是因为 C++的 class 比较利于映射到 IL 里的类吧。Nuitka 好像生成的是 C 代码。
drymonfidelia
drymonfidelia
23 小时 36 分钟前
@kneo 看了下 Nuitka 生成的确实是 C 。但是 C++编译不快吧,大的项目都要编译几十分钟。
kneo
kneo
23 小时 7 分钟前
@drymonfidelia 如果你不用模板,C++也可以很快。
jhdxr
jhdxr
22 小时 38 分钟前
rust 也算是编译两次吧,先到 LLVM IR ,然后再到机器码。这样自己只要维护前端即可
glcolof
glcolof
9 小时 49 分钟前
@drymonfidelia C++慢主要是因为大量的文件包含、预处理和模板展开,如果机器生成的 C++代码减少这类因素(即生成的是 C with class ),编译会快很多。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1118535

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX