【编译原理】Chapter1概述

news2024/12/28 20:15:47

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

文章目录

  • 什么是编译程序
  • 为什么要学编译原理
    • 计算思维(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. 国防科技大学编译原理课程视频

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

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

相关文章

腾讯云服务器新用户购买优惠多少钱?腾讯云新用户购买优惠

对于新用户来说,腾讯云服务器更是提供了一系列的优惠活动,让你在购买时享受到更多的优惠。那么,腾讯云服务器新用户购买优惠多少钱呢?接下来,让我们一起来了解一下。 腾讯云双十一领9999代金券 https://1111.mian100.…

vscode终端npm install报错

报错如下: npm WARN read-shrinkwrap This version of npm is compatible with lockfileVersion1, but package-lock.json was generated for lockfileVersion2. Ill try to do my best with it! npm ERR! code EPERM npm ERR! syscall open npm ERR! errno -4048…

Alibaba Nacos注册中心实战

为什么需要注册中心 思考:网络请求,如果服务提供者发生变动,服务调用者如何感知服务提供者的ip和端口变化? // 微服务之间通过RestTemplate调用,ip:port写死,如果ip或者port变化呢? String ur…

mysql之squid代理服务器

(一)squid代理服务器 1、nginx做代理服务器 (1)反向代理(负载均衡) (2)缓存 (3)nginx无法做正向,通过proxy_pass进行反向代理 2、squid&…

Linux操作系统 - 进程控制

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

京东数据挖掘(京东运营数据分析):2023年宠物行业数据分析报告

随着社会经济的发展,人均收入水平逐渐提高,使得宠物成为越来越多家庭的成员,宠物数量不断增长。伴随养宠人群的增多,宠物相关产业的发展也不断升温,宠物经济规模持续增长。 根据鲸参谋平台的数据显示,在宠物…

五分钟k8s实战-Istio 网关

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

树莓派通过网线连接电脑(校园网也能连接),实现SSH连接

前言 之前通过串口登入树莓派,太麻烦,通过网络登入树莓派,学校校园网又连接不了,想起来可以使用网线连接树莓派和电脑。 目录 树莓派通过网线连接电脑思路分析 树莓派通过网线连接电脑实现 1.硬件需求 2.打开Windows的网络 …

【7】Spring Boot 3 集成组件:缓存组件 spring cache + spring data redis

目录 【7】Spring Boot 3 集成组件:缓存组件 spring cache spring data redis什么是缓存抽象声明式注解JSR-107对应SpEL上下文数据 引入依赖cache 支持的缓存类型缓存类型配置NONESIMPLEREDIS自定义配置 CAFFEINE Hazelcast...总结 个人主页: 【⭐️个人主页】 需要…

打开PDF文件之后不能编辑,有哪些原因?

打开PDF文件之后发现没有办法编辑PDF文件,都有哪些原因呢? 首先我们可以考虑一下,PDF文件中的内容是否是图片,如果确认是图片文件,那么我们想要编辑,就可以先使用PDF编辑器中的OCR扫描功能,将图…

【Python】Pandas(学习笔记)

一、Pandas概述 1、Pandas介绍 2008年WesMcKinney开发出的库,专门用于数据挖掘的开源python库 以Numpy为基础,借力Numpy模块在计算方面性能高的优势 基于matplotib,能够简便的画图 独特的数据结构 import pandas as pd2、Pandas优势 便…

springcloud失物招领网站源码

开发技术: jdk1.8,mysql5.7,idea,nodejs,vscode springcloud springboot mybatis vue elementui 功能介绍: 用户端: 登录注册 首页显示搜索失物,轮播图,最新发布的…

传统广电媒体为何选择上云?有何优势?

随着现在互联网和科技的发展,现在更多的行业都搭上了科技这辆快车快速的完成了转型,那么在传统的广电媒资行业他们目前有哪些痛点呢?传统广电媒体转型发展现状是什么?企业如何数字化转型?企业上云的优势有哪些&#xf…

OpenCV快速入门:基本操作

文章目录 1. 像素操作1.1 像素统计1.2 两个图像之间的操作1.2.1 图像加法操作1.2.3 图像加权混合 1.3 二值化1.4 LUT(查找表)1.4.1 查找表原理1.4.2 代码演示 2 图像变换2.1 旋转操作2.1.1 旋转的基本原理2.1.2 代码实现 2.2 缩放操作2.3 平移操作2.3.1 …

【python】均值、中值和高斯滤波详解和示例

本文对均值、中值和高斯滤波进行详解,以帮助大家理解和使用。 这里写目录标题 均值滤波中值滤波高斯滤波核大小为(9,9)核大小为(51,51) 小结 下面是示例中使用的原图。 均值滤波 均值滤波是一种简单的平滑滤波器&…

简单的用Python实现一下,采集某牙视频,多个视频翻页下载

前言 表弟自从学会了Python,每天一回家就搁那爬视频,不知道的以为是在学习,结果我昨天好奇看了一眼,好家伙,在那爬某牙舞蹈区,太过分了! 为了防止表弟做坏事,我连忙找了个凳子坐下&…

k8s-部署Redis-cluster(TLS)

helm pull bitnami/redis-cluster v8.3.8拉取源码生成证书 git clone https://github.com/redis/redis.git #文档 https://redis.io/docs/management/security/encryption/#getting-started生成你的TLS证书用官网的工具生成 1 Run ./utils/gen-test-certs.sh 生成根CA和服务…

【libGDX】ApplicationAdapter生命周期

1 前言 libGDX 中,用户自定义的渲染窗口需要继承 ApplicationAdapter 类,ApplicationAdapter 实现了 ApplicationListener 接口,但实现的方法都是空方法,方法释义如下。 public interface ApplicationListener {// 应用首次创建时…

【Rust】快速教程——冻结表达式

前言 以前谁是魔我杀谁,现在我杀谁谁就是魔。——《拔魔》 \;\\\;\\\; 目录 前言Rust基本知识结构体元组结构体局部作用域冻结字面量Vec元素的类型由第一个push进的类型确定type别名from和intoTryFrom和TryInto 表达式 Rust基本知识 结构体 #[derive(Debug)] str…

C语言之深入指针及qsort函数(五)(详解介绍)

C语言之深入指针 在这篇博客看不懂的可以看看这篇C语言之深入指针(四)在上篇博客中介绍了: 函数指针变量函数指针数组简易计算器的实现\ 文章目录 C语言之深入指针1 回调函数2 qsort函数的使用2.1 使用冒泡排序排序整型数组2.2 使用qsort函数…