编译原理笔记(一)引论

文章目录

    • 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.mfbz.cn/a/21719.html

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

相关文章

网络分析和机器学习

文章目录 网络分析1.Introduction to networks and graph foundations and algorithmsNetwork types (social/bio/comp), Euler/Hamilton, Graphs (matrix/adj)Breadth-first search (shortest paths), Depth-first search (conn. compnts) 2. Emergent global / local network…

Trie与可持久化Trie

Trie Trie,也称为字典树或前缀树,是一种用于高效存储和检索字符串的树形数据结构。它的主要特点是利用字符串的公共前缀来减少存储空间和提高查询效率。下面是对 Trie 的常见操作的介绍: 插入(Insertion)&#xff1a…

Deformable DETR 论文学习

1. 解决了什么问题? DETR 去除了目标检测算法中的人为设计,取得了不错的表现。但是其收敛速度很慢,对低分辨率特征识别效果差: 模型初始化时,注意力模块给特征图上所有的像素点分配的权重是均匀的,就需要…

元宇宙应用领域-工业

元宇宙是指虚拟空间的总称,在这个虚拟空间中,用户可以像在现实世界一样,通过虚拟现实技术进行交互和体验。元宇宙应用领域非常广泛,如工业、游戏、娱乐、教育、医疗、房地产等。 工业领域中,元宇宙可用于在设计阶段帮…

物联网应用普及正在改变我们的生活

物联网(Internet of Things,IoT)指的是通过互联网连接各种物品、设备和传感器,实现物品之间的互联互通,形成智能化、自动化的数据交互和服务体系。简单来说,就是将各类物品通过互联网连接,实现互…

新榜 | “淄博”现象专项观察报告

在过去的一个月中,淄博烧烤的相关话题霸屏网络,这些媒介话题里承载了多少受众的向往与想象? 根据2022年淄博市文旅局公开年报,去年,淄博官方就着力融媒体,在抖音、快手等平台创新使用“淄博到底有多牛”主题…

智能图像处理技术:开启未来视觉时代

写在前面技术论坛■ 智能文档图像处理技术■ 大模型时代的文档识别与理解■ 篡改文本图像的生成与检测 圆桌讨论未来愿景 写在前面 文档 是人们在日常生活、工作中产生的信息的重要载体,各领域从业者几乎每天都要与金融票据、商业规划、财务报表、会议记录、合同、…

react类组件生命周期基础总结

组件的生命周期是指组件从被创建到挂载到页面中运行起来,再到组件不用时卸载的过程,只有类组件才有生命周期(类组件 实例化 函数组件 不需要实例化) 生命周期新版本和旧版本的对比图如下: 生命周期(constr…

GPT专业应用:撰写工作简报

●图片由Lexica 生成,输入:Workers working overtime 工作简报,作为一种了解情况、沟通信息的有效手段,能使上级机关和领导及时了解、掌握所属部门的政治学习、军事训练、行政管理等方面的最新情况;同时,能…

非暴力沟通模型

非暴力沟通模型 非暴力沟通的创始人是马歇尔.卢森堡,师从人本主义心理学之父卡尔.罗杰斯。《非暴力沟通》一书入选香港大学推荐的50本必读书籍之列。 模型介绍 非暴力沟通(英文名称:NonviolentCommunication,简称NVC)…

运行时栈帧结构与方法调用

1 运行时栈帧结构 Java虚拟机以方法作为最基本执行单元,“栈帧”则是用于支持虚拟机进行方法调用和方法执行背后的数据结构。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。 1.1 局部变量表 局部变量表的容量以变量槽为最小单位。 Java…

JSDoc 拥抱 Javascript

JSDoc 在 vs code 已经内置了. 可以在 js 文件的开头添加 // ts-check 即可. 在注释中标注来实现一些 ts 的功能. JSDoc 支持以下注解. Types typeparam (or arg or argument)returns (or return)typedefcallbacktemplate Classes Property Modifiers public, private, p…

Windows Server 2016 中文版、英文版下载 (updated May 2023)

Windows Server 2016 中文版、英文版下载 (updated May 2023) Windows Server 2016 Version 1607,2023 年 5 月更新 请访问原文链接:https://sysin.org/blog/windows-server-2016/,查看最新版。原创作品,转载请保留出处。 作者…

ChatGPT + MindShow 制作PPT

🍏🍐🍊🍑🍒🍓🫐🥑🍋🍉🥝 ChatGPT MindShow 制作PPT 文章目录 🍐具体操作🐳结语 🍐具体操作 ChatGP…

2023—Unity打包Pico4(3)全流程(Pico插件)

一、项目选择了2021.3.0版本的URP,把项目Build成Android 二、打开Project Setting→ 安装最下面的XR Plugin Management 安装完成后的界面,此时还没有Pico选项出现 三、我们需要在该网站下载Pico的SDK包 picoxr/VRTK-Support (github.com) 解压该文件到…

python + windQuant:挑选公司

给定一些k线选股指标,如何挑选符合条件的公司,以python windquant为例? 【申明:本例只用来作为python学习交流之用,切勿以此作为投资的选股条件】 0、用以下条件挑选公司: 仅作示例用: 【1】…

qiankun + Vite + React + Vue + Angular 快速构建前端微服务

文章目录 一、主应用 vite二、微应用 react三、微应用 vue四、微应用 angular五、项目地址 一、主应用 vite npm npm create vitelatestyarn yarn create vite选择是否继续 Need to install the following packages:create-vite3.2.1 Ok to proceed? (y) y项目名称 Project…

nodejs进阶(3)—路由处理

1. url.parse(url)解析 该方法将一个URL字符串转换成对象并返回。 url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) 接收参数: urlStr url字符串 parseQueryString 为true时将使用查询模…

四月成功上岸阿里,年后准备了两个月,要个21k应该不过分吧~

先说下我基本情况,本科不是计算机专业,现在是学通信,然后做图像处理,可能面试官看我不是科班出身没有问太多计算机相关的问题,因为第一次找工作,阿里的游戏专场又是最早开始的,就投递了&#xf…