编译器是如何将高级语言转化成汇编语言的?

article/2025/10/13 4:44:49

640?wx_fmt=jpeg

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

编译器将高级语言转化成汇编语言主要经过三个步骤:词法分析、语法分析、语法树解析。

本文用简洁易懂的方式描述了这一过程,相信不需要很深的计算机背景知识,也能轻松读懂本文。

第一步:词法分析

最开始的时候,高级语言编写的程序对编译器来说只是一连串的单个字符组成的字符串。为了让编译器识别这一连串的字符串,需要逐个字符的读取源程序,然后将其切分成有意义的单词,这些被切分后的单词在编译器眼里是以
<标识,语义值>对的形式存在。

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

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

640?wx_fmt=jpeg
图一:有限状态机

绿色的结点用环形标志,表示他们是“可接受”的状态,也就是说,只要我们的状态达到了绿色的结点,就表示我们之前读取到的数据是一个有效的数字。例如,从图中的start处开始,如果我们读到的数字是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; }

通过词法分析后,得到<标识,值>对如下:

(KEYWORD,”if”),	
(IDENTIFIER,”x”), (OPERATOR,”==”), (NUMBER,”2″), (DELIMITER, “{“), 	
(IDENTIFIER,”x”), (OPERATOR,”=”), (IDENTIFIER,”a”), (OPERATOR,”+”), 	
(IDENTIFIER,”b”), (DELIMITER,”;”), (DELIMITER,”}”).


第二步:语法分析

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

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

640?wx_fmt=jpeg
图2:语法树

生成语法树的方法有很多,这里只介绍一种最简单的方法:预测分析法(predictive parsing)。具体做法是:从数据流的一端开始扫描,用占位符为所有之前没遇到的元素创建一个临时语法树,然后依次读取后续的数据来填充完这颗语法树。(听起来可能很抽象,请看下面的实例)

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

640?wx_fmt=jpeg
图3:语法树生成实例

后续的statement部分可以同理生成,这里略去。

第三步:翻译语法树

有了语法树后,我们接下来要做的事情是构建符号表,以便确定各个元素在存储器中的存放位置。

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

具体过程可以用下图表描述:

640?wx_fmt=jpeg
图4:为变量分配存储地址

语法树中多次出现的变量指向同一地址。从上到下,从左往右依次遍历语法树,遇到一个if结点,执行if相关的操作,遇到赋值结点,执行赋值相关的操作,详细步骤如下所示:

首先,寻找最小表达式,如下图中绿色、蓝色圈中的即为一个最小表达式。

640?wx_fmt=jpeg
图5:寻找最小表达式

接下来,将最小表达式与其周边的表达式合并。

640?wx_fmt=jpeg
图6:表达式合并

最后,将所有的表达式有序的进行合并,得到最终的汇编语言描述,如图7所示。

640?wx_fmt=jpeg
图7:最终生成的汇编语言

至此,我们便将高级语言翻译成了汇编语言。

640?

640?wx_fmt=png

5.

640?wx_fmt=gif

免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。


http://chatgpt.dhexx.cn/article/AbMisnUv.shtml

相关文章

【C语言】--编译及编译器

夫学须静也&#xff0c;才须学也&#xff1b;非学无以广才&#xff0c;非志无以成学 个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️系列专栏】 文章目录 前言一.编译二.编译器Visual StudioClonDev C 三.创建c语言文件 前言 C语言一直以来都是初…

【汇编语言】

汇编语言 第二版 王爽 【Chapter 01 基础知识】 学习汇编的主要目的:通过用汇编语言进行编程而深入地理解计算机底层的基本工作机理,达到可以随心所欲地控制计算机的目的. 1.1 机器语言 1.2 汇编语言的产生 1.3 汇编语言的组成 (1) 汇编指令&#xff1a;机器码的助记符…

VS编译汇编语言

第一种方式肯定是嵌入汇编了&#xff0c;利用VS内置的__asm关键字&#xff0c;加入对汇编的支持&#xff0c;这种方式很简单&#xff0c;只需要简历一个普通工程&#xff0c;在工程中需要加入汇编的位置进行汇编处理。 第二种方式是利用VS编译纯汇编的程序&#xff0c;这种方式…

汇编语言软件编程

正确学习汇编语言的入门姿势 1.下载DOSBOX 2.下载MASM 3.在Visual Sdudio中下载这个插件ASMDUDE 链接&#xff1a;https://pan.baidu.com/s/1Q6iv63jNZEVkXS4Ghg8i8A 提取码&#xff1a;yqyy 福利已经给大家安排上了。 1.DOSBOX安装 DOSBOX安装后&#xff0c;默认是在C盘的路径…

一个小型的汇编编译器

train汇编器 本程序包含4个源文件与6个头文件&#xff0c;源文件约2200行代码&#xff0c;头文件共约500行&#xff0c;可识别并编译27项指令。 支持vs2013及更高版本 支持gcc 6.3.0及更高版本&#xff0c;gcc编译过程如图&#xff1a;&#xff08;2019.7.26更新&#xff0c…

高级语言(C语言)、汇编语言、机器语言区别?编译器如何将高级语言编译成机器语言?

⾼级语⾔&#xff1a; 是相对于汇编语⾔⽽⾔的&#xff0c;是⾼度封装了的编程语⾔&#xff0c;与低级语⾔相对。它是以⼈类的⽇常语⾔为基础的⼀种编程语⾔&#xff0c;使⽤⼀般⼈易于接受的⽂字来表⽰&#xff08;例如汉字、不规则英⽂或其他外语&#xff09;&#xff0c;从…

汇编语言使用的工具

现在我们的电脑大多数是win10系统的&#xff0c;64位操作系统。这个可以右键点击我的电脑&#xff0c;查看属性。 学习汇编语言&#xff0c;我们就要安装64位的汇编开发环境&#xff0c;这里是win764位汇编开发环境的安装。 1.把你的文件复制到电脑盘符。我的在电脑D盘 2.点击…

浅谈汇编器、编译器和解释器

作者: 硬核老王 简单介绍一下编程方式的历史演变。 -- Erik Oshaughnessy&#xff08;作者&#xff09; 在计算机诞生不久的早期年代&#xff0c;硬件非常昂贵&#xff0c;而程序员比较廉价。这些廉价程序员甚至都没有“程序员”这个头衔&#xff0c;并且常常是由数学家或者电…

编译器如何将高级语言转化成汇编语言的?

对于每天奋斗在一线&#xff0c;用Java&#xff0c;C&#xff0c;C#&#xff0c;Python等高级编程语言写程序的程序员们来说&#xff0c;理解编译器是如何将高级语言编译成汇编语言&#xff0c;有助于我们更好的理解计算机编程。 编译器将高级语言转化成汇编语言主要经过三个步…

编译器是什么

什么是编译器&#xff0c;查阅百度&#xff1a;编译器就是将“高级语言”翻译为“机器语言&#xff08;低级语言&#xff09;”的程序。那高级语言自然是指C#&#xff0c;C等一些高度抽象化的语言。而机器语言是直接用二进制代码指令表达的计算机语言&#xff0c;指令是用0和1组…

汇编语言是什么?

文章目录 基础定义汇编语言的语法 常用指令函数的调用机制函数的内部处理机制从汇编语言角度看多线程的安全问题 基础定义 助记符&#xff1a; 例如在加法运算的本地代码中加上 add&#xff08;addition的缩写&#xff09;、在比较运算的本地代码中加上 cmp&#xff08;compar…

汇编语言和本地代码及通过编译器输出汇编语言的源代码

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 目录 一、汇编语言和本地代码 二、通过编译器输出汇编语言的源代码 一、汇编语言和本地代码 计算机CPU只能运行本地代码&#xff08;机器语言&#xff09;程序&#xff0c;用C语言等高级语言编写的代码&#xff0c;需要经…

c-nasm简易的汇编语言编译器(nasm、nask语法)

c-nasm汇编器&#xff1a; GitHub - Changele08/c-nasm: 简易的汇编语言编译器 【基本信息】 简单的汇编语言编译器&#xff0c;源程序包含一个源文件&#xff0c;总共约为10000行&#xff08;大部分为汇编指令->机器指令对照表&#xff09; 使用devc5.11无错误无警告编…

记录:汇编语言编译器选择(vscode,永远的神)

我下了两个&#xff0c;一个是一个入门级的&#xff0c;要49块成为注册用户才能解锁全部功能&#xff0c;好像还容易崩。另一个是dosbox&#xff0c;太老了&#xff0c;界面交互性差&#xff0c;我因为安装过两次&#xff0c;出现了一些文件位置问题&#xff0c;运行总出bug&am…

03.汇编语言和编译器

机器指令 早期的程序设计均使用机器语言。程序员们将用0, 1数字编成的程序代码打在纸带或卡片上&#xff0c;1打孔&#xff0c;0不打孔&#xff0c;再将程序通过纸带机或卡片机输入计算机&#xff0c;进行运算。这样的机器语言由纯粹的0和1构成&#xff0c;十分复杂&#xff0…

软件测试报告

近期&#xff0c;老师给我们布置了一个任务&#xff0c;那就是软件的测试报告&#xff0c;刚刚接触测试报告的我&#xff0c;并不是很了解测试报告怎么写&#xff0c;我们又是如何进行测试的&#xff0c;这里&#xff0c;我将自己对测试的想法写在这里。 一、概述 本软件是根据…

【详解】服务可用性详细说明及其解决方案

该文章转自&#xff1a; 搜狐文章 链接 谈到高并发和高可用往往引起很多人的兴趣&#xff0c;有时候成为框架选择的噱头。实际上&#xff0c;它们往往和框架关系不大&#xff0c;而是跟架构息息相关。在很多时候&#xff0c;老码农会直面一个问题&#xff1a; “系统的服务可…

可用性并非阳春白雪

写代码&#xff1f;这个环节的工作其实不难。开发出人们真正想用的应用程序&#xff0c;然后把它们发布到用户手上&#xff0c;这才是难事&#xff01; 长久以来&#xff0c;我一直着迷于Steve Krug的那本《Dont Make Me Think》。不仅因为那本书短小精悍&#xff0c;读来朗朗…

软件工程-需求分析

软件需求任务 功能需求 接口需求 性能需求 约束 可靠性和可用性需求 逆向需求 出错处理需求 将来可能提出的要求 功能需求(一定要有) 这方面的需求指定系统必须提供的服务。通过需求分析应该划分出系统必须完成的所有功能 性能需求(最好有) 性能需求指定系统必须满足的定时约束…

服务可用性的一知半解

谈到高并发和高可用往往引起很多人的兴趣&#xff0c;有时候成为框架选择的噱头。实际上&#xff0c;它们往往和框架关系不大&#xff0c;而是跟架构息息相关。在很多时候&#xff0c;老码农会直面一个问题&#xff1a; “系统的服务可用性是多少&#xff1f;是怎么得来&#x…