编译原理笔记(一)引论

news/2024/5/18 21:44:52/文章来源:https://blog.csdn.net/hanmo22357/article/details/130498715

文章目录

    • 1.什么是编译程序
    • 2.编译过程和编译程序的结构
      • 2.1.编译过程概述
      • 2.2.编译程序的结构
      • 2.3.编译阶段的组合
    • 3.解释程序和一些软件工具
      • 3.1.解释程序
      • 3.2.处理源程序的软件工具
    • 4.PL/0语言编译系统

学习总结:这一部分是编译原理的绪论部分内容,对编译程序的整体框架流程进行了介绍。内容均为概念,没有能够出大题的内容,个人认为考试前只需要对这些概念有一个基本的了解即可,而非将本章作为复习重点。

1.什么是编译程序

编译程序的地位

  • 编译程序是现代计算机系统的基本组成部分之一;
  • 多数计算机都配有不止一种高级语言编译程序,对有些高级语言甚至配置了几个不同性能的编译程序。

编译程序的功能:从功能上看,一个编译程序就是一个语言翻译程序,把一种语言(源语言)书写的程序翻译成另一种语言(目标语言)的等价程序。但是其中的源语言是高级语言,目标语言是低级语言。

编译程序的重要性:编译程序使得多数计算机用户不必考虑与机器有关的繁琐细节,使得程序员独立于机器。

程序设计语言处理程序的典型流程:编译程序是程序设计语言处理程序的一部分。

在这里插入图片描述

  • 预处理程序:一个源程序可能分成几个模块存放在不同的文件里,由预处理程序来将这些源程序汇集在一起。有些预处理程序也负责宏展开(如C语言的预处理程序)。
  • 过程概述:编译程序生成的目标程序是汇编代码的形式,需要经过汇编程序翻译成可再装配(或可重定位)的机器代码,再经由装配/连接编辑程序与某些库程序连接成可以在机器上运行的代码。

2.编译过程和编译程序的结构

2.1.编译过程概述

编译过程的典型划分方法

在这里插入图片描述

  • 词法分析

    • 词法分析是编译过程的第一个阶段;
    • 词法分析阶段的任务是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词,例如标识符和保留字等。
  • 语法分析

    • 语法分析是编译过程的第二个阶段;
    • 语法分析阶段的任务是在词法分析的基础上将单词序列分解为各种语法短语,例如程序、语句和表达式等。通过语法分析确定整个输入串是否构成语法上正确的程序。
    • 可以将语法分析的结果表示为语法树的形式。
  • 语义分析

    • 语义分析是审查源程序有无语义错误,为代码生成阶段收集类型信息。
    • 语义分析的具体任务包括类型审查、下标检查和运算对象的类型转换等。
  • 中间代码生成

    • 在进行完语法分析和语义分析后,有的编译程序将源程序变为一种内部表示形式,这种内部表示形式被称为中间语言或中间代码。
    • 中间代码是一种结构简单、含义明确的记号系统,需要满足两点设计原则:一是容易生成,二是容易将它翻译成目标代码。
    • 很多编译程序采用一种类似于三地址指令的“四元式”中间代码,可以表示为(运算符,运算对象1,运算对象2,结果)
  • 代码优化:代码优化阶段的任务是对前一个阶段产生的中间代码进行变换或改造,目的是使得生成的目标代码更加高效,也就是更加节约时间和空间。

  • 目标代码生成

    • 目标代码生成阶段的任务是把中间代码变换为特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。
    • 这是编译的最后阶段,它的工作和硬件结构和指令含义等都有关,是一个非常复杂的过程。

备注:并非所有的编译程序都划分为这样几个阶段,有些编译程序并不需要生成中间代码,有些编译程序不进行优化。不过大多数编译程序都包含上述几个工作阶段。

2.2.编译程序的结构

编译程序的组成

  • 编译过程的六个阶段可以分别由词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序和目标代码生成程序六个模块完成。
  • 此外,一个完整的编译程序还必须包括表格管理程序和出错处理程序。
  • 表格管理程序:编译过程中源程序的各种信息被保留在不同的表格中,编译各阶段的工作都涉及构造、查找和更新有关的表格,因此需要有表格管理的工作。
  • 出错处理程序:如果在编译过程中发现源程序有错误,编译程序应该报告错误的性质和错误发生的地点,并且将错误所造成的影响限制在尽可能小的范围内,使得源程序的其余部分能够继续被编译下去,有些编译器还能自动校正错误,这些工作由出错处理程序完成。

2.3.编译阶段的组合

编译过程前端和后端的划分:有时候把编译过程分为前端和后端。

  • 编译前端:前端的工作主要依赖于源语言,而与目标语言无关。一般包括词法分析、语法分析、语义分析和中间代码生成这些阶段,以及某些优化工作。
  • 编译后端:后端是指那些依赖于目标机而一般不依赖于源语言,只与中间代码有关的那些阶段的工作,包括目标代码生成,以及相关出错处理和符号表操作。
  • 前端和后端的组合:某一个编译程序的前端加上相应的后端可以为不同的机器构成同一个源语言的编译程序;不同语言编译的前端生成同一种中间语言,再使用一个共同的后端,则可以为同一个机器生成几个语言的编译程序。

编译过程的遍数

  • 一个编译过程可以由一遍、两遍或多遍完成。
  • 遍,是指对源程序或其等价的中间语言程序从头到尾扫描并完成规定任务的过程,每一遍扫描可以完成上述一个阶段或多个阶段的工作。
  • 一个多遍的编译程序可以比一遍的编译程序少占内存,整个编译程序的逻辑结构也更加清晰;但是多遍也意味着增加读写中间文件的次数,消耗更多的时间。

3.解释程序和一些软件工具

3.1.解释程序

编译程序的问题:如果不把整个程序全部翻译完成之后,这个程序不能开始运行,也不会产生任何结果。

解释程序概述:解释程序接受某个语言的程序并立即运行这个程序。它的工作模式就是一个个的获取、分析并执行源程序语句,一旦一条语句分析阶数,源程序便开始运行并生成结果。解释程序允许执行时修改程序。

编译程序和解释程序的存储组织比较

  • 编译程序的存储组织:在源程序被编译的阶段,存储区中要为源文件和目标代码开辟空间,要存放编译用的各种表格。在目标代码运行阶段,存储区中主要是目标代码和数据,编译所用的信息就都不再需要了。
  • 解释程序的存储组织:解释程序一般对源程序的每一个语句逐一进行语法分析,转换为一种内部表示形式,存放在源程序区。由于解释程序允许在执行用户程序时修改程序,这就要求在解释程序工作的整个过程中,源程序、符号表等内容始终存放在存储区中,并且要求存放格式要设计易于使用和修改。

解释程序的缺点:程序的解释是非常慢的,并且解释程序需要更大的空间开销。

3.2.处理源程序的软件工具

  • 语言的结构化编辑器:用户可以使用这种编辑器在语言的语法制导下编制出所需的源程序。这一类编辑器不仅具有通常的编辑和修改功能,还会对源程序正文进行逐行分析并完成输入检查、自动提供关键字等任务。
  • 语言程序的调试工具:该类工具允许用户一行一行来跟踪程序,查看变量和数据结构的变化。调试的功能越强,实现越复杂,涉及到源程序的语法分析和语义处理技术。
  • 程序格式化工具:程序格式化工具分析源程序,并可以将程序以结构清晰可读的形式打印出来。
  • 语言程序测试工具:可以分为静态分析器和动态测试器两种。
    • 静态分析器:在不运行程序的情况下对源程序进行静态分析,以发现程序中潜在的错误或异常;
    • 动态测试器:在源程序分析的基础上,将用于记录和现实程序执行轨迹的语句或函数插入到源程序的适当位置,并用测试用例来记录和显示程序运行时的路径,将运行结果与期望的结果进行比较分析,帮助编程人员找到问题。
  • 程序理解工具:对程序进行分析,确定模块间的调用关系,记录程序数据的静态属性和结构属性,并画出控制流程图,帮助用户理解程序。
  • 高级语言之间的转换工具:把一种高级语言转换为另一种高级语言的工具。这与实现一个完整的编译程序相比工作量小一些。

4.PL/0语言编译系统

PL/0语言编译系统概述

  • 产生背景和基本组成:PL/0语言编译系统是世界著名计算机科学家N.Wirth编写的,由编译程序和解释程序两部分构成。
  • PL/0编译程序:源语言为PL/0,目标语言是一个类P-code的代码。

PL/0语言编译系统组成:PL/0语言编译程序由编译程序和解释程序两部分组成,分别称为PL/0编译程序和类P-code解释程序。当编译程序正常阶数时,PL/0语言编译系统会自动调用解释程序,解释执行生成的目标程序。

PL/0编译程序的书写:可以用C、Pascal或Java等语言书写。

PL/0语言概述:PL/0语言的程序结构很简单,是Pascal的一个子集。

程序语言的语法描述:程序语言的语法描述常常采用一种被称为扩展巴克斯范式(EBNF)的形式。

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

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

相关文章

神经网络结构搜索NAS

推荐课程:神经网络结构搜索 感谢博主ShusenWang提供的课程讲解! 目录 1. 为什么要学习神经网络结构搜索NAS? 2. 什么是神经网络结构搜索NAS? (1)随机搜素Random Search 1. 为什么要学习神经网络结构搜…

漫天花雨HTML特效+3D相册

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

or-tools 应用案例分析:复杂作业车间调度问题

作业调度问题是常见的线性规划(整数规划)问题,其中多个作业在多台机器上处理。每个作业由一系列任务组成,这些任务必须按给定的顺序执行,并且每个任务都必须在特定的机器上处理。如何有效的利用所有的机器在最短的时间内完成所有的作业任务&a…

调试别人的API,一般有哪些步骤?

当我们使用了一些由别人实现的API接口时,该如何进行调试呢?当我们使用的API返回一些意想不到错误时,该怎么办呢?这个问题可能是由于用户输入或者API本身,或者其他完全无关的内容等引起的。调试是我们进行定位并修复由单个API调用…

[杂谈]从《天堂2》到永恒之塔私服的感慨

不才在下是个老丫头了,平时喜欢潜水,还是在玩激战时注册的多玩论坛号,也不怎么说话,都是看别人说得多(害羞嘛……)。 想当年《天堂二》内测时,刚好在成都开了个内测号 首发会,我大清…

Linux 五种网络IO模式(阻塞IO、非阻塞IO、IO多路复用、信号驱动IO、异步IO)

Linux网络编程中,有五种网络IO模式,分别是阻塞IO、非阻塞IO、IO多路复用、信号驱动IO、异步IO; 虽然说不能全都认识得很透彻,但至少得都知道一点! 开始之前,先了解以下同步IO和异步IO; 1. 同步…

linux0.12-8-4-sys_call.s

[301页] 8-4 sys_call.s 程序 sys_call.s 程序简单总结: int 0x80 – _system_call int16 – 处理器错误中断 int7 – 设备不存在或协处理器不存在。 int32 – (int 0x20)时钟中断处理程序。 两个系统功能的底层接口,分别是 sys_execve 和 sys_fork 。…

【JVM】面试题总结

JVM 1、JVM 的运行时内存区域是怎样的2、堆和栈的区别3、Java 中的对象一定在堆上分配内存吗4、什么是 Stop The World5、JVM 如何判断对象是否存活6、JVM 有哪些垃圾回收算法7、什么是三色标记算法8、新生代和老年代的GC算法9、新生代和老年代的垃圾回收器有何区别10、Java 中…

MYSQL用户组管理

1:使用明文密码创建用户 使用密文密码创建用户 1.2 查看用户信息 1.3 重命名用户 rename 1.4 删除用户信息 drop 1.5 修改当前登录用户的密码 set password password(123456); 1.6 修改其他用户的密码 set password for nancylocalhost password(abc123); 1.7…

电子价签能给生鲜零售带来什么?

生鲜零售 变价难 超市中的水果、蔬菜、鱼肉海鲜等商品,往往会受季节变化、运输和储存成本、自然环境引起的生产成本、供需关系等因素影响,其商品价格变动比较频繁。如不能及时更新价格,容易影响商品的销售,进而影响超市的盈利能…

【致敬未来的攻城狮计划】第2期定向赠书《RT-Thread设备驱动开发指南》+ 《GD32 MCU原理及固件库开发指南》

开启攻城狮的成长之旅!这是我参与的由 CSDN博客专家 架构师李肯(超链接:http://yyds.recan-li.cn)和 瑞萨MCU (超链接:瑞萨电子 (Renesas Electronics Corporation)) 联合发起的「 致敬未来的攻…

测试用例覆盖不全面的解决方法

测试用例覆盖不全面的解决方法 问题分析 在测试用例设计过程中,容易出现思维受限或者需求盲区,我们不可能完全覆盖用户使用的所有场景,编写测试用例的时不可能把所有的场景都能想周全,把所有的场景下的情况都写成测试用例去模拟、…

儿童书写台灯哪个牌子比较好?盘点护眼学生用台灯品牌排行

想要拥有一个健康的视力对于我们多么重要,日常生活多么不便利,就是像家里孩子考学时视力也是对于未来专业选择的一个阻碍。 想要孩子不吃近视的苦,从小就要开始抓孩子对于视力和眼睛的呵护。 养成好习惯必须保持一个正确的学习姿势&#xff…

基于pytorch+transformers的车牌识别

目录 程序流程设计熟悉训练数据集CCPD2019数据集CCPD数据集标注信息单例再现 加载本地车牌数据集 程序流程设计 1,熟悉训练数据集; 2,加载本地车牌数据集; 3,定义网络模型; 4,输入数据集训练模…

Baumer工业相机堡盟工业相机如何联合BGAPISDK和Halcon实现图像的线性灰度变换ScaleImage算法增强(C#)

Baumer工业相机堡盟工业相机如何联合BGAPISDK和Halcon实现图像的线性灰度变换算法增强(C#) Baumer工业相机Baumer工业相机使用图像算法增加图像的技术背景Baumer工业相机通过BGAPI SDK联合Halcon使用线性灰度变换增强算法1.引用合适的类文件2.BGAPI SDK在…

「STC8A8K64D4开发板」——外部中断(INT0~INT4)

第2-4讲:外部中断(INT0~INT4) 学习目的学习中断的相关概念。掌握外部中断配置及中断优先级配置的程序设计。掌握中断服务程序的编写。 中断相关概念 什么是中断 中断系统是为使 CPU 具有对外界紧急事件的实时处理能力而设置的。 CPU在处理某一事件A时&#xff0c…

基于YOLOv5的儿童睡眠检测

注意: 由于SOPHGO SE5微服务器的CPU是基于ARM架构,部分步骤将在 基于x86架构CPU的开发环境中完成 一、初始化开发环境(基于x86架构CPU的开发环境中完成) 二、模型转换 (基于x86架构CPU的开发环境中完成) 三、YOLOv5模型部署测试(在SOPHGO SE5…

超细Redis(一)

目录 概述 Redis是什么? Redis能干嘛? 特性 如何学习 Linux安装 测试性能 概述 Redis是什么? Redis (Remote Dictionary Server),即远程字典服务 是一个开源使用ANSI C语言编写、支持网络、可基于内存亦可持…

【SVN】版本控制管理的文件(夹)如何重命名

目录 一、前言二、操作步骤1. 使用SVN重命名(SVN rename)2. 输入新名称3. 确定重命名4. 立刻进行一次提交(commit)5. 补充 三、可能遇到的问题1. 情况一2. 情况二3. 情况三 一、前言 如果只是在本地的文件系统中修改SVN中的文件&a…

STM32CUBEMX 待机模式最简单的RTC定时唤醒(低功耗电池产品必备)

文章意义: 看到很多技术帖子讲述RTC定时唤醒功能的时候,老是需要去读取当前时间,再设定下一个闹钟唤醒时间,无形中多了很多变量和操作。所以我决定分享一种简单的RTC定时唤醒方法,适合于不需要实现具体时间获取的场合…