是的是的。这是关于编译器和 PL 解释器之间区别的另一个问题。只有通常给出的答案不能让我满意。
通常他们说编译器将一些 PL 中的代码翻译成可执行代码,并且在执行时,代码立即由处理器直接执行。在解释器的情况下,在程序执行期间,一个特殊的程序,即解释器,逐行读取程序的源代码并执行它。一步步。同时,据说编译器还没有那么好写。
其实问题是这样的。如果结果执行了程序,那么当立即执行机器代码时本质上有什么区别,或者首先解释器对源代码执行某些操作,然后才执行它——结果,处理器执行相同的机器指令。那有什么区别呢?显然,不是编译器提前把机器码存到文件里,而是解释器没有)好吧,假设我理解用ifs解释程序时,有些部分永远无法执行,因此没有翻译成机器码代码。但是,同样,这可能不是问题所在,很难将所有 if-s 提前翻译成机器代码,即编译代码。
简而言之,与解释器相比,实现编译器的其他区别和复杂性是什么?
有两个区别:
解释器不生成机器代码。相反,它为它解释的每个命令调用一个特殊函数(它是解释器代码的一部分),它完成所有工作。
编译器(常规编译器和 JIT 编译器)首先生成机器代码,然后将其提供给处理器直接执行。
编译器一次完成所有工作(当程序被汇编时),而解释器每次读取下一条指令时都这样做。也就是说,在编译时,执行开销较小,因此最终代码的速度较高。
现在关于编译器实现的复杂性。解释器简单地获取并执行下一个程序表达式;当它这样做时,它会立即忘记它(当然,在保存结果之后)。编译器被迫更全局地思考:有优化和实体的模块间导入/导出(毕竟,一个程序可以包含许多源代码文件)。此外,编译器必须遵守与其他工具(例如链接器)交互的某些约定和标准;解释器是一个“自成一体”的东西,它自己完成所有工作。
“编译器和解释器”不是一个正确的问题。事情完全不同了。编译器——将源代码转换为可执行文件(将由处理器执行的机器代码或将由虚拟执行环境执行的一些中间代码)。解释器执行源代码。看到不同?编译器转换(compiles),解释器执行(interprets)。也许您想以不同的方式提出问题:编译语言和解释语言之间的区别是什么。区别很明显:后者可以按原样执行,不需要额外的工具。好吧,总的来说,我会试着总结一下:最后,是的,最后我们改变了处理器的状态,一个真正的物理处理器,任何程序的执行都归结为这个。但也有区别:1)编译型语言需要特殊工具(编译器),最终产品受到部分保护,很难获得源代码,最终产品更紧凑,因为它由二进制指令组成,而不是人类可读的单词. 最终产品执行速度更快——因为它描述了目标平台直接支持的指令。2) 解释语言按原样执行——不需要额外的。用于达到最终状态的工具,不受保护-任何人都可以窃取和更改....我知道我写了显而易见的东西。我只是不明白你还想听什么。最终产品执行速度更快——因为它描述了目标平台直接支持的指令。2) 解释语言按原样执行——不需要额外的。用于达到最终状态的工具,不受保护-任何人都可以窃取和更改....我知道我写了显而易见的东西。我只是不明白你还想听什么。最终产品执行速度更快——因为它描述了目标平台直接支持的指令。2) 解释语言按原样执行——不需要额外的。用于达到最终状态的工具,不受保护-任何人都可以窃取和更改....我知道我写了显而易见的东西。我只是不明白你还想听什么。
如果关于复杂性,那么编译器和解释器可能同样难以编写。如果语言很复杂,那么无论出于何种目的执行或编译,无论如何都很难将其解析为标记。好吧,只有在编译器总是有任务将指令转换为某种不是您发明的规范形式的那一刻