如何在一种语言中同时使用编译器和解释器?

Sha*_*ari 5 compiler-construction interpreter

我已经阅读了足够的关于编译器、解释器和使用两者的“事物”的定义的解释。我没有发现编译器和解释器是如何在一种语言中使用的。

mar*_*lin 4

在 Java 中,源代码首先被编译为字节码,然后由解释器(JVM - Java 虚拟机)运行。

字节码是虚拟机的机器代码。

在 Javascript 中,有一个运行时(引擎)可以进行即时编译(JIT)。基本上,在执行时它会得到一个源代码,它会立即将其转换为本机代码,然后执行该代码。在Chrome的引擎中,有两个模块进行编译:一个可以快速执行代码,但代码没有太多优化(ignition解释器),另一个生成高性能代码,但编译需要更多时间(turbofan编译器)。

为什么同时使用:

  • 可移植性 - 当您使用编译的 AOT 中间表示形式时,您可以获取此字节码并在为其提供虚拟机的任何体系结构上运行它。您可以将相同的 Java 字节码推送到 Mac、PC 或 Linux 上的客户端。如果他们安装了 JVM,代码就会运行。对于 C 或 C++,您必须为每个架构提供不同的可执行程序
  • 快速的初始启​​动和良好的执行性能 - 编译需要时间(并且代码越优化,通常编译所需的时间就越多),但没有人喜欢等待。最好是生成一些不完美的东西(点燃阶段),然后通过将热路径编译成高度优化的机器代码(turbofan 阶段)来逐步改进代码。这在今天尤其合理,因为我们拥有具有多个内核的 CPU,但我们无法全部利用它们,因为创建具有多个并行线程的程序很困难(因此一个内核可以执行程序,而另一个内核可以同时优化代码)