上周买了一本《编译原理》,这周开始看,刚开始都是一些概念的东西,读起来有些乏味,但是还算能读的懂^_^,相信后面的章节就是极度的让人费解··总感觉看这种技术的东西,就像过眼云烟,当时看的时候可能会有些理解,但是过一段时间再回来看的时候,发现又是在预习···所以还是画点时间写个读书笔记吧···对自己有用,或者对别人也能起到作用。OK,开始记录一些概念吧····
何为编译器:根据自己的理解就是把源代码变成机器码的工具。哈哈,看看书上怎么说的,总结一下就是:将某种程序设计语言翻译成一种能够被计算机执行的形式的软件系统称为编译器。
说到编译器,还有另外一种语言处理器必须要拿出来说一下,那就是解释器。
解释器的百度百科定义是:是一种电脑程序,能够把高级编程语言一行一行直接转译运行。解释器不会一次把整个程序转译出来,只像一位“中间人”,每次运行程序时都要先转成另一种语言再作运行,因此解释器的程序运行速度比较缓慢。它每转译一行程序叙述就立刻运行,然后再转译下一行,再运行,如此不停地进行下去。
这样的定义会不会立马让你想到shell脚本的第一行经常出现的#!/bin/bash ,这个就是在告诉操作系统用哪一种解释器,^_^··有点意思,想一想shell脚本的执行··一下子明白了解释器的某些特性。不需要编译···一句一句的“解释”运行,这就是解释器的作用嘛··
-----继续回到编译器,有个小题目说为什么编译器产生汇编语言而不是机器语言的好处是什么?考虑了一下,编译器最后不就是输出机器码么···0 0 ·再看看编译的完整结构,这里的编译器应该说的是结构中的一个步骤而已。。。如果是这样,那么这是为什么呢···看看网上怎么说的,
①方便调试和优化,这时就能想到IAR或者keil等工具debug的时候会有一个debug窗口,里面都是汇编····^_^··联想上去这就好理解了,机器码都是0101001的···就不是给人看的·如果需要做编译优化的话,相信优化一大堆的010101····是任何人都不想干的···而汇编相对就好多了··至少也是个助记符吧··
②不做重复劳动。貌似很有道理!!!如果直接把高级语言翻译成机器码···这不是又得需要一批人把高级语言与机器码做一个映射·····以前人家做的汇编语言与机器码的活···还得再来一遍··不太好,哈哈
③减少编译器设计的复杂度。从汇编到机器码的转换可以通过硬件来实现,那么软件上可以少做这个工作,减少编译器设计的复杂度···确实,技术本来就来相互融合使用的····
继续····编译器的结构:分析部分(前端)+ 综合部分(后端)
分析部分有:词法分析+语法分析+语义分析。
综合部分有:代码生成器+优化器
来个例子分析一下:
nResult =nNow*20 ;
很简单的一条语句,词法分析之后:<id ,1 > <=> <id ,2 > <*> <20>
仅仅将变量以及符号换成词法单元····然后语法分析将根据上面的结果创建一个语法树,语义分析将会检测语法树中的错误罗···例如数组的下标必须是整数···这个阶段将会检查,这个阶段还会进行类型的自动转换··int * float都会自动换成float··等等
然后就是中间代码生成器。一些比较牛X的翻译技术就是用在这一段了··目前还不了解啥啥啥的技术···后面再慢慢说···中间代码的形式多种多样··视特定的编译器而定····
然后就是代码优化。高级语言转换成语法树、然后生成中间代码··中间代码中(前面提到为什么要先生成中间代码···o(∩_∩)o 哈哈··这不就是在优化么·····)可以做大量的优化工作,这也依赖于优化的算法····牛X的算法再次不知道··此处略过···优化之后就生成了更短的指令序列···
最后就是代码生成罗········
最后列举一下常用的编译器构造工具:
语法分析器的生成器、扫描器的生成器、语法制导的翻译引擎、代码生成器、数据流分析引擎、编译器构造工具集。
说了这么多乏味的概念·······最后来个笑话来放松一下吧····
青年:“我想要有很多钱。”
禅师:“只要你能找到七个球,你的愿望就能会实现。”
青年:“您是说七龙珠吗?”
禅师摇摇头:“不,是双色球…”