Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compiler construction 什么是复合指令?_Compiler Construction_Intermediate Language - Fatal编程技术网

Compiler construction 什么是复合指令?

Compiler construction 什么是复合指令?,compiler-construction,intermediate-language,Compiler Construction,Intermediate Language,我在中间代码一章中做类编译器设计。通过在线调查,我发现了这句话: 当源程序可以包含复合指令时,递归解释是必要的 我在谷歌上找不到什么是复合指令。这里有一个参考: 这里有一个参考: 来自 使用递归技术分析复杂表达式并构造语法树。From 使用递归技术分析复杂表达式并构建语法树。在本例中(请参阅),作者将其与他所称的迭代解释器进行对比,后者只读取并遵守每条指令,然后继续执行下一条指令,它必须对一系列指令进行分析,以找出执行指令的顺序 但是,在我看来,这篇材料的质量似乎有问题。在这种情况下(参见)作者

我在中间代码一章中做类编译器设计。通过在线调查,我发现了这句话:

当源程序可以包含复合指令时,递归解释是必要的


我在谷歌上找不到什么是复合指令。

这里有一个参考:


这里有一个参考:

来自

使用递归技术分析复杂表达式并构造语法树。

From

使用递归技术分析复杂表达式并构建语法树。

在本例中(请参阅),作者将其与他所称的迭代解释器进行对比,后者只读取并遵守每条指令,然后继续执行下一条指令,它必须对一系列指令进行分析,以找出执行指令的顺序

但是,在我看来,这篇材料的质量似乎有问题。

在这种情况下(参见)作者将其与他所称的迭代解释器进行对比,迭代解释器只读取并遵守每一条指令,然后继续执行下一条指令,它必须对一系列指令进行分析,以找出执行指令的顺序

但是,对我来说,这种材料的质量似乎有问题。

这有点不恰当

口译员:

用一种语言表示的程序,它执行用另一种语言表示的程序

有关口译员使用相同语言编写的情况,请参阅和

解释器编译源程序并立即执行

不,那将是一场灾难;JIT技术可由解释器使用,但也可用于减小已编译可执行文件的大小。真正的解释器不是JIT编译器

解释比已编译机器代码的执行慢

通常,尽管有时解释器可以使用完整的源代码进行比JIT编译器更好的优化

当源程序可以逐行执行时,迭代解释是可能的

如果不是,这也是可能的,除非他们使用“迭代解释”来表示“一次读一行源代码并处理它”,但后来他们有了 “一个[迭代]解释器[…]重复一系列的获取、分析和执行[…]在一个迭代循环中重复。”,所以不-一旦你解析了输入并进行了一些处理,你就可以很好地处理它

命令语言的解释器可以是迭代的

没错,但在这方面没有什么特别之处。任何语言都可以使用迭代或递归方法进行解释

当源程序可以包含复合指令时,递归解释是必要的

您可以将任何递归过程映射到具有显式堆栈的迭代过程,因此递归实现从来都不是严格必要的

我假设这和复合词的表达式是一样的,主要是因为这是唯一有意义的方法

如果您的解释器可以看到:

z = a + 5
然后,对于表达式
a+5
,它可以查找
a
的值,并知道常数
5
,然后它可以计算
a+5
,并将结果存储在
z

如果表达式为:

z = a + ( b * c )
然后它可以查找
a
的值是什么,但要计算
b*c
它必须递归调用自己,或者将
z=a+pop()
推到堆栈上并计算
push(b*c)

对于使用迭代解释器解释复合术语的表达式,可以使用临时变量将源转换为线性形式,因此:

z = a + ( b * c )
变成:

temp = b * c
z = a + d
因此,所有具有复合项的表达式都可以简化为非复合项。通常这种转换是在代码到达解释器的主循环之前完成的,从而使主循环更简单、更快

高级语言的解释器必须是递归的

错误,见上文

查询语言的解释器必须是递归的

错误,见上文

递归解释比迭代解释慢

一般来说是正确的,但我确信如果你寻找它们,会有一些例外。

这有点不恰当

口译员:

用一种语言表示的程序,它执行用另一种语言表示的程序

有关口译员使用相同语言编写的情况,请参阅和

解释器编译源程序并立即执行

不,那将是一场灾难;JIT技术可由解释器使用,但也可用于减小已编译可执行文件的大小。真正的解释器不是JIT编译器

解释比已编译机器代码的执行慢

通常,尽管有时解释器可以使用完整的源代码进行比JIT编译器更好的优化

当源程序可以逐行执行时,迭代解释是可能的

如果不是,这也是可能的,除非他们使用“迭代解释”来表示“一次读一行源代码并处理它”,但后来他们有了 “一个[迭代]解释器[…]重复一系列的获取、分析和执行[…]在一个迭代循环中重复。”,所以不-一旦你解析了输入并进行了一些处理,你就可以很好地处理它

命令语言的解释器可以是迭代的

没错,但在这方面没有什么特别之处。任何语言都可以使用迭代或递归方法进行解释

当源程序可以包含复合指令时,递归解释是必要的

您可以映射任何递归过程
temp = b * c
z = a + d