<p style="margin-top:0px; margin-bottom:15px; color:rgb(85,85,85); font-family:'Microsoft Yahei','Helvetica Neue',Helvetica,Arial,sans-serif; font-size:15px; line-height:26px; text-indent:30px"> 对于每天奋斗在一线,用Java,C++,C#,Python等高级编程语言写程序的程序员们来说,理解编译器是如何将高级语言编译成汇编语言,有助于我们更好的理解计算机编程。</p>
<p style="margin-top:0px; margin-bottom:15px; color:rgb(85,85,85); font-family:'Microsoft Yahei','Helvetica Neue',Helvetica,Arial,sans-serif; font-size:15px; line-height:26px; text-indent:30px"> 编译器将高级语言转化成汇编语言主要经过三个步骤:词法分析、语法分析、语法树解析。</p>
<p style="margin-top:0px; margin-bottom:15px; color:rgb(85,85,85); font-family:'Microsoft Yahei','Helvetica Neue',Helvetica,Arial,sans-serif; font-size:15px; line-height:26px; text-indent:30px"> 本文用简洁易懂的方式描述了这一过程,相信不需要很深的计算机背景知识,也能轻松读懂本文。</p>
<h2 style="margin:20px -20px 20px -24px; line-height:18px; color:rgb(85,85,85); font-size:18px; padding:10px 20px 9px 10px; border-left-width:4px; border-left-style:solid; border-left-color:rgb(0,166,124); background-color:rgb(251,251,251); font-family:'Microsoft Yahei','Helvetica Neue',Helvetica,Arial,sans-serif; text-indent:30px"> 第一步:词法分析</h2>
<p style="margin-top:0px; margin-bottom:15px; font-family:'Microsoft Yahei','Helvetica Neue',Helvetica,Arial,sans-serif; font-size:15px; line-height:26px; text-indent:30px"> <span style="color:rgb(85,85,85)">最开始的时候,高级语言编写的程序对编译器来说只是一连串的单个字符组成的</span><span style="color:#6600cc">字符串</span><span style="color:#555555">。为了让编译器识别这一连串的字符串,需要逐个字符的读取源程序,然后将其切分成有意义的单词,这些被切分后的单词在编译器眼里是以</span></p>
<p style="margin-top:0px; margin-bottom:15px; font-family:'Microsoft Yahei','Helvetica Neue',Helvetica,Arial,sans-serif; font-size:15px; line-height:26px; text-indent:30px"> <span style="color:#6600cc"><标识,语义值></span><span style="color:rgb(85,85,85)">对的形式存在。</span></p>
<p style="margin-top:0px; margin-bottom:15px; font-family:'Microsoft Yahei','Helvetica Neue',Helvetica,Arial,sans-serif; font-size:15px; line-height:26px; text-indent:30px"> <span style="color:rgb(85,85,85)">为了从源程序字符串中依次找出单词,</span><span style="color:#6600cc">编译器需要具有扫描功能</span><span style="color:#555555">,通常这种扫描器可以用一组有限状态机来实现。为了说明有限状态机是怎么一回事,下面给出一个实例。</span></p>
<p style="margin-top:0px; margin-bottom:15px; color:rgb(85,85,85); font-family:'Microsoft Yahei','Helvetica Neue',Helvetica,Arial,sans-serif; font-size:15px; line-height:26px; text-indent:30px"> 下图为一个识别数字的有限状态机,数字由整数部分和可选的小数部分组成。因此,根据这个有限状态机,250和3.14159都能被识别成一个有效的数字。</p>
<p style="margin-top:0px; margin-bottom:15px; color:rgb(85,85,85); font-family:'Microsoft Yahei','Helvetica Neue',Helvetica,Arial,sans-serif; font-size:15px; line-height:26px; text-indent:30px"> <img alt="" class="aligncenter" height="150" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-2c02d9be75c767f8ddfd6bf5c9689ef6.jpeg" style="max-width:100%; height:auto; vertical-align:middle; border:0px; margin:0px auto; display:block; text-align:center" width="390"></p>
<p style="margin-top:0px; margin-bottom:15px; color:rgb(85,85,85); font-family:'Microsoft Yahei','Helvetica Neue',Helvetica,Arial,sans-serif; font-size:15px; line-height:26px; text-indent:30px; text-align:center"> 图一:有限状态机</p>
<p style="margin-top:0px; margin-bottom:15px; color:rgb(85,85,85); font-family:'Microsoft Yahei','Helvetica Neue',Helvetica,Arial,sans-serif; font-size:15px; line-height:26px; text-indent:30px"> 绿色的结点用环形标志,表示他们是“可接受”的状态,也就是说,只要我们的状态达到了绿色的结点,就表示我们之前读取到的数据是一个有效的数字。例如,从图中的start处开始,如果我们读到的数字是42.15,那么依次经历的状态是(1,2,2,3,3,3),由于这一系列状态最终以“可接受”的状态结束(也就是图中的状态3),因此我们就读取到了一个有效的数字。而且读取到的数字42.15用<标识,值>对的形式表示成<NUMBER,42.15>。这里的NUMBER是用于标识我们读取到的内容是一个数字,而文本“42.15”是标识对应的语义元素值。</p>
<p style="margin-top:0px; margin-bottom:15px; color:rgb(85,85,85); font-family:'Microsoft Yahei','Helvetica Neue',Helvetica,Arial,sans-serif; font-size:15px; line-height:26px; text |
|