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

article/2025/10/13 5:07:23

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

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

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

第一步:词法分析

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

<标识,语义值>对的形式存在。

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

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

图一:有限状态机

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

图2:语法树

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

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

图3:语法树生成实例

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

第三步:翻译语法树

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

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

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

图4:为变量分配存储地址

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

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

图5:寻找最小表达式

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

图6:表达式合并

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

图7:最终生成的汇编语言

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


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

相关文章

编译器是什么

什么是编译器&#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…

高可用性架构

1. 高可用性架构 高可用性是指一个系统经过专门的设计后具备的减少停工时间并能持续保持提供服务的高可用性质。该特性是衡量系统提供服务能力的一个特征&#xff0c;也是对系统进行设计时需要考虑在内的一个重要因素。   对于数据库系统而言&#xff0c;高可用、高可靠和高性…

系统可用性

一个网站、系统的战术包括可用性战术、可修改性战术、性能战术、安全性战术、可测试性战术、易用性战术。可用性是在某个考察时间&#xff0c;系统能够正常运行的概率或时间占有率期望值。它是衡量设备在投入使用后实际使用的效能&#xff0c;是设备或系统的可靠性、可维护性和…

系统可用性量表评估问卷

1&#xff0c;中文&#xff1a;可用性问卷 2&#xff0c;英文原版&#xff1a; sus Measuring Usability With The System Usability Scale (SUS) The System Usability Scale (SUS) was originally created as a “quick and dirty” scale for administering after usabili…

软件可靠性

知识点 主要难点和考点可靠性计算 串联系统 串联系统可靠性计算 并联系统 并联系统可靠性计算 并联系统有一个系统是可靠系统&#xff0c;整个并联系统就是可靠系统 1-R 表示系统的失效率 N模混合系统 可靠性计算 计算软件可靠性指标公式 可靠性&#xff1a;MTTF/(1MT…

软件测试中的可用性、可维护性、可靠性有什么区别?

我们生活在一个用户依赖于对服务的一致访问的可靠性时代。在相互竞争的服务之间进行选择时,对用户来说,没有比可靠性更重要的特性了。但是可靠性是什么意思呢? 为了回答这个问题,我们将根据可靠性工程中的其他度量来分解可靠性:可用性和可维护性。区分这些术语并不是语义…

可靠/可用性介绍

可靠/可用性主要目的是保护业务零中断和高用户体验。 可靠可用性基本概念 广义的可靠性(Reliability)由三个部分组成&#xff1a;可靠性(Reliability)、可维修性(Maintainability)和可用性(Avaliability)。其中狭义的可靠性是指产品在规定的条件和时间内完成规定功能的能力&a…

软件测试可用性常用指标

网站可用性 所谓网站可用性(availability)也即网站正常运行时间的百分比&#xff0c;业界用 N 个9 来量化可用性&#xff0c; 最常说的就是类似 “4个9(也就是99.99%)” 的可用性。 描述通俗叫法可用性级别年度停机时间基本可用性2个999%87.6小时较高可用性3个999.9%8.8小时具…

服务器系统可用性99.9,可用性99.9

可用性99.9 内容精选 换一换 云数据库 RDS服务支持切换主备实例的可用性策略,以满足不同业务需求。可选择 “可靠性优先”或者“可用性优先”两种策略。调用接口前,您需要了解API 认证鉴权。该接口仅支持MySQL引擎。仅支持主备实例,即:HA实例。实例在创建、数据库升级、创建…

软件设计中的可用性和可用性测试

什么是可用性 在创建软件的环境中&#xff0c;术语“可用性”表示一种方法&#xff0c;它将用户而不是系统摆在过程的中心。这一方法称作以用户为中心的设计&#xff0c;它从设计过程的一开始就将用户关心的问题和意见考虑在内&#xff0c;并提出在任何设计决策中用户的需要都应…