【问题标题】:interpreter for interpreted language and compiler解释语言的解释器和编译器
【发布时间】:2016-03-18 12:37:41
【问题描述】:

解释器的结果是什么?会不会把高级语言变成汇编语言或者机器语言,也就是二进制代码?

如果是后者,这是否意味着解释语言与引言集没有关系?

一种语言只能有一个解释器?是不是因为解释器没有做任何优化,所以我们不需要找更好的解释器?

【问题讨论】:

    标签: compiler-construction interpreter


    【解决方案1】:

    解释器的结果是什么?

    解释器的结果是解释程序的结果。所以如果你有程序print "hello",运行解释器的结果就是“hello”被打印到屏幕上。

    这就是解释器与编译器的区别,编译器的结果将是一个可执行文件,并且只有在运行该文件时,“hello”才会打印到屏幕上。

    会不会把高级语言变成汇编语言或者机器语言,也就是二进制代码?

    它可能(如果您对“解释器”的定义包括 JIT 编译器),但通常解释器只产生中间字节码,然后解释它而不产生汇编或机器码。而且基本解释器可能不会生成任何类型的代码,而只是直接执行源代码。

    如果是后者,这是否意味着解释语言与引言集没有关系?

    (我假设您的意思是指令集)。

    如果解释器生成汇编代码或机器代码,它必须关心运行它的 CPU 的指令集。如果没有,就不会。

    一种语言只能有一个解释器?

    不,同一种语言可以有许多不同的解释器和编译器,只要人们愿意编写。一种语言有多个解释器并不罕见。

    是不是因为解释器没有做任何优化,所以我们不需要寻找更好的解释器?

    没有。解释器可以并且确实执行优化,但通常比编译器执行的要少,因为由于没有单独的编译步骤,任何花费在优化上的时间都会增加程序的启动时间。

    【讨论】:

    • 如果解释器只生成字节码而不是汇编代码,它是否也可以在不使用寄存器的情况下进行算术工作?
    • @Jutta 是的,解释器不会以任何方式显式地与 CPU 寄存器交互。但是当然解释器本身很可能会被编译成机器码,所以值在某些时候仍然会出现在寄存器中。
    最近更新 更多