程序设计语言基础:语言处理程序

语言处理程序

  • 1、汇编程序
    • 1.1 汇编语言
    • 1.2 汇编程序
  • 2、编译程序
    • 2.1 编译过程
    • 2.2 词法分析
    • 2.3 语法分析
  • 3、解释程序

语言处理程序是一类系统软件的总称,其主要作用是将高级语言或汇编语言编写的程序翻译成某种机器语言程序,使程序可在计算机上运行。语言处理程序主要有 汇编程序、编译程序和解释程序 3 种基本类型。

1、汇编程序

1.1 汇编语言

汇编语言:为特定计算机设计的面向机器的符号化程序设计语言。用汇编语言编写程序要遵循所用语言的规范和约定。

汇编语言源程序:用汇编语言编写的程序。汇编语言源程序由若干条语句组成,一个程序中可以有三类语句:指令语句、伪指令语句和宏指令语句

  1. 指令语句:机器指令语句,将其汇编后能产生相应的机器代码,这些代码能被CPU直接识别并执行相应的操作。指令语句可分为传送指令、算术运算指令(ADD/SUB/AND)、逻辑运算指令、移位指令、转移指令和处理机控制指令等类型,指令书写时必须遵循相应的格式要求。
  2. 伪指令语句:伪指令语句指示汇编程序在汇编源程序时完成某些工作,例如给变量分配存储单元地址,给某个符号赋一个值等。伪指令语句与指令语句的区别是:伪指令语句经汇编后不产生机器代码,而指令语句经汇编后要产生相应的机器代码。另外,伪指令语句所指示的操作是在源程序被汇编时完成,而指令语句的操作必须是在程序运行时完成。
  3. 宏指令语句:在汇编语言中,还允许用户将多次重复使用的程序段定义为宏。宏的定义必须按照相应的规定进行,每个宏都有相应的宏名。在程序的任意位置,若需要使用这段程序,只要在相应的位置使用宏名,就相当于使用了这段程序。因此,宏指令语句就是宏的引用

汇编程序:计算机不能直接识别和运行符号语言程序,要用专门的汇编程序进行翻译。

1.2 汇编程序

汇编程序的功能是将汇编语言所编写的源程序翻译成机器指令程序。
汇编程序的基本工作包括:将每一条可执行汇编语句转换成对应的机器指令;处理源程序中出现的伪指令和宏指令。
由于汇编指令中形成操作数地址的部分可能在后面才能确定,所以汇编程序一般需要扫描两次源程序才能完成翻译过程。

  1. 第一次扫描的主要工作时定义符号的值并创建一个符号表ST。
    ST记录了汇编时所遇到的符号的名和值。MOT固定的机器指令表,其中记录了每条机器指令的记忆码和指令的长度。
    LC:位置计数器或单元地址计数器。在汇编过程中,LC的内容就是下一条被汇编的指令的偏移地址。
    POT1:伪指令表,伪指令表的每一个元素只有两个域:伪指令助记符和相应的子程序入口。
    在这里插入图片描述
  2. 第二次扫描的任务是产生目标程序。
    MOT2:机器指令表,该表中有机器指令助记符、机器指令的二进制操作码、格式和长度等。
    POT2:伪指令表,供第二次扫描使用。伪指令表的每一个元素仍有两个域:伪指令助记符和相应的子程序入口。
    在第二次扫描中,可执行汇编语言应被翻译成对应的二进制代码机器指令。两个方面工作:一是把机器指令助记符转换成二进制机器指令操作码,这可通过在 MOT2 中进行查找操作来实现;二是求出操作数区各操作数的值(用二进制表示)。

2、编译程序

2.1 编译过程

编译程序的功能是将某高级语言书写的源程序翻译成与之等价的目标程序(汇编语言程序或机器语言程序)。
在这里插入图片描述

  1. 词法分析
    词法分析阶段是编译过程的第一阶段,这个阶段的任务是对源程序从前到后(从左到右)逐个字符地扫描,从中识别出一个个“单词”符号。源程序可以被看成是一个多行的字符串。“单词”符号是程序设计语言的基本语法单位,如关键字(或称保留字)、标识符、常数、运算符和分隔符(标点符号、左右括号)等。词法分析程序输出的“单词”常以二元组的方式输出,即单词种类单词自身的值
  2. 语法分析
    语法分析的任务是在词法分析的基础上,根据语言的语法规则将单词符号序列分解成各类语法单位,如“表达式”“语句”“程序”等。
    语法规则就是各类语法单位的构成规则。通过语法分析确定整个输入串是否构成一个语法上正确的程序。如果源程序中没有语法错误,语法分析后就能正确地构造出其语法树:否则就指出语法错误,并给出相应的诊断信息。(形成语法树
    词法分析和语法分析本质上都是对源程序的结构进行分析。
  3. 语义分析
    语义分析阶段主要分析程序中各种语法结构的语义信息,包括检查源程序是否包含静态语义错误,并收集类型信息供后面的代码生成阶段使用。只有语法和语义都正确的源程序才能被翻译成正确的目标代码。
    语义分析的一个主要工作是进行类型分析和检查。程序设计语言中的一个数据类型一般包含两个方面的内容:类型的载体及其上的运算。例如,整除取余运算符只能对整型数据进行运算,若其运算对象中有浮点数就认为是类型不匹配的错误。
    在确定源程序的语法和语义后,就可对其进行翻译,同时改变源程序的内部表示。
    (数据类型转换,以及分配数据地址)
  4. 中间代码生成
    中间代码生成阶段的工作是根据语义分析的输出生成中间代码。(机器逐步执行代码
    “中间代码”是一种简单且含义明确的记号系统,可以有若干种形式,它们的共同特征是与具体的机器无关。
    中间代码的设计原则主要有两点:一是容易生成,二是容易被翻译成目标代码。最常用的一种中间代码是与汇编语言的指令非常相似的三地址码,其实现方式常采用四元式。四元式的形式为:
    运算符,运算对象1,运算对象2,运算结果
  5. 代码优化
    由于编译器将源程序翻译成中间代码的工作是机械的、按固定模式进行的,因此,生成的中间代码往往在计算时间上和存储空间上有很大的浪费。当需要生成高效的目标代码时,就必须进行优化。
    优化原则:等价交换原则。可以在中间代码生成阶段完成,也可以在目标代码生成阶段完成。将赋值、转换等一些中间代码生成过程简化。
  6. 目标代码生成
    目标代码生成是编译器工作的最后一个阶段。这一阶段的任务是把中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码或汇编指令代码,这个阶段的工作与具体的机器密切相关。
  7. 符号表管理
    符号表的作用是记录源程序中各个符号的必要信息,以辅助语义的正确性检查和代码生成,在编译过程中需要对符号表进行快速有效地查找、插入、修改和删除等操作。符号表的建立可以始于词法分析阶段,也可以放到语法分析和语义分析阶段,但符号表的使用有时会延续到目标代码的运行阶段。
  8. 出错处理
    错误类型:静态错误(编译时发现的程序错误)和动态错误(动态语义错误,发生在程序运行时)。
    编译的过程根据中间代码生成为分水岭,分为前端和后端两部分。前端包括从词法分析到中间代码生成各阶段的工作,后端包括中间代码优化和目标代码的生成及优化等阶段。前端与语言有关,后端与机器有关。

2.2 词法分析

词法分析过程的本质是对构成源程序的字符串进行分析,是一种对象为字符串的运算。语言中具有独立含义的最小语法单位是符号(单词),如标识符、无符号常数与界限符等。词法分析的任务是把构成源程序的字符串转换成单词符号序列。

  1. 字母表、字符串、字符串集合及运算;
  2. 正规表达式和正规集
  3. 有限自动机:确定的有限自动机和不确定的有限自动机。是一种识别装置的抽象概念,它能准确地识别正规集。

词法分析器的任务是把构成源程序的字符流翻译成单词符号序列。手工构造词法分析器的方法是先用正规式描述语言规定的单词符号,然后构造相应有限自动机的状态转换图,最后依据状态转换图编写词法分析器(程序)。

2.3 语法分析

词法分析器的任务是把构成源程序的字符流翻译成单词符号序列。手工构造词法分析器的方法是先用正规式描述语言规定的单词符号,然后构造相应有限自动机的状态转换图,最后依据状态转换图编写词法分析器(程序)。
程序设计语言的语法常采用上下文无关文法描述。

3、解释程序

解释程序是另一种语言处理程序,在词法、语法和语义分析方面与编译程序的工作原理基本相同,但是在运行用户程序时,它直接执行源程序或源程序的内部形式。因此,解释程序不产生源程序的目标程序,这是它和编译程序的主要区别。
解释方式实现高级语言的3中方式:
在这里插入图片描述

解释程序的基本结构:

  1. 分析部分:包括与编译过程相同的词法分析、语法分析和语义分析程序,经语义分析后把源程序翻译成中间代码,中间代码常采用逆波兰表示形式。
  2. 解释部分:用来对第一部分产生的中间代码进行解释执行。

高级语言的编译和解释方式比较:

  1. 效率。编译比解释方式可能取得更高的效率。
  2. 灵活性。由于解释程序需要反复检查源程序,这也使得解释方式能够比编译方式更灵活。当解释器直接运行源程序时,“在运行中”修改程序就成为可能,如增加语句或者修改错误等。另外,当解释器直接在源程序上工作时,它可以对错误进行更精确地定位。
  3. 可移植性。源程序是由解释器控制来运行的,可以提前将解释器安装在不同的机器上,从而使得在新环境下无须修改源程序使之运行。而编译方式下则需要针对新机器重新生成源程序的目标代码才能运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/57061.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM(HotSpot):GC之垃圾标记阶段

文章目录 前言一、标记阶段算法1、引用计数法2、可达性分析算法(JVM使用) 二、4种引用1、 强引用2、软引用(SoftReference)3、弱引用(WeakHashMap)4、虚引用(PhantomReference) 三、代码案例1、 强引用2、软引用(SoftReference)3、弱引用(WeakHashMap) 前…

如何恢复U盘里格式化数据?别慌,有带图详细步骤!

U盘,这个小巧的存储神器,我们几乎天天都在用。但有时候,一不小心手滑,U盘就被格式化了,里面的东西好像全没了,别急,其实数据恢复没那么难。这篇文章就来告诉你,怎么把格式化的U盘里的…

Harmony Navigation的使用

router已经不推荐使用了,推荐使用Navigation实现页面路由。那么下面就看看Navigation的具体使用步骤: 1、使用Navigation替换主入口页面,并设置NavPathStack,使用NavPathStack执行跳转的逻辑。 @Entry @Component struct Index {pathStack: NavPathStack = new NavPathS…

整理—Redis

目录 Redis底层的数据结构 ZSet用过吗 Zset 底层是怎么实现的 跳表是怎么实现的? Redis为什么使用跳表而不是用B树? 压缩列表是怎么实现的? Redis 中的 listpack 哈希表是怎么扩容的? String 是使用什么存储的 Redis为什么快&#xf…

c语言基础程序——经典100道实例。

c语言基础程序——经典100道实例 001, 组无重复数字的数002,企业发放的奖金根据利润提成003,完全平方数004,判断当天是这一年的第几天005,三个数由小到大输出006,输出字母C图案007,特殊图案008&…

Nginx(Linux):服务器版本升级和新增模块

目录 1、概述2、使用Nginx服务信号完成Nginx升级2.1 备份当前版本的Nginx2.2 向服务器导入新的Nginx2.3 向服务器导入新的Nginx2.4 停止老版本Nginx 3、使用Nginx安装目录的make命令完成升级3.1 备份当前版本的Nginx3.2 向服务器导入新的Nginx3.3 执行更新命令 1、概述 如果想…

cisp考试费用多少?

在网络安全领域,CISP(注册信息安全专业人员)认证备受关注。对于许多想要在这个领域深入发展的人来说,了解 CISP 考试费用是他们迈出的第一步。那么,CISP 考试费用究竟是多少呢? 一、CISP 认证的重要性与价值 (一)行业认可度高 CISP 是由中国…

计算机网络:数据链路层 —— 扩展共享式以太网

文章目录 共享式以太网共享式以太网存在的问题在物理层扩展以太网扩展站点与集线器之间的距离扩展共享式以太网的覆盖范围和站点数量 在链路层扩展以太网网桥的主要结构网桥的基本工作原理透明网桥自学习和转发帧生成树协议STP 共享式以太网 共享式以太网是当今局域网中广泛采…

道路垃圾识别数据集 含pt模型界面 18类 共7542张图片,xml和txt标签都有;

道路垃圾识别数据集 含pt模型&界面 18类 共7542张图片,xml和txt标签都有; YOLO道路垃圾识别系统 系统概述 名称:YOLO道路垃圾识别系统 图片数量:7542张标注格式:XML和TXT(支持YOLO格式)类…

智诊小助手TF卡记录文件导出

若想将TF卡中记录的数据文件导出可按以下的流程进行配置: 点击主界面中的导出选项即可进入到 下图中TF卡应用界面 点击TF卡应用界面中“查看记录文件”的选项,进入导出文件界面。 点击“选择”进入勾选文件的界面 点击“导出”后,点…

Android Studio 的 Gradle 任务列表只显示测试任务

问题现象如下: 问题原因: 这是因为Android Studio 设置中勾选了屏蔽其他gradle任务的选项。 解决方法: File -> Settings -> Experimental 取消勾选Only include test tasks in the Gradle task list generated during Gradle Sync&…

【Golang】Gin框架:Go语言中的轻量级Web框架

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

aws(学习笔记第六课) AWS的虚拟私有,共有子网以及ACL,定义公网碉堡主机子网以及varnish反向代理

aws(学习笔记第六课) AWS的虚拟私有,共有子网以及ACL,定义公网碉堡主机子网以及varnish反向代理 学习内容: AWS的虚拟私有,共有子网以及ACL定义公网碉堡主机子网,私有子网和共有子网以及varnish反向代理 1. AWS的虚拟…

springboot051医院管理系统(论文+源码)_kaic

医院管理系统 摘要 随着信息互联网信息的飞速发展,医院也在创建着属于自己的管理系统。本文介绍了医院管理系统的开发全过程。通过分析企业对于医院管理系统的需求,创建了一个计算机管理医院管理系统的方案。文章介绍了医院管理系统的系统分析部分&#…

Gitlab 完全卸载–亲测可行

1、停止gitlab gitlab-ctl stop2.卸载gitlab(注意这里写的是gitlab-ce) rpm -e gitlab-ce 3、查看gitlab进程 ps aux | grep gitlab 4、杀掉第一个进程(就是带有好多.............的进程) 5、删除所有包含gitlab文件 find / …

配置文件get调用为null

生成get方法调用显示为null 修改get方法去掉static调用成功

LCWLAN设备的实际使用案例

我们的LCWLAN设备在实际使用中以裸板的形式放在客户的智能总线控制器中,客户的 智能总线刀片灯,柔性灯货架,柔性感应钢网柜以及智能电子料架等设备都是接到总线控制 器中,然后总控制器通过CAN总线和我们的LCWLAN设备连接&#xff…

两个表格讲清日语形容词怎么用!柯桥小语种学习零基础日语培训

い形容词 1、敬体形和简体形 _ 肯定形 否定形 敬体现在时 词干+い+です 词干+くない+です 敬体过去时 词干+い+でした 词干+くない+です/ありません 简体现在时…

基于Qt的雷达航迹控件(解决QWidget绘制多点卡顿问题)

:详细讲解 在本篇文章中,我们将详细探讨如何使用Qt创建一个雷达轨迹系统。该系统可以模拟雷达轨迹的显示、处理用户的交互并管理轨迹选中状态。通过这篇文章,您将了解到自定义类 RadarTrackItem、RadarTrackManager、OverlayWidget 和 Radar…

大数据-180 Elasticsearch - 原理剖析 索引写入与近实时搜索

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…