我知道java会生成字节码,但JVM需要在运行时每次都解释它。
是否存在生成与机器无关的代码的编译器,假设为C. 然后在目标机器上永久转换为本地机器代码而不是每次运行转换?
这是否解决了为什么许多开发人员为Windows而不是Linux开发的原因?
答案 0 :(得分:2)
不是真的,但有些东西很接近。
C被一些人随便携带时被视为低级别。 (当然,这不包括所有API)。 GHC Haskell编译器在内部使用了一种非常类似C语言的c--,它可能非常接近你正在寻找的依赖代码中的机器。
大多数现代编译器都有这样的中间代码,例如LLVM。甚至还有一个汇编程序(因此比C更低)。但请注意,LLVM中间代码不可移植,例如必须在编译时知道指针大小。 (此时C中的所有sizeofs都将被修复)
但IMO有一个更简单的解决方案:编译任何平台的代码,如果你在不同的平台上,你就像QEMU一样动态重新编译。这仍然会对绩效产生负面影响。
答案 1 :(得分:1)
这当然是可能的,而且interpreters exist适用于C和C ++。但是,使用这些语言的项目通常会使用特定于平台的代码(如Windows API)来阻止它们被移植。口译语言通常提供与平台无关的核心库。
现代编译器 - 如Clang,LLVM和GCC - 都将源代码编译为中间语言。这意味着相同的代码级优化可以应用于编译器可以转换的任何语言,并且还支持Emscripten之类的工具,可以有效地将C编译为JavaScript!我相信它用于最近的JavaScript Unreal Engine demo。
答案 2 :(得分:0)
一个Java示例:Android 4.4引入了一个新的实验性运行时虚拟机ART(Android Runtime)。
ART在编译和解释代码之间跨越了一个有趣的中间层,称为提前(AOT)编译。目前使用Android应用程序,每次打开它们时都会在运行时(使用JIT)进行解释。这很慢。 (相比之下,iOS应用程序是编译的本机代码,速度更快。)启用ART后,每个Android应用程序在安装时都会编译为本机代码。然后,当运行应用程序时,它可以执行本机应用程序的所有功能。