白话编译原理

      为什么要有编译系统:

      计算机发展初期,程序员或从事计算机科学的人要让计算机代替人去完成大量的计算工作,就得让计算机知道我们要做什么。刚开始使用机器将纸带打孔然后让计算机读取获取二进制数据和指令完成计算,后来可以直接用二进制编写程序让计算机执行,不过对于人类大脑来讲二进制程序不方便阅读和理解,后面就发明了汇编语言,一种用标识符来代替二进制指令的低级语言来编写程序,然后在用汇编编译系统编译成二进制数据让计算机执行。但毕竟汇编是直接操作cpu指令的语言,也是不方便人类正确快速的表达算法,后来就发明了c语言 c++ java等高级语言,越来越接近人类大脑的思维逻辑,大大提高了变成速度和降低了出错率。随着变成语言越来越接近人的思维模式,更方便更直接,编程语言却里机器越来越远,人们给高级语言赋予了函数 过程 面向对象 作用域等概念,但计算机只知道从寄存器或内存获取 数据然后计算并存储,这就是计算机所能做的。所以编译系统的工作就是将我们所熟悉使用的编程语言所表达的意图转换成计算机可以理解的二进制程序,让计算机理解并执行。

 

     为什么要学编译原理:

     从微观上来看学习编译原理才能明白程序在机器上的执行过程,为我们能够写出高效率的程序提供必要的知识背景,让我们能够返璞归真的认识到编程语言。

     从宏观上来看学习编译原理能让我们学习到很多解决问题的方法和思路,这和其他学科的意义是一样的,从表面上去看本质。还有助于我们更好的了解计算机科学发展的历程。

 

     编译系统简述:

      当我们用c java 或php 等一切高级编程语言写的程序只是我们用这种语言来表达我们要实现的业务逻辑的源程序,编译系统就是要将这些源程序编译成计算机所认识的二进制程序以执行。总共分以下几个步骤。

      词法分析:就是将我们的源程序从左到右扫描,把其中的注释以及空白无用的字符都去掉,将源程序中出现的运算符 标识符 赋值  括号 之类的都识别出来,组成下一步可识别的字符串,并将变量名注册到一个符号表的数据结构中。

      语法分析:语法分析器接收上一步词法分析的结果,将这个结果中的字符串组词成句,输出一个可以表达正确的计算顺序的程序结构。这期间将变量的属性结构以及所需要占用的内存字节数以及相应的偏移地址都更新到了符号表中。

      中间代码生成:因为计算机不同的cpu有不同的指令集,所以为了提高程序的可移植性,先将语法分析器分析出来的程序执行结构转换为中间代码,然后在代码生成阶段根据具体的指令集转换成适合当前计算机的可执行代码。

      代码优化:这个阶段将没有用的代码删除掉,将循环中不变的计算表达式提到外面以避免重复的计算 等一系列方式来优化中间代码。

     目标代码(可执行代码)生成:这个阶段根据中间代码以及符号表中的数据以及当前计算机的指令集来转换成二进制程序。生成目标代码这个阶段也可以做代码优化,比如常用的元素就放到cpu寄存器中 选用更合适的cpu指令 比如自增 如果cpu支持inc自增指令 就会选inc 而不是mov add

 

posted @ 2013-10-16 08:24  阿正-WEB  阅读(2092)  评论(1编辑  收藏  举报