【问题标题】:Is JIT compiler a Compiler or Interpreter?JIT 编译器是编译器还是解释器?
【发布时间】:2011-07-01 17:49:07
【问题描述】:

我的问题是将 IL 转换为机器语言的 JIT 编译器究竟是编译器还是解释器。

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

提前致谢

【问题讨论】:

  • “编译”语言和“解释”语言之间没有硬性界限。在某些时候,所有源代码都必须翻译成机器代码(除非您正在编写汇编)。
  • 它在大部分部分(像大多数 JIT 一样)以混合模式运行,编译所有内容都是不必要的(例如,您的主要方法运行一次,没有必要编译它)。内部循环是编译的主要候选者。 Javascript 可以两者兼而有之,但现在大多是编译的。
  • 对不起,吹毛求疵,但在英语中..“怀疑”意味着您不相信某事是真实的,或者您不确定它是否真实。你问的是一个“问题”。可以说,如果你怀疑某事,你就会质疑它,但这并不意味着所有的问题都是怀疑。
  • @Mystere Man..编辑了问题..谢谢
  • @bestsss .NET CLR 对每个方法执行 JIT。单声道也是如此。另外,您为什么假设 Main 运行一次?程序可以任意调用 Main。

标签: c# .net compiler-construction interpreter jit


【解决方案1】:

JIT(即时)编译器是一个编译器。它进行优化以及编译为机器代码。 (甚至称为编译器)

HTML、Javascript 被解释,它们被 Web 浏览器按原样读取,并以最少的错误修复和优化运行。

【讨论】:

  • 现代网络浏览器可以 JIT 编译 Javascript。此外,它们将呈现的 HTML 存储在内存缓存中,这类似于程序的 JIT。
  • 有趣的是,Chrome 的 V8 引擎曾经无法解释 javascript,而 needed to compile it to machine code first (JIT)In recent years, V8 has had an interpreter as its first execution tier.
【解决方案2】:

从技术上讲,编译器将一种语言翻译成另一种语言。由于 JIT 编译器接收 IL 作为其输入并输出本地机器二进制文件,因此它很容易符合此标准,应该称为编译器。

关于 Javascript,在这里进行区分比较困难。如果您想学究气,则没有“编译语言”或“解释语言”之类的东西。我的意思是,实际上大多数语言都有一种通用的运行方式,如果那是解释器,它们通常被称为解释语言,但解释或编译(通常)不是语言本身的特征。 Python 几乎被普遍认为是解释型的,但可以编写一个编译器将其编译为本机二进制代码;它还值得“解释”形容词吗?

现在得到实际答案:Javascript通常由解释器运行,除其他外,解释器本身使用 JIT 编译器。那是解释还是编译?您的来电。

【讨论】:

    【解决方案3】:

    来自Wiki,just-in-time compiler(JIT),也称为动态翻译器,用于提高计算机程序的运行时性能。

    Just-in-time compilation 是在执行之前将非本机代码(例如字节码)转换为本机代码。JIT compiler 是编译 IL 代码并输出缓存的本机代码的人,其中如解释器将逐行执行代码,
    即在 java 的情况下,类文件是解释器的输入。

    更多关于 JIT 的信息在这里:

    是的,HTML、JavaScript 是解释性语言,因为它们不会被编译成任何代码。这意味着脚本无需初步编译即可执行。

    关于 JavaScript/HTML 不是已编译语言的 here 也是一本不错的读物。

    【讨论】:

      【解决方案4】:

      像 IL 这样的 JIT 处理器主要是编译器。 JavaScript 处理器主要是解释器。我理解您对这个问题的好奇心,但我个人认为确实没有任何“正确”的答案。

      出于效率原因,有些 JavaScript 解释器会编译部分或全部代码。那些真的是口译员吗?

      JIT 在运行时起作用,因此可以理解为一个聪明的、高度优化的解释器。是哪个?

      这就像“它是一种植物”或“它是一种动物”的问题。有些活的东西不太适合这两​​种模式:自然就是自然,对事物的“分类”是一种纯粹的人类智力努力,有其局限性。甚至像“代码”这样的人造事物也受到同样的考虑。

      好的;所以也许只有一个正确答案:

      JavaScript 的处理方式(比如 5 年前)被称为“解释器”。 C++ 的处理方式被视为“编译器”。

      处理 IL 的方式很简单...... 'JIT'

      【讨论】:

      • 如果 JIT 进行堆栈替换,我认为它是编译,代码不需要 100% 编译,只是热部分。
      • -1 “我开始认为真的没有任何‘正确’的答案”。编译器做部分特化是正确的答案。
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        HTML 不是编程语言,所以很难说它是编译还是解释......在“如果编译结果被重用”的情况下,任何浏览器都不会编译 HTML(它在任何时间页面被解析渲染)。

        旧浏览器中的 JavaScript 被解释(预处理为中间表示,而不是机器代码)。最新版本的浏览器具有 JavaScript JIT 编译器 - 因此现在很难定义它是解释型语言还是编译型语言。

        【讨论】:

          【解决方案7】:

          JIT (Just In Time) 编译器只是一个编译器而不是解释器,因为 JIT 编译器在运行时编译或转换某些字节码为本地机器码以获得高性能,但它不执行指令。

          而解释器在运行时读取并执行指令。

          HTML和Javascript都是解释的,浏览器直接执行,无需编译。

          【讨论】:

            猜你喜欢
            • 2016-11-19
            • 2020-10-27
            • 2012-08-28
            • 2017-10-13
            • 1970-01-01
            • 2020-06-20
            • 1970-01-01
            • 1970-01-01
            • 2010-10-06
            相关资源
            最近更新 更多