你想想为什么要通过中间语言,不直接生成机器码呢?
1. 中间语言和源语言特性接近,编译器比较简单。
2. 利用中间语言的生态,比如把中间语言作为库使用,或者使用中间语音的库。
Rust 不用想了,让程序生成正确的 Rust 代码,可能比直接生成机器码还麻烦。除非你的语言本身就是建立在 Rust 之上的。比如你的语言本身也有 borrow checker 。
同时,Rust 本身的完全特性是防止人类手写代码犯错的。对于程序生成的代码,往往是不必要的。比如程序如果有内存泄漏,找到原因,在编译器端修一次可能就解决了,不像你每次新写的 C 代码,每次都要记得释放内存。
中间语言应该有足够的灵活性,足够快的编译速度,比较少的类型检查。JS 和 C 是比较常见的选择。
il2cpp 选择 C++可能是因为 C++的 class 比较利于映射到 IL 里的类吧。Nuitka 好像生成的是 C 代码。 |