编译器用于将源代码转换为可执行机器代码,而解释器是另一种可以提供类似功能但机制不同的程序。
解释器不会转换源代码,而是直接执行源代码或使用称为中间代码。此代码又称“字节码”,是独立于平台的源代码低级表示形式。字节码可充当人类可读源代码和机器代码之间的中介,专为虚拟机 (VM) 执行而设计,而非基于计算机硬件运行。
理论上,任何编程语言都可以通过编译器或解释器来执行。然而,个别编程语言往往更适合编译或解释。
在实践中,编译器语言和解释器语言之间的区别有时会模糊不清,就像编译器和解释器本身的区别一样,因为这两类程序的功能可能会重叠。虽然有些语言更常被编译,有些语言更常被解释,但可以为通常执行解释的语言编写编译器,反之亦然。
高级语言的创建通常考虑一种转换类型(编译或解释),但这更多的是建议而不是硬性限制。例如,BASIC 通常被称为解释性语言,而 C 是编译性语言,但就像有 C 解释器一样,BASIC 也有编译器。
解释器和编译器之间的主要区别在于时机和优化。这两类程序都尝试将源代码转换为可运行且可优化的目标代码。
根据操作环境的不同,考虑到硬件能力、内存和存储能力,已编译或已解释的代码可能更适合高效运行。基于任何特定程序、应用程序和硬件的限制,编译、解释或两者的结合运用都能产生最佳结果。
因此,解释不能完全代替编译,但它可以通过一个逐步转换的过程,将编译职责移动到后台。编译器采用提前 (AOT) 转换策略,在创建可执行文件之前将源代码完全转换为目标代码。
另外,解释器可以根据应用程序的需求直接运行代码,或使用字节码作为中介以输出虚拟机可执行源代码。借此,解释器或许能提升速度或灵活性,但在执行堆栈的最终阶段仍需提供可直接执行的机器指令集。
在某些情况下,当轻量级效率为优先事项时,特殊解释器由于执行即时 (JIT) 转换的能力而比编译器更可取。JIT 这种策略是将源代码片段编译成目标代码并放入内存缓冲区,以便立即执行。JIT 解释按需编译代码,将传统编译器的一次性编译效率与重复执行代码的灵活性相结合(通常比标准字节码解释器更快)。
然而,随着 JIT 编译的现代趋势的兴起以及依赖于情境的字节码解释的出现,许多编译器被设计为同时提供编译和解释功能。这种重叠进一步模糊了这两个类别之间的界限。
友情链接:
©Copyright © 2022 2006年世界杯歌曲_冰岛世界杯排名 - guoyunzhan.com All Rights Reserved.