解读:编译器是如何将高级语言转换为汇编语言的?

对于每天奋斗在一线,用Java,C++,C#,Python等高级编程语言写程序的程序员们来说,理解编译器是如何将高级语言编译成汇编语言,有助于我们更好的理解计算

大家好,今天小编来为大家解答以下的问题,关于解读:编译器是如何将高级语言转换为汇编语言的?,这个很多人还不知道,现在让我们一起来看看吧!

编译器通过词法分析、语法分析和语法树解析三个主要步骤将高级语言转换为汇编语言。

第一步:词法分析

最初,用高级语言编写的程序对于编译器来说只是一串单个字符。为了让编译器识别这一系列字符串,需要逐个字符地读取源程序,然后将其分割成有意义的单词。这些分段词被编译器视为

身份以语义值对的形式存在。

为了从源程序字符串中顺序查找单词,编译器需要具有扫描功能,通常这样的扫描器可以用一组有限状态机来实现。为了说明什么是有限状态机,下面给出一个例子。

下图显示了一个识别数字的有限状态机。该数字由整数部分和可选的小数部分组成。因此,根据这个有限状态机,250和3.14159都可以被识别为有效数字。

图1:有限状态机

绿色节点标有圆环,表示它们处于“可接受”状态。也就是说,只要我们的状态达到了绿色节点,就说明我们之前读取到的数据是有效的数字。例如,从图中的开头开始,如果我们读到的数字是42.15,那么我们依次经历的状态就是(1,2,2,3,3,3)。由于这一系列的状态最终以“可接受”的状态结束(即图中的状态3),所以我们读取到了一个有效的数字。并且,将读取的数字42.15用值对标记,表示为NUMBER,42.15。这里的NUMBER用于标识我们读取的内容是数字,文本“42.15”用于标识对应的语义元素值。

我们可以针对不同类型的单词定义不同的类似上面的小状态机。例如,变量名可以由字母和下划线组成,运算符可以是+=、-,关键字可以是“if”、“while”等单词,类型可以是“int”、“char”等单词等等。为每种类型的词构建一个小型的有限状态机,最终形成一个可以接受不同类型的词的大状态机。我们得到的大状态机可以以表的形式存储。到目前为止,我们已经构建了一个大型状态机来获得一个可以识别各种类型单词的自动扫描仪。

至此,第一步就完成了,也就是我们通常所说的“语法分析”阶段。

解读:编译器是如何将高级语言转换为汇编语言的?

高层源程序通过语法分析后,我们得到的结果是标识和值对,以方便后续处理。

为了方便理解,这里举一个简单的例子。

比如我们的程序语句:

if ( x==2 ) { x=a + b;经过词法分析,得到标识符,值对如下:

(关键字,“if”),(标识符,“x”),(运算符,“==”),(数字,“2”),(分隔符,“{”),(标识符,“x”),(运算符,“=”),(标识符,“a”),(运算符,“+”),(标识符,“b”),(分隔符,“;”),(分隔符,“}”)。

第二步:语法分析

完成“词法分析”后,下一步就是激动人心的“语法分析”阶段。通过语法分析得到语法树。

例如,对于程序语句if ( x==2 ) { x=a + b; } 在第一步中。我们得到的语法树如下所示。

图2:语法树生成语法树的方法有很多种。这里我们只介绍一种最简单的方法:预测解析。具体方法是:从数据流的一端开始扫描,使用占位符为所有之前没有遇到过的元素创建一棵临时语法树,然后读取后续数据以填充语法树。 (这听起来可能很抽象,请参见下面的示例)

对于图2的语法树,具体生成过程如下:

图3:语法树生成示例。后续语句部分可以同样的方式生成,此处不再赘述。

解读:编译器是如何将高级语言转换为汇编语言的?

第三步:翻译语法树

语法树就位后,我们接下来需要做的是构建一个符号表来确定每个元素在内存中的存储位置。

具体方法:遍历语法树,将语法树中不同的变量一一取出,放入可用的存储位置。编译器决定如何分配存储位置。

具体流程可以用下图来描述:

图4:为变量分配存储地址。在语法树中多次出现的变量都指向同一地址。从上到下、从左到右遍历语法树。当遇到if节点时,进行if相关的操作。当遇到赋值节点时,进行赋值相关操作。详细步骤如下:

首先,找到最小表达式。下图中绿色和蓝色圆圈内的就是一个最小表达式。

图5:查找最小表达式接下来,将最小表达式与其周围的表达式合并。

图6:表达式合并最后,合并所有表达式以获得最终的汇编语言描述,如图7 所示。

图7:最终生成的汇编语言。至此,我们已经将高级语言翻译成了汇编语言。

用户评论

解读:编译器是如何将高级语言转换为汇编语言的?
花开丶若相惜

这段文章写的详细 lắm!一直想知道怎么把代码翻译成机器可以理解的东西,看完之后感觉豁然开朗了。编译器的作用真的太重要了,它让程序员能够用人类更容易理解的高级语言编写软件

    有8位网友表示赞同!

解读:编译器是如何将高级语言转换为汇编语言的?
娇眉恨

这篇文章讲的真的很棒,我以前只是听说过编译器这个词,没有深入了解过它的工作原理,现在终于明白它的作用和步骤啦!那些转换的过程确实复杂,佩服那些开发者写编译器的功力

    有11位网友表示赞同!

解读:编译器是如何将高级语言转换为汇编语言的?
安之若素

感觉文章有些理论性,对于初学者来说理解起来可能有点难度。建议可以加入一些具体的例子说明每个阶段的转换过程,这样更容易理解

    有7位网友表示赞同!

解读:编译器是如何将高级语言转换为汇编语言的?
将妓就计

高级语言转换成汇编语言是一个非常关键的过程,它决定了程序的可执行性和效率。学习编译器设计真是太专业了,有机会我也想深入研究一下!

    有15位网友表示赞同!

解读:编译器是如何将高级语言转换为汇编语言的?
孤独症

我一直觉得程序员的工作很酷炫,原来还得依赖于编译器的神奇转换才能实现运行!这篇文章让我对编译器的作用有了更清晰的认识,以后写代码的时候也要更加留意这个背后的机制

    有20位网友表示赞同!

解读:编译器是如何将高级语言转换为汇编语言的?
泪湿青衫

讲真的,这些理论内容有点枯燥,我更想看一些实际案例,比如用哪种语言去编写一个简单的程序,然后来看看编译器是如何将其转换成汇编语言的。这样更能直观地理解整个过程

    有19位网友表示赞同!

解读:编译器是如何将高级语言转换为汇编语言的?
来瓶年的冰泉

我学过一点计算机原理,所以对这篇文章的内容比较容易理解。不过对于没有程式基础的人来说,建议先了解一些基本的编程概念,然后再阅读这篇文章

    有5位网友表示赞同!

解读:编译器是如何将高级语言转换为汇编语言的?
古巷青灯

编译器就像一桥梁,连接了高级语言和汇编语言这两个世界,它让程序员可以更高效地编写代码。感谢作者分享这段精彩的知识!

    有17位网友表示赞同!

解读:编译器是如何将高级语言转换为汇编语言的?
墨染年华

汇编语言虽然是较底层的语言,但掌握汇编语言的原理也能更好地理解编译器的工作机制。我觉得这篇文章非常有学习价值!

    有15位网友表示赞同!

解读:编译器是如何将高级语言转换为汇编语言的?
揉乱头发

看了这篇文章,我对程序设计的思路有了更深刻的认识。原来代码最终还是要被转换成机器能直接执行的指令,中间需要经过编译器这样复杂的转换过程

    有8位网友表示赞同!

解读:编译器是如何将高级语言转换为汇编语言的?
殃樾晨

感觉编译器这个东西真是太神奇了!它能够将人类语言转化成机器语言,让我意识到编程技术的复杂性和强大的力量

    有12位网友表示赞同!

解读:编译器是如何将高级语言转换为汇编语言的?
落花忆梦

我对这篇文章写的逻辑结构比较满意,层次清晰,每一步骤的讲解都比较到位,最后总结也很明了,我学习编程的时候可以参考这种文章写作风格

    有15位网友表示赞同!

解读:编译器是如何将高级语言转换为汇编语言的?
一生荒唐

其实我觉得这篇文章的缺点就是缺少一些具体的例子,如果能加入一些实例说明每个阶段的转换过程,会更容易让人理解和记忆

    有20位网友表示赞同!

解读:编译器是如何将高级语言转换为汇编语言的?
惦着脚尖摘太阳

这个主题太专业了,对我来说还是比较难以消化。不过看到作者用通俗易懂的语言讲解复杂的原理,还是很佩服的。希望作者以后能写一些更贴近生活的文章

    有10位网友表示赞同!

解读:编译器是如何将高级语言转换为汇编语言的?
陌上蔷薇

之前一直以为编译器只是一个工具,现在才知道它背后蕴含着如此深奥的知识!这篇文章让我对编程技术的底层原理有了新的认识

    有8位网友表示赞同!

解读:编译器是如何将高级语言转换为汇编语言的?
巴黎盛开的樱花

这个标题吸引了我,我一直很想知道高级语言是怎么变成汇编语言的。文章解释得也很清楚,但是我觉得内容有点过于理论化,可以考虑加入一些实践案例

    有7位网友表示赞同!

解读:编译器是如何将高级语言转换为汇编语言的?
颜洛殇

这篇文章很有启发性,让我意识到编译器的作用远远超过想象!它不仅连接了人类和机器的沟通桥梁,还推动着软件技术的发展!

    有11位网友表示赞同!

解读:编译器是如何将高级语言转换为汇编语言的?
◆乱世梦红颜

看完这篇文章,我觉得计算机学真不容易啊!光是学习编译器的机制就需要花很多时间和精力。希望以后有更多人关注并深入研究计算机科学

    有19位网友表示赞同!

原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/149673.html

(0)
小su的头像小su
上一篇 6小时前
下一篇 5小时前

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注