当前位置: 首页 > C, C/C++ > 正文

一个程序的编译过程

                                                                                 程序的编译与链接(程序员的自我修养第二章)

        程序从源代码到可执行文件一般需要以下的几个步骤:

        源代码——–》扫描器——-》记号翻译—–》语法分析——-》语法树——》语义分析器—-》语法树(类型确定)——-》源代码优化—–》中间代码——–》代码生成器———》目标代码——-》目标代码优化——》最终目标代码

        源代码阶段:

                源代码阶段就是用文本编辑器写成的源文件。

        扫描阶段:

               扫描器使用有限状态机算法将源代码变成一个一个的记号。将记号分类,关键字,标识符,字面量和特殊符号等。

        语法分析阶段:

                将对由扫描器产生的记号进行语法分析,从而产生语法树,整个过程采用了上下文无关语法的分析手段(下推自动机什么鬼),语法树就是以表达式为节点的树,语法分析器也叫‘编译器的编译器’。

       语义分析阶段:

             语义分析器一般进行静态的语法分析,同时他并不在意语法有没有错误,比如两个指针相乘,虽然是违法的但是这个阶段并不进行修改。并且一般这个阶段进行的是静态语义分析通常包括声明和类型的匹配,类型的转换。不处理动态语义,动态语义一般指在运行阶段出现的问题,比如使用0做除数是一个运行期语义错误。接着生成语法树这时语法树的已经包含类型。

        源代码优化:

              对源代码进行优化,在不同的编译器可能会有不同的表现,比如2+6 这个表达式就在此被优化成8,等等一系列的优化还有些比较复杂的优化,这个时候语法树被转化成中间代码。应该已经通过某种遍历的手段转化成为了中间代码,它是语法树的顺序表示中间代码的类型有三地址码,比如说Z=X+Y,就是经X,Y的地址内容相加然后符给Z的地址,这就是三地址码。我觉得这更像是颗二叉子树。由此可见,语法树应该也是一颗二叉树(有的说平衡树)。

       目标代码生成与优化:

              源代码级优化器产生中间代码标志着下面的过程属于编辑器后端。编译器后端主要包括代码生成器和目标代码优化器。

              代码生成器:

                            代码生成器将中间代码转化成目标机器代码,这个过程十分依赖平台,因为不同的机器产生的机器代码都是不同的(比如子长,语法规则,对于每一种数据类型的长度确定等等),现代CPU 和高级语言都更加的复杂,所以编译过成也更加复杂。虽然到这里基本的目标代码生成了,但是有些东西还是不能确定,比如说一些数组的首地址等等,这些东西都只能在运行的时候才能确定,其实这里就有点体现内存条为什么叫随机存储器了,首先,内存条每次断电时内部的东西全部消失,在程序运行时,每一个内存单元的内容又是不确定的,代码编译好之后开始运行,每一次它的每个地址又是不同的,所以说内存条叫随机存储器。(扯远了)

              代码优化器:

                     优化器所要作的就是选择合适的寻址方式,使用位移来代替乘法,除法运算等等。

最后进行链接成为可执行文件

        

       

版权声明:本文为博主原创文章,未经博主允许不得转载。

]]>

本文固定链接: http://zmrlinux.com/2015/06/16/%e4%b8%80%e4%b8%aa%e7%a8%8b%e5%ba%8f%e7%9a%84%e7%bc%96%e8%af%91%e8%bf%87%e7%a8%8b/ | Kernel & Me

该日志由 root 于2015年06月16日发表在 C, C/C++ 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 一个程序的编译过程 | Kernel & Me
【上一篇】
【下一篇】