![]() |
1
pursuer 8 小时 34 分钟前
从 LLVM 出现之后,大部分语言中间语言都用 LLVM IR 了,先编译成另一个语言再编译要解析代码两次浪费时间,以前还没有 LLVM ,没有标准的中间表示所以会选 C/C++,这样支持的平台比较多。
|
2
kneo 7 小时 41 分钟前 ![]() 你想想为什么要通过中间语言,不直接生成机器码呢?
1. 中间语言和源语言特性接近,编译器比较简单。 2. 利用中间语言的生态,比如把中间语言作为库使用,或者使用中间语音的库。 Rust 不用想了,让程序生成正确的 Rust 代码,可能比直接生成机器码还麻烦。除非你的语言本身就是建立在 Rust 之上的。比如你的语言本身也有 borrow checker 。 同时,Rust 本身的完全特性是防止人类手写代码犯错的。对于程序生成的代码,往往是不必要的。比如程序如果有内存泄漏,找到原因,在编译器端修一次可能就解决了,不像你每次新写的 C 代码,每次都要记得释放内存。 中间语言应该有足够的灵活性,足够快的编译速度,比较少的类型检查。JS 和 C 是比较常见的选择。 il2cpp 选择 C++可能是因为 C++的 class 比较利于映射到 IL 里的类吧。Nuitka 好像生成的是 C 代码。 |
3
drymonfidelia OP @kneo 看了下 Nuitka 生成的确实是 C 。但是 C++编译不快吧,大的项目都要编译几十分钟。
|
4
kneo 6 小时 58 分钟前 via Android
@drymonfidelia 如果你不用模板,C++也可以很快。
|
5
jhdxr 6 小时 28 分钟前
rust 也算是编译两次吧,先到 LLVM IR ,然后再到机器码。这样自己只要维护前端即可
|