编译原理之入门章
序言:
hello大家好,小哥哥的小葵花课堂又开课啦!!!相信学完编译原理,且深入懂得代码的编译原理后,你会从高级攻城狮摇身一变成为一个资深码农。如果不能,呵~呵~
OK,我们来看一下此章节要掌握的内容:
编译器,解释器,预处理器,汇编器,用C语言作为高级程序的底层编译语言的好处。
带着上面的疑问我们先来看一下历史由来:
如今,我们所看到的大多数软件,都是用高级程序设计语言(JavaScript,python,java,C++)编写的。我们知道计算机识别的语言是0和1组成的。它只认识0和1,可是0和1组成的东西复杂度那么高,人脑怎么编写?答案只有一个:脑残程序员精尽人亡
所以众多大神发明了方便人脑记忆的语言,如前端的JavaScript。这些高级程序设计语言(我们写的代码)必须翻译成0和1给电脑,才能在计算机上运行,所以有了编译器、解释器(JavaScript的底层就是解释器)。
编译器:完成你写的项目代码的翻译工作的软件系统。
实际上它就是一个程序,可以阅读你写的语言,并翻译成目标语言(计算机可识别的语言)的程序。
如java用到了编译器,java写的源程序首先被编译成字节码(bytecode)的中间表示形式,然后由一个虚拟机对得到的字节码解释执行,这样的好处是在一台机器上编译的字节码可以在另一台机器上解释执行,通过网络就可以完成机器间的迁移。
源程序 >>> 编译器 >>> 目标程序
解释器:直接利用用户提供的输入执行源程序中指定的操作
这是一个映射的过程,你写一句它映射一句。
如JavaScript,python等都是解释性语言
浏览器中包含了脚本的解释器所以我们的代码能在其中运行。其实XX器也都是一段程序编织的,比如它写了程序碰到<script>会怎样,那当页面进行翻译的时候遇到标签<script>就会解析。
输入 >>> 目标程序 >>> 输出
二者区别:
编译器就好似你写完的代码,经过webpack打包成了一个JS文件。它会将此JS文件翻译成计算机可识别的语言。(比解释器快)
解释器就是你在敲代码的过程中,它就将代码映射成目标程序可识别的语言,逐个语句执行源程序(错误诊断效果比翻译器好)
预处理器:
一个源程序(我们写的代码)可能被分割成多个模块。把这些模块聚合在一起的任务有时会由一个叫做预处理器的程序独立完成。
汇编器:
编译器可能产生一个汇编器(汇编语言程序)作为其输出和方便调试
链接器:
一个项目可能被分成多个部分进行编译,A文件引入B文件的代码,在编译成机器语言后也要保持这个位置关系(我们说这个B文件是可重定位的)。一个文件中的代码可能指向另一个文件中的位置,链接器能够解决外部内存地址的问题
加载器:
把所有的可执行目标文件放到内存中执行
如下就是一套宏观的编译过程:
源程序 >>> 预处理器 >>> 编译器 >>> 汇编器 >>> 链接器/加载器 >>> 目标机器代码