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

编译器和解释器对内存效率的影响

汝开畅
2023-03-14

我理解了编译器和解释器的概念。我在互联网上对此进行了研究,但我发现有两种说法倾向于矛盾:一种说法是——解释器不涉及中间代码,因此内存效率高。

https://www.programiz.com/article/difference-compiler-interpreter

另一种说法是:解释器从输入中读取一条语句,将其转换为中间代码,执行它,然后按顺序获取下一条语句。https://www.tutorialspoint.com/compiler_design/compiler_design_overview.htm

谁能告诉我哪一个是正确的,哪一个是内存有效的?

共有2个答案

弘和同
2023-03-14

简而言之,这两篇文章都不对。两者都有一个非常狭窄的(老式?)解释器的概念,对应于我们可以称之为“命令处理器”的东西。此外,这两篇文章都不是自相矛盾的,因此试图解决他们的分歧可能是浪费时间。

这就是说,当programiz引用说“没有生成中间目标代码,因此内存高效”时,我认为它的意思是(使用其术语)解释器确实将语句翻译成中间代码(请注意,“图:解释器”包括一个标记为“中间代码”的框),但是:

  1. 该代码不是目标代码。
  2. 执行该代码后,它会丢弃它,因此它永远不会一次在内存中拥有多个语句的代码。
  3. 解释器不产生目标代码作为输出。

考虑到这一点,这两篇文章或多或少是一致的。

但即使给出了“解释器”的狭义定义,说它是“内存有效的”,仅仅是因为它一次最多在内存中保存一条语句的中间代码,也忽略了解释器本身占用的所有内存。

此外,请注意,这只能谈论解释器本身的内存效率,而不是它运行的任何程序的内存效率。

简而言之:忘掉那些文章吧。维基百科的文章似乎是一个很好的开始。

颛孙天宇
2023-03-14

编写解释器的方法有很多。上述两种选择都是可能的,但有不同的权衡。

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

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

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

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

  • 那么,让我看看我是否明白了这一点。 > 当我们说编译器和解释器之间的区别时,解释器将高级指令翻译成中间形式,然后执行。[我认为编译器也将高级指令翻译成中间形式,但此刻它生成目标代码而不是执行它,对吗?] 解释器一次读取一条指令或一行的源代码,将该行转换为机器代码并执行它。[解释器本身不会将代码转换为机器代码,它会使用ist自己的预编译函数评估指令(在解析之后)。例如,高级语言中的Add表达式将使用

  • 所有编程语言都被翻译成机器代码,然后由硬件解释器执行。但是什么翻译译码器的代码,例如编译器代码和解释器代码?编译器翻译源代码,但编译器也用某种语言编写,那么什么翻译编译器代码/代码呢? 谢谢