编译器和解释器的区别和联系

来源:互联网 发布:android 打开淘宝店铺 编辑:程序博客网 时间:2024/06/04 08:35
 

编译器和解释器的区别和联系

最近在看《编译原理》(龙书)和《C++ primer》,写点读书总结

        学过C/C++语言的同学都知道,写完的程序都要经过编译的过程,这其中就涉及到对编译器的理解,也许对于非计算机专业的人来说,没必要把其中的详细编译步骤了解清楚,但知其所以然似乎更好。

        Windows下比较主流的编译过程一般集成在集成开发环境VS中,在Linux下一般使用GNU(当然比较牛的人似乎都是用那种命令行的形式编译的,可惜我不是)。在VS中程序的执行过程包括:预处理(preprocessor)—编译(compiler)—汇编(assembler)—链接(linker)—加载(loader)。

         预处理的作用将分散在多个文件中的代码合并起来,#include语句就有此作用,在预处理中有可能用到宏(macros)。#include加入的头文件不能包含有定义语句,由于C++中变量和函数只能定义一次,而头文件是被加入到其他原文件中的,所以其中不能含有定义语句,否则会有重定义(redefinition)的错误,当然也有例外,类,const对象,inline函数可以定义在头文件中。

         编译的过程就是将源程序翻译成目标程序:源程序—编译器—目标程序,编译器还有报告源程序错误的作用。在生成了目标程序后,由我们的输入就可以生成相应的输出:输入—目标程序—输出,这也是诸多函数的调用形式。

        汇编就是将编译步骤生成的代码(在C/C++中.o格式文件),其一般是汇编语言代码,转化为计算机能够处理的机器代码,这个过程和上一步骤似乎很类似。

        链接是将分散在不同源文件中的代码组合起来,生成一个可以处理的大文件,例如,在VS中的多个源文件,通过单独编译后,可以链接成一个文件,然后通过加载器将其加载到计算机内存中,得到可执行文件(C/C++中的.exe文件)

        解释器是另外种形式的语言处理器,它相当于不生成上面的目标程序,直接将输入“放到”源程序中,然后经过解释器,就得到了输出。通常情况下,编译过程比解释过程更快,但解释器能够有更好的错误诊断,因为解释器是逐句进行解释的。学习过Python语言的同学都知道,Python是一种解释性语言,它的运行过程就用到了解释器。

        编译器和解释器可以结合起来进行处理,Java语言处理器就是其中的代表,其过程是源程序经过翻译器处理后得到中间程序,也被称作字节码(bytecode),然后和输入共同加入到虚拟机(virtual machine)的前端,得到输出,其前一部分用到编译器,后一部分用到解释器,这样做的好处是一个机器解释的代码可以应用在另外的机器上,甚至可以延伸到网络上。