解释器和编译器的工作原理有何不同?它们之间的区别是什么?
编译器
编译器是最早被开发的翻译程序。原理很简单:你写好程序,然后将其交给编译器进行翻译。接着你运行翻译后的程序。
解释器
解释器同样是一种将高级语言翻译成低级语言的程序,但它是在程序运行时才进行翻译的。你使用文本编辑器或其他类似工具编写程序,然后指示解释器运行该程序。解释器一次处理一行程序代码,先翻译第一行并运行它,再翻译第二行并运行它,以此类推。
编译器的特点:
解释器的特点:
Usage
解释性编译器
解释性编译器是编译器和解释器之间的一个很好的折衷方案。它将源程序转换成虚拟机器码,然后进行解释。
解释性编译器结合了快速翻译和相对快速的执行,前提是:
示例:JDK为Java提供了一个解释性编译器。
区别与工作原理
问:编译器和解释器用于什么?
答:大多数程序都是用高级语言编写的(如c#、java...)。 高级语言包含易于理解的单词和短语。 另一方面,计算机(截至我写这篇文章的时候)只能理解二进制/机器码,即0和1。 因此,我们需要将高级代码转换为源代码(机器码/二进制)。 因此有了“转换”这个词。
因此,我们可以得出结论:编译器/解释器的工作是将高级代码转换为机器码。
但两者在“翻译”代码的方式上有所不同
区别:
编译器:
将源代码转换为某种中间形式。 对于静态语言,编译器通常将源代码转换为汇编语言,该汇编语言通常不会存储到磁盘中,然后调用汇编器将汇编语言转换为二进制代码,该二进制代码通常存储为对象文件(.o或.obj后缀),然后链接器被调用以将对象文件链接到二进制可执行文件上。 还常常将编译,汇编和链接的整个过程称为编译。 因此,您可以将gcc称为编译器,但实际上它会调用cc1来编译,as来汇编,ld来链接。
解释器:
具有中间字节码形式的语言,源代码首先被转换为字节码,这个过程可以称为编译,javac就是一个例子。字节码不能在主机上运行,需要一个程序(从操作系统的视角来看,实际上是进程)将字节码解释为主机,这个程序称为解释器,比如java。一些语言,如Python,使用单个程序执行编译和解释工作
比较
解释器
- 分析源代码所需时间较短,但总体执行时间较慢。
- 不生成中间目标代码,因此内存效率高。
- 持续翻译程序,直到遇到第一个错误为止,此时它停止。 因此,调试很容易。
编译器
- 分析源代码所需时间较长,但总体执行时间相对较快。
- 生成中间目标代码,进一步需要链接,因此需要更多内存。
- 只有在扫描整个程序后才生成错误消息。 因此,调试比较困难。
— 来自:https://www.programiz.com/article/difference-compiler-interpreter
语言示例
解释型
编译型
看看PLAI这本书,我发现它是最好的动态语言实现入门:
编程语言:应用与解释 (c) Shriram Krishnamurthi
这本书以在Scheme(dr.Racket)中编写动态语言解释器为中心,使用它,您可以为任何语言编写自己的解释器,并添加一些关于OOP的提示。
还有SmallTalk和SOM:Simple Object Machine:
所有现代解释器都包含编译器:将高级元素编译成低级但可移植的字节码,或使用JIT将其编译成机器代码到RAM中。
附注:如果有人想在Python上编写SmallTalk系统,请通知我。