编译器
什么是编译器?它是一种系统程序,负责将高级语言程序翻译成机器语言程序,也就是由二进制表示的程序。但是我们一般说的编译器是特指将高级语言翻译成汇编语言的那个程序
什么是编译系统?这个从CSAPP给出的定义就是从高级语言源文件,例如.c、.cpp等,一直到变成目标程序(windows下的exe文件)。在这过程中所有用到的程序,他们组成了一个一个系统,我们称为编译系统。具体的包括1.预处理程序 2.编译器(也叫编译程序) 3.汇编器(也叫汇编程序) 4.链接器(也叫链接程序)
编译(特指编译系统,不是指编译器)过程:例如c语言源文件程序,以.c为扩展名,他的编译过程一般有hello.c(c语言书写的文本文件)——>预处理include (预处理指令以#开头,比如#include“stdio.h”,预处理时就是将stdio.h这个页面的内容复制到你写#include“stdio.h”代码的地方)——>生成hello.i(还是文本文件,不过添加了一些前面说到的别的页面的代码)——>编译程序(也叫做编译器)来编译——>生成hello.s(此时是汇编语言文件,也是文本文件,其内容是助记符,不过熟悉的扩展名应该是.asm,就是assembly)——>汇编程序来汇编——>生成hello.o(.o就是obj的缩写),此时已经是二进制文件了,因为汇编程序负责将由助记符表示的汇编语言文件翻译为机器语言文件,同时这个文件也成为可重定位文件,一个c语言项目有多个.c扩展名文件,也就是多个源文件,每个源文件单独预处理,编译,汇编生成各自的obj文件——>然后将这些可重定位文件(.o的扩展名)和库函数(比如printf.o)通过链接程序链接——>生成可执行文件hello.exe,此时他还是一个二进制文件,同时这个文件我们称为目标程序。
总结:将生成的可执行文件放入外存之中,当需要执行时调入内存,CPU可以直接执行,因为他已经是二进制机器语言文件。所以执行速度很快,所以c语言程序只需一次编译,生成可执行文件,而后每次执行只需调入可执行文件直接执行即可。
缺点: 一般不同的OS有不同的编译器,所以相同的源代码换到不同的os上编译可能错误或者实现的功能有差异,所以换到不同的os上,可能要修改源代码,所以跨平台性要差一点。
补充一下编译和汇编的区别: 一般我们说编译上将高级语言翻译成机器语言的过程,但是我们这个过程中,编译就是将高级语言翻译成了汇编语言。这个问题我查了一下,编译既可以直接从高级语言到机器语言,也可以从高级语言到汇编语言,所以记住有两种情况即可,不必要咬死某一种。
解释器
也是一种用于翻译的程序,他的特点是边翻译边执行。
具体过程: 其实解释型语言,比如Java,一般也是先经过编译的。hello.java通过编译器编译生成字节码文件hello.calss;不同的编译器生成的.class文件也不同。然后我们将字节码文件交给jvm虚拟机,也就是解释器,由jvm虚拟机负责解释一句并执行一句,直到执行完毕。
总结: 在不同的os上我们安装该os对应的解释器,然后由解释器解释并执行,所以我们不必修改源代码,只需要在对应OS安装对应的解释器就行了,所以跨平台性较好,但是相对于c这种编译型语言写成的程序执行起来速度要慢很多。