与Wiki混淆:解释了C#和Java?

Confused from Wiki: C# and Java are interpreted?

在EN Wiki上,我读到C#和Java都是解释语言,但是至少对于C#,我认为这不是事实。

Many interpreted languages are first compiled to some form of virtual
machine code, which is then either interpreted or compiled at runtime
to native code.

据我了解,它被编译成CIL,并且在运行时使用JIT将其编译到目标平台。 我还读到JIT是口译员,真的吗?
还是因为使用中间代码而将它们称为解释? 我不明白。
谢谢


JIT是对本机(机器)代码进行编译的一种形式。通常(但不是必需),CLI和JVM的实现可通过两个步骤进行编译:

  • 语言编译器将代码编译为中间内容(IL /字节码)
  • JIT在运行时将其编译为本地/机器代码

但是,两者都有口译员。 Micro Framework例如充当IL解释器。同样,NGEN和" AOT"(单声道)之类的工具(在此处查找.NET)允许一开始就编译为本机/机器代码。


On the EN Wiki I read that both C# and Java are interpreted languages

您能否提供链接?

可能是解释词在这里的含义不同。这也许意味着首先要解释这些语言,以将源代码转换为平台无关的代码。(特定于VM)

are they called interpreted as they are using intermediate code

我也这么认为。

I have also read that JIT is an interpreter

JIT是一个编译器。看到这个


它们被认为是JIT语言,与解释语言不同。 JIT只需在执行过程中需要时编译为本地代码。常见的策略是事先编译为中间表示形式(字节码),这会使JIT更快。

但是,没有什么可以阻止它们被解释甚至是静态编译。语言只是语言-从语言角度看,语言的执行方式无关紧要。


是"解释器"还是不取决于讨论的上下文。

从纯抽象的角度来看,可以将解释器定义为运行时中存在的任何中间程序,它将动态地将以一种语言编写的程序代码转换为另一种语言的硬件/软件的目标代码。考虑在x86硬件上运行Java字节码,或者在CLR VM上运行Python,究竟IronPython是什么。在这种情况下,每个虚拟机都是某种解释器。由于它是运行时中存在的程序,因此显然不同于静态编译器或硬件实现的VM-s。

现在,有许多不同的方法可以实现此功能,其中重点是"动态"和"在运行时呈现"。

在讨论VM的实现很重要的讨论中,人们明确区分了"经典"解释器和JIT编辑器。经典解释器是一种对托管程序的每条指令都发出目标代码例程的程序。此设计易于构建,但难以优化。由JIT设计的设计读取一堆原始代码的指令,然后将所有这些指令转换为一个本地编译例程。因此,它"解释"得更快。就像VM中的微静态编译器一样。有许多不同的方法来完成标记为JIT的行为,然后还有其他方法,例如跟踪编译器。

像CLR,HotSpot和J9 JVM这样的现代VM甚至比用简单的标签(如JIT或Interpreter)进行标记更为复杂。它们可以同时是静态编译器(AOT执行),经典解释器和JIT版本的VM。

例如,CLR可以提前编译代码(静态编译器),并将本机代码作为一堆或多或少的可执行文件存储在磁盘上,以便将来更快地启动托管程序。我相信" ngen"是Windows中用于此功能的AOT进程。如果未使用AOT,则CLR充当JIT VM。

J9和HotSpot能够在运行时中根据代码分析和当前负载在纯解释执行或JIT版本之间进行切换。所以这是一个非常灰色的区域。 J9甚至具有类似于CLR的AOT功能。

其他一些VM,例如Maxine JVM或PyPy,被称为"元圆" VM。这意味着它们(大多数情况下)是以它们托管的语言实现的(Maxine是用Java编写的JVM)。为了提供良好的代码,它们通常具有以宿主语言实现的一些类似于JIT的行为,然后由非常低的,接近机器的解释器进行引导和优化。

因此,口译员的实际定义因讨论的上下文而异。当使用诸如JIT之类的标签时,讨论的VM的实现细节将有明确的讨论重点。