当前位置: 首页 > 知识库问答 >
问题:

编译器与解释器

陶英纵
2023-03-14

那么,让我看看我是否明白了这一点。

>

  • 当我们说编译器和解释器之间的区别时,解释器将高级指令翻译成中间形式,然后执行。[我认为编译器也将高级指令翻译成中间形式,但此刻它生成目标代码而不是执行它,对吗?]

    解释器一次读取一条指令或一行的源代码,将该行转换为机器代码并执行它。[解释器本身不会将代码转换为机器代码,它会使用ist自己的预编译函数评估指令(在解析之后)。例如,高级语言中的Add表达式将使用之前编译的解释器add函数进行评估,对吗?]

  • 共有3个答案

    夏骏
    2023-03-14

    关于(1)你是对的。

    Ad(2),解释器不需要一次读取一条指令的源代码,因为在解释包含循环的代码时这太昂贵了。更有可能的是,它读取整个表达式、语句、函数甚至源文件,将它们转换为中间格式并对其进行评估。

    请注意,编译器和解释器都不需要在任何时候生成机器代码;许多编程语言,包括Java、Python,以及Prolog等较旧的编程语言,通常被编译为虚拟机字节码。在Python和Prolog中,“解释器”通常是组合的字节码编译器/字节码解释器。

    我所知道的关于编译和解释的最好介绍是SICP的第4章和第5章,这两章从讨论一个非常简单的解释器开始,并不断改进它,直到它成为一个成熟的编译器。

    翁翰墨
    2023-03-14

    我同意第一种说法,尽管解释器一次只工作一行并不一定是真的(它可以根据对整个代码的了解进行优化)。

    第二个我认为有点不对劲:编译器确实创建了“机器代码”(对于JVM来说,可能是字节码)。解释器根据输入执行自己程序的部分(到目前为止与编译器相同),执行的部分正在执行输入中描述的计算(而不是执行计算来计算所需的机器代码)。

    可以模糊两者之间的界限,因为编译器可以生成将在执行时解释的代码(根据编译时不可用的因素提供运行时优化)

    严阳成
    2023-03-14

    关键区别在于:解释器在运行源代码时处理源代码。它不会将源代码转换为机器代码,它只是使用自己的代码来完成源代码的指示。编译器将源代码转换为可以直接运行的机器代码。

    并非所有编译器都与执行过程分离。例如,大多数Java运行时都包含一个“JIT编译器”,它可以根据需要在Java代码运行时编译Java代码。

    你可以在两者之间做一些事情。从本质上讲,可以首先使用类似于编译的过程将源代码转换为更小、更易于解释的代码。然后可以解释此编译输出。(例如,第一个过程可以将“if”转换为53,“else”转换为54,“For”转换为55,依此类推——这将使解释器不必在实际不处理字符串的代码中处理可变长度的字符串。)

     类似资料:
    • 问题内容: 为什么我们说Java是一种编译和解释语言? (编译和解释)这样做有什么好处? 问题答案: Java在编译时被编译为中间的“字节码”。这与像C之类的语言在编译时被编译为机器语言相反。Java字节代码无法像编译的C代码那样直接在硬件上执行。相反,字节码必须在运行时由JVM(Java虚拟机)解释才能执行。像C这样的语言的主要缺点是,当编译该二进制文件时,该二进制文件将仅在一种特定的体系结构(

    • 翻译的结果是什么?它会把高级语言变成汇编语言还是机器语言,即二进制代码? 如果是后者,这是否意味着解释语言与介绍集没有关系? 一种语言只能有一个口译员?是因为解释器不做任何优化,所以我们不需要找到更好的解释器吗?

    • 问题内容: 我正在学习Java,以下内容对我来说有些混乱。我了解的是: Java编译器 →Java编译器仅将程序转换为文件,这意味着将我们的源代码转换为字节码(这是使Java平台独立的虚拟机(JVM)的操作码的列表)。 Java Interpreter →仅“解释”代码,而 没有 将其转换为本地机器代码。它将一条字节码的每条指令作为一条命令一一执行并执行,而不管同一条指令出现多少次。这就是为什么它

    • 我正在学习Java,下面的事情让我有点困惑。我的理解是: > Java编译器→Java编译器只是将程序转换为文件,这意味着将我们的源代码转换为字节码(它是虚拟机(JVM)的操作代码列表,使Java平台独立)。 Java解释器→只是“解释”代码,而不是将其转换为本机机器代码。它将字节码的每一条指令作为命令逐一执行并执行,而不管同一条指令发生多少次。这就是为什么它很慢,Java引入了JIT概念。 JI

    • 在我参加的一个reactJS会议上,演讲者使用了一个术语转译器来进行一些代码转换/移植。当涉及到将语言代码转换为计算机系统/机器上的可运行形式时,我总是使用和听到术语编译器和解释器。转译器对我来说是新的。转译器与编译器或解释器有什么不同,为什么真的需要它?

    • 问题内容: 我正在构建一个专用的嵌入式Python解释器,并希望避免依赖于动态库,因此我想改用静态库来编译解释器(例如,不编译)。 我还想静态链接Python标准库中所有的动态库。我知道可以使用来完成此操作,但是有没有一种替代方法可以一步完成呢? 问题答案: 我发现了这一点(主要是关于Python模块的静态编译): http://bytes.com/groups/python/23235-buil