JIT编译器是编译器还是解释器?

15

我的问题是把中间语言转换为机器语言的JIT编译器到底是一个编译器还是一个解释器。

另外一个问题: HTML、JavaScript是编译型语言还是解释型语言?

提前致谢。


4
“编译语言”和“解释语言”之间没有明确的分界线。无论何时,所有源代码都必须被翻译成机器码(除非您正在编写汇编语言)。 - Matt Ball
1
它在大部分时间内以混合模式运行(像大多数JIT一样),编译所有内容都是不必要的(例如您的主方法只运行一次,没有编译的必要)。内部循环是编译的首选对象。Javascript可以同时存在,但现在大多数情况下是编译的。 - bestsss
抱歉有点挑剔,但在英语中,“doubt”意味着您不相信某件事是真实的,或者您不确定它是否为真。你所问的是一个“问题”。说如果你怀疑某事,你就会质疑它是正确的,但这并不意味着所有的问题都是怀疑。 - Erik Funkenbusch
@bestsss,.NET CLR 对每个方法都进行JIT编译,Mono也是如此。另外,为什么您认为Main方法只运行一次?程序可以随意调用Main方法。 - Michael Graczyk
@MichaelGraczyk,对于每个方法都进行JIT编译是浪费的,代码必须放在某个地方,生成的代码需要内存[不是常规堆,因为它需要执行位]。没有进行分析的JIT会产生糟糕/非最优的代码,让解释器理解代码也会更快。虽然“main”可以按您想要的方式运行,但这并不是任何情况下的标准做法。在主方法中使用循环的微基准测试也会导致OCR。即使是Java中的TieredCompilation通过C1进行更多的JIT编译,也会产生大量不必要的编译代码,轻松增加服务器的占用空间100MB左右。 - bestsss
@bestsss 无论如何,.NET CLR并不执行任何解释(除了DLR之外)。它现在和过去一直使用JIT编译代码来执行所有方法。 - Michael Graczyk
7个回答

13

JIT(即时编译器)是一种编译器。它可以进行优化并编译成机器代码(有时也称为编译器)。

HTML和Javascript是解释型语言,它们被Web浏览器按原样读取,并经过最少的错误修复和优化来运行。


9
现代网络浏览器可以即时编译JavaScript,同时它们会将渲染后的HTML存储在内存缓存中,这类似于程序的JIT。 - Mechanical snail
有趣的是,Chrome的V8引擎以前无法解释JavaScript,并需要先将其编译为机器代码(JIT)。近年来,V8作为第一执行层已经具备了解释器。 - Ben Butterworth

8
从技术上讲,编译器将一种语言转换为另一种语言。由于JIT编译器以IL作为输入并输出本机机器二进制代码,因此它很容易符合这个标准,并应该被称为编译器。
关于Javascript,这里做出区分更加困难。如果你想严谨一些,就不存在所谓的“编译语言”或“解释语言”。我的意思是,实际上大多数语言都有一种常见的运行方式,如果那是一个解释器,它们通常被称为解释性语言,但解释或编译通常不是语言本身的特征。Python几乎普遍被认为是解释性的,但可以编写编译器将其编译成本机二进制代码;它仍然值得被称为“解释性”的形容词吗?
现在来到实际答案:Javascript通常由解释器运行,其中包括使用JIT编译器。那么它是解释还是编译?由你决定。

5

来自维基百科,即时编译器(JIT),也称为动态翻译器,用于提高计算机程序的运行时性能。

即时编译是将非本机代码(例如字节码)转换为本机代码,就在执行之前。JIT编译器是编译IL代码并输出缓存的本机代码的编译器,而解释器将逐行执行代码,例如在Java中,类文件是解释器的输入。

更多有关JIT的信息:

是的,HTML和JavaScript是解释型语言,因为它们没有被编译成任何代码。这意味着脚本在没有预先编译的情况下执行。

此外,这里有一篇很好的文章,介绍了JavaScript/HTML不是编译型语言。


2
JIT处理器像IL是编译器,大部分JavaScript处理器是解释器。我理解你对这个问题的好奇心,但我个人认为真的没有任何'正确'的答案。
有些JavaScript解释器为了效率原因编译部分或全部代码。这些真的是解释器吗?
JIT在运行时起作用,因此可以被理解为聪明而高度优化的解释器。它到底是哪种呢?
这就像“它是植物”还是“它是动物”的问题。有些生物并不完全符合其中任何一种模式:自然是自然的,而事物的“分类”是纯粹的人类智力努力,具有其局限性。即使是像“代码”这样的人造物品也受到相同的考虑。
好吧,也许有一个正确的答案:
处理JavaScript(比如5年前)的方式称为“解释器”。处理C++的方式被认为是“编译器”。
处理IL的方式只是...一个“JIT”。

如果JIT在堆栈上进行替换,我认为它是编译,代码不需要完全编译,只需要热点部分。 - bestsss
-1 "我开始认为其实并没有什么'正确'的答案。" 编译器进行部分特化就是正确的答案。 - J D

1

CLI(.Net字节码)具有本地CPU中找不到的功能,因此JIT绝对是编译器。与一些人在这里写的相反,大多数优化已经完成。


1

HTML不是编程语言,因此很难说它是否被编译或解释...就“编译结果是否被重用”的意义而言,任何浏览器都不会将HTML编译(每次页面呈现时都会解析)。

旧版浏览器中的JavaScript是解释执行的(预处理为中间表示形式,但不是机器代码)。最新版本的浏览器具有JavaScript JIT编译器-因此现在要定义它是解释还是编译语言变得更加困难。


0

JIT(即时)编译器是仅编译而不是解释器,因为JIT编译器在运行时将某些字节码转换成本地机器代码以实现高性能,但不执行指令。

相反,解释器在运行时读取并执行指令。

HTML和Javascript被解释,它们直接由浏览器执行,无需编译。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接