【编译原理】Chapter1概述

课程主要内容:程序设计语言编译程序构造的基本原理和基本实现技术

文章目录

  • 什么是编译程序
  • 为什么要学编译原理
    • 计算思维(Computational Thinking)
    • 学习意义
    • 编译原理和方法的应用
  • 编译过程
    • 概述
    • 词法分析
    • 语法分析
    • 中间代码生成
    • 优化
    • 目标代码产生
  • 编译程序的结构
    • 编译程序总框
      • 出错处理
    • 遍(pass)
    • 编译前端和后端
  • 编译程序的生成
    • 使用机器语言和汇编语言
    • 使用高级语言
      • 生成方法
      • 移植方法
      • 自编译方法
    • 编译程序自动生成
  • 参考资料

什么是编译程序

翻译程序(Translator)
把一种语言程序(源语言程序)等价地转换成另一种语言程序(目标语言程序)的程序
image.png
编译程序
一种翻译程序,实现将一种高级语言程序转换为另一种低级语言程序
image.png
编译程序分类
诊断编译程序(Diagnostic Compiler):帮助程序员调试
优化编译程序(Optimizing Compiler):专注目标代码的效率提升
交叉编译程序(Cross Compiler):编译程序所在的宿主机和机器语言程序运行的目标机不同的Compiler
可变目标编译程序(Retargetable Compiler):在不同目标机上运行时只需要重新编译与目标机相关代码的Compiler
解释程序
将源程序作为输入,边解释边执行源程序,在这个过程中并不会产生目标程序
image.png
编译VS解释
两者最大的区别在于是否产生了目标语言的程序

为什么要学编译原理

计算思维(Computational Thinking)

概念
利用计算机科学的基础概念去求解问题、设计系统和理解人类的行为
举例
编译理论与技术:理论与实践相结合的最好典范
抽象:图灵机是对计算的抽象,The Church-Turing thesis,描述高级语言词法规则的有限自动机,描述语言语法的形式文法
自动化:在计算机上实现抽象思维的结果,自动产生编译分析工具
分解(Decomposition):将大规模的复杂问题分解为若干个较小规模的、更简单的问题加以解决。编译程序引入中间语言,高级语言->中间语言->目标语言;编译被分为多个阶段;一个分析阶段分为多遍扫描
image.png
递归(Recursion):语法分析中递归下降分析,语义分析中基于树遍历的属性计算,语法制导翻译
权衡(Tradeoff):用上下文无关文法来描述和处理高级语言程序,选择优化措施

学习意义

  1. 学习编译程序构造原理和技术
  2. 更好地理解高级语言
  3. 运用编译原理和方法构造实用工具

编译原理和方法的应用

  1. HTML/XML分析:浏览器利用词法、语法分析等方法将html文本转换表现形式
    image.png
  2. 语言处理工具:词法分析、语法分析
    字处理软件如word、wps
    image.png
    image.png

编译过程

概述

用人类自然语言翻译进行类比,把英文翻译为中文
image.png

词法分析

任务
接受源程序作为输入,对构成源程序的字符串进行扫描和分解,识别出单词符号
input为源程序字符串
output为识别出来的单词符号串,用单词属性二元组表示
原则
程序设计语言的词法规则
描述工具
使用有限自动机进行形式化描述
举个例子
image.png

语法分析

任务
根据语法规则将语法分析得到的单词符号串分解为各类语法单位
output用语法结构树表示
原则
语法单位构成的语法规则
描述工具
上下文无关文法
举个例子
image.png

中间代码生成

任务
对各类语法单位按语言的定义进行初步翻译,在这一阶段需要完成静态语义检查,中间代码生成,从翻译的角度阐明语法单位的意义
output为三元式、四元式或语义分析树
原则
语义规则
描述工具
属性文法
举个例子
image.png

优化

任务
加工变换前阶段产生的中间代码,帮助最后程序最后能产生一个更高效的目标代码(高效指时间、空间上有更高的效率)
原则
程序的等价变换规则
举个例子
image.png
优化前的中间代码:400次加法,200次乘法
image.png
优化后的中间代码:304次加法
image.png

目标代码产生

任务
生成目标语言程序代码
原则
目标平台的硬件系统结构和机器指令的含义
目标代码三种形式

  1. 汇编指令代码:生成的是汇编程序,需要机器上的汇编程序进一步将其翻译为机器代码
  2. 绝对指令代码:可以运行的目标语言代码
  3. 可重定位指令代码:编译好的模块代码,需要装载、链接以执行的程序代码,基址+相对地址
    举个例子
    image.png
    这里展示的是将汇编指令翻译为可重定位的指令代码
    16为指令,前4位为操作码,两位为寄存器操作数,两位为第二操作数类型,8为为变量地址或立即数的值,L为当前模块基址

编译程序的结构

编译程序总框

image.png

出错处理

出错处理程序
发现源程序中的错误并将有关错误信息报告给用户
分类
语法错误和语义错误
语法错误
不符合语法(或词法)规则的错误
eg: 非法字符、括号不匹配、缺少;等等
语义错误
不符合语义规则的错误
eg: 说明错误,作用域错误,类型不一致等等

遍(pass)

对源程序或源程序的中间表示从头到尾扫描一遍
阶段和遍
一遍可以由若干阶段组成,如语法制导翻译(将词法分析、语法分析和语义分析即中间代码生成用用一遍来完成,其中三个阶段对应三个子程序,并由语法分析子程序驱动整个过程进行。具体而言,语法分析调用词法分析得到token,从token序列中识别出语法结构,对识别出来的语法结构调用语义分析子程序生成对应的中间代码,即完成了翻译过程)
一个阶段可分若干遍完成,如代码优化阶段(第一遍识别中间代码总体结构,第二遍进行初步优化,第三遍进行循环优化…)

编译前端和后端

image.png
编译前端
编译过程中与源语言有关与目标机无关的的部分
词法分析、语法分析、语义分析和中间代码生成、与机器无关的优化
编译后端
编译过程中与源语言无关与目标机有关的的部分
与目标机有关的优化,目标代码的产生
前端后端划分好处

  1. 使得编译程序逻辑结构清晰
  2. 将优化阶段划分为与目标机无关的优化和与目标机有关的优化可使得代码优化更加充分
  3. 有利于编译程序移植,在同一机器上编译不同源语言只需修改前端,在不同机器上编译相同源语言只需要修改后端
    体现了计算思维中的分解和权衡

编译程序的生成

使用机器语言和汇编语言

优点:针对具体机器充分发挥计算机的系统功能;生成程序执行效率高
缺点:程序难读、难写、易出错、难维护、生成效率低

使用高级语言

引入T型图描述编译关系
image.png
程序易读、易写、易维护、生成效率高

生成方法

思想:利用已有的某种语言的编译程序实现另一语言的编译程序
image.png
需要得到L2语言在A机器上的编译程序,先用L1语言书写,使用L1语言的编译程序进行编译,即可得到机器指令实现的L2语言的编译程序

移植方法

把A机器上的编译程序移植到B机器上
image.png
首先有了L语言编写的L语言到B代码的编译程序,现在只有能将L语言编译为A代码的编译程序,构造以下,现在有了能运行的将L语言编译为B代码的编译程序,再拿来编译一下,得到用B代码编写的L语言的编译程序√

自编译方法

image.png
先对 L s u b L_{sub} Lsub编写编译程序,再利用 L s u b L_{sub} Lsub编写L的编译程序,不断扩展

编译程序自动生成

LEX:词法分析程序产生器
YACC:语法分析程序产生器
image.png

参考资料

  1. 国防科技大学编译原理课程视频

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

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

相关文章

国内crm解决方案的主要提供商有哪些?对比7家

目前国内CRM服务商1410家,今年1-7月CRM服务商新注册19家。如何从众多服务商中挑选出合适的一家,无疑是一项耗时耗力的大工程。为此,本文将为根据国内外知名机构、媒体、网站发布、百度指数、行业知名度等维度考量,选择出7大CRM系统…

城市网吧视频智能监控方案,实现视频远程集中监控

网吧环境较为复杂,电脑设备众多且人员流动性大,极易发生人员或消防事故,亟需改变,TSINGSEE青犀AI智能网吧视频监管方案可以帮助实现对网吧环境和用户活动的实时监控和管理。 1、视频监控系统 在网吧内部布置高清摄像头&#xff0…

Microsoft发布了一份关于其产品安全修复的 11 月报告。

👾 平均每天有 50 多个漏洞被发现,其中一些会立即被网络犯罪分子利用。我们把那些现在很受网络犯罪分子欢迎,或者根据我们的预测,在不久的将来可能会被大量利用的漏洞称为趋势漏洞。 在攻击者开始利用这些漏洞之前 12 小时&#…

DocCMS keyword SQL注入漏洞复现 [附POC]

文章目录 DocCMS keyword SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 DocCMS keyword SQL注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关技术从事非法测…

蓝桥杯 map

map 代码示例 #include<iostream> #include<map> using namespace std; int main(){//创建并初始化mapmap<int,string> myMap{{1,"Apple"},{2,"Banana"},{3,"Orange"}} ;//插入元素myMap.insert(make_pair(4,"Grapes&qu…

【云原生-Kurbernetes篇】K8s的存储卷/数据卷+PV与PVC

这是一个目录标题 一、Kurbernetes中的存储卷1.1 为什么需要存储卷&#xff1f;1.2 存储卷概述1.2.1 简介1.2.2 volume字段 1.3 常用的存储卷类型1.3.1 emptyDir&#xff08;临时存储卷&#xff09;1.3.2 hostPath&#xff08;节点存储卷&#xff09;1.3.3 nfs1.3.4 cephfs 二、…

大功率电源芯片WD5030L

电源管理芯片作为现代电子设备中最关键的元件之一&#xff0c;直接影响着设备的性能和效率。而大功率电源芯片作为电源管理芯片中的一种&#xff0c;其性能和应用领域更加广泛。本文将介绍一款具有宽VIN输入范围、高效率和多种优良性能的大功率电源芯片WD5030L&#xff0c;并探…

SpringCloud-Gateway修改Response响应体,并解决大数据量返回不全等问题

官网相关案例&#xff1a; Spring Cloud Gatewayhttps://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-modifyresponsebody-gatewayfilter-factory ModifyRequestBodyGatewayFilterFactory类: https://github.com/spring-cloud/spring-cloud-gate…

五分钟k8s实战-Istio 网关

istio-03.png 在上一期 k8s-服务网格实战-配置 Mesh 中讲解了如何配置集群内的 Mesh 请求&#xff0c;Istio 同样也可以处理集群外部流量&#xff0c;也就是我们常见的网关。 其实和之前讲到的k8s入门到实战-使用Ingress Ingress 作用类似&#xff0c;都是将内部服务暴露出去的…

kafka分布式安装部署

1.集群规划 2.集群部署 官方下载地址&#xff1a;http://kafka.apache.org/downloads.html &#xff08;1&#xff09;上传并解压安装包 [zhangflink9wmwtivvjuibcd2e package]$ tar -zxvf kafka_2.12-3.3.1.tgz -C ../software/&#xff08;2&#xff09;修改解压后的文件…

qt笔记之qml和C++的交互系列(一):初记

code review! —— 杭州 2023-11-16 夜 文章目录 一.qt笔记之qml和C的交互&#xff1a;官方文档阅读理解0.《Overview - QML and C Integration》中给出五种QML与C集成的方法1.Q_PROPERTY&#xff1a;将C类的成员变量暴露给QML2.Q_INVOKABLE()或public slots&#xff1a;将C类…

网络编程TCP/UDP通信

1 网络通信概述 1.1 IP 和端口 所有的数据传输&#xff0c;都有三个要素 &#xff1a;源、目的、长度。 怎么表示源或者目的呢&#xff1f;请看图 所以&#xff0c;在网络传输中需要使用“IP 和端口”来表示源或目的。 1.2 网络传输中的 2 个对象&#xff1a;server 和 cl…

Linux操作系统 - 进程控制

目录 进程创建 进程退出 进程等待 进程替换 进程创建 在操作系统中&#xff0c;除了系统启动之后的第一个进程(根进程&#xff0c;1号进程)由系统来创建外&#xff0c;其余进程都必须由已存在的进程来创建。其中&#xff0c;这个新创建的进程叫做子进程&#xff0c;而创建…

Nginx(四) absolute_redirect、server_name_in_redirect、port_in_redirect 请求重定向指令组合测试

本篇文章主要用来测试absolute_redirect、server_name_in_redirect和port_in_redirect三个指令对Nginx请求重定向的影响&#xff0c;Nginx配置详解请参考另一篇文章 Nginx(三) 配置文件详解 接下来&#xff0c;在Chrome无痕模式下进行测试。 测试1&#xff1a;absolute_redi…

微软Surface/Surface pro笔记本电脑进入bios界面

微软Surface笔记本电脑进入bios界面 方法一推薦這種方法&#xff1a;Surface laptop 进BIOS步骤 开机后&#xff0c;不停按音量键进bios界面。 方法二&#xff1a;Surface Book、Surface Pro进bios步骤 1、关闭Surface&#xff0c;然后等待大约10秒钟以确保其处于关闭状态。…

百度智能小程序源码系统:打造极致用户体验的关键 带完整搭建教程

大家好啊&#xff0c;今天罗峰来给大家分享一款百度智能小程序系统源码。一起来看看吧。 百度智能小程序源码系统是百度从做智能小程序的第一天开始就致力于打造真正开源开放的生态的产物。作为目前业内唯一真正开源的平台&#xff0c;百度智能小程序将开放性放在重要位置&…

大数据毕业设计选题推荐-机房信息大数据平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

win10查看wifi密码

文章目录 标题win10查看wifi密码命令方式窗口 标题win10查看wifi密码 命令方式 # name 为指定的wifi名称 netsh wlan show profiles name"TP-LINK_1946" keyclear窗口

春秋云境靶场CVE-2021-41402漏洞复现(任意代码执行漏洞)

文章目录 前言一、CVE-2021-41402描述二、CVE-2021-41402漏洞复现1、信息收集1、方法一弱口令bp爆破2、方法二7kb扫路径&#xff0c;后弱口令爆破 2、找可能可以进行任意php代码执行的地方3、漏洞利用找flag 总结 前言 此文章只用于学习和反思巩固渗透测试知识&#xff0c;禁止…