【编译原理】课程一:编译原理入门

2023-11-11

目录

1.为什么要学习编译原理

2.什么是编译原理

3.编译与计算机程序设计语言的关系

3.1.程序设计语言的转换方式

3.2.编译的转换过程

3.3.编译器在语言处理系统中的位置

3.4.编译系统的结构

3.4.1.词法分析(扫描)

3.4.2.语法分析(parsing)

3.4.1.1.语法分析的定义

3.4.1.2.语法分析的规则

3.4.1.3.语法分析的方法

3.4.1.4.语法树

3.4.1.4.语义分析

3.4.1.4.1. 收集标识符的属性信息

3.4.1.4.2. 语义检查

3.4.3.中间代码生成

3.4.3.1.常用的中间代码表示形式

3.4.4.代码优化

3.4.5.目标代码生成

3.4.6.其他

3.4.6.1.出错处理

3.4.6.2.遍

3.4.7.编译程序生成

4.参考


1.为什么要学习编译原理

        作为程序员,不管是前端开发工程师还是后端开发工程师,编译技术都与我们的工作息息相关。在实际工作中也经常会碰到需要编译技术的场景。比如,前端开发工程师想要了解TypeScript是如何把一门语言翻译成另一门语言的,以及babel是如何编译JavaScript的等等。学习编译技术有助于提升我们的职场竞争力,更有助于程序员在技术的道路上走的更远。 那么学习完本篇文章你会对编译原理有个初步的认识,比如:

  • 知道为什么要学习编译
  • 了解编译原理和我们日常开发中使用的开发语言的关系
  • 了解编译在语言系统中所处的位置及编译系统的结构
  • 了解词法分析、语法分析、语义分析这些我们工作中经常听到的概念等等
  • 更重要的是知道我们编写的代码是如何被计算机识别并执行的。

2.什么是编译原理

        编译原理是介绍如何将高级程序设计语言转换成计算机硬件能识别的机器语言,以便计算机进行处理

3.编译与计算机程序设计语言的关系

        日常开发过程中我们使用的语言一般都是高级语法比如 JAVA、Python、PHP、JavaScript等等,但是计算机只能识别0、1这样的机器码。那么这些高级语言是如何翻译成机器能识别的0、1等呢?这就用的了编译,首先我们通过下面这幅图看下编译与计算机程序语言的关系,有助于我们直观的了解编译的作用。

注意:每种机器都对应一种汇编语言

3.1.程序设计语言的转换方式

翻译:指把某种语言的源程序,在不改变语义的条件下,转换成另一种语言程序即目标语言程序

真正的实现有两种方式,编译及解释

  • 编译:专指由高级语言转换为低级语言,整个程序翻译。常用的例如: c、c++,delphi,Fortran、Pascal、Ada
  • 解释:接受某种高级语言的一个语句输入,进行解释并控制计算机执行,马上得到这个句子的执行结果,然后再接受下一个语句。类似口译,一句一句进行解释。常用的例如:python

解释以源程序作为输入,不产生目标程序,一边解释一边执行。优点:直观易懂,结构简单,易于实现人机对话。缺点:效率低(不产生目标程序,每次都需要重新执行,速度慢)

3.2.编译的转换过程

  • 编译->运行
  • 编译->汇编->运行

3.3.编译器在语言处理系统中的位置

        了解了编译与程序设计语言的关系,那么我们接下来再来看下编译器在语言处理系统中所处位置,如下图

3.4.编译系统的结构

        那么机器是如何把高级语言翻译为汇编语言程序或机器语言程序的呢?

        我们先来看下人工进行英文翻译的例子,这里引用的哈工大编译原理中的图示

图中的中间表示很重要主要起到了一个桥梁的作用,比如图中的中间表示可以使用各种语言表示。

根据上图可以看出要进行语义分析首先需要划分句子成分,那么我们是如何划分句子成分的呢?

  1. 首先通过词法分析分析出句子中各个单词的词性或者词类
  2. 接下来通过语法分析识别出句子中的各类短语从而获得句子的结构
  3. 然后进行语义分析根据句子结构分析出句子中各个短语在句子中充当什么成分,从而确定各个名词性成分同各个核心谓语动词间的关系语意关系
  4. 最后给出中间表示形式

        实际上编译器在工作的时候也是经过了以上几个步骤,我们成为阶段(计算机的逻辑组织方式,在实现过程中多个阶段可能会被组合在一起实现),可以分为两大部分:分析源语言、生成目标代码,在编译器中他们分别对应编译器的前端和后端两个部分。编译器的结构如下图

        了解了编译器的结构,让我们从编译器的前端开始讲起,看看词法分析、语法分析、语义分析等各个阶段都做了什么。

3.4.1.词法分析(扫描)

        编译的第一个阶段,从左到右逐行扫描源程序的字符,识别出各个单词(是高级语言中有是在意义的最小语法单元,由字符构成),确定单词的类型。将识别的单词转换成统一的机内表示即词法单元 简称Token

token:<种别码,属性值>

名字解释

  • 一词一码:例如,关键字是唯一的且事先可以确定,为每个关键字分配一个种别码
  • 多词一码:例如,所有的标示符统一作为一类单词分配同一个种别码,为了区分不同的标示符,用token的第二个分量“属性值”存放不同标示符具体的字面值
  • 一型一码:不同类型的常量他们的构成方式是不同的,例如,我们为每种类型的常量分配一个种别码,为了区分同一类型下的不同常量,也用token的第二个分量“属性值”存放每个常量具体的值

下面图中是一个词法分析后得到的token序列的例子

描述词法规则的有效工具是正规式有限自动机正规式:用来确定单词是否和程序语言规范。有限自动机:通过有限自动机进行单词和正规式比较

3.4.2.语法分析(parsing)

3.4.1.1.语法分析的定义

语法分析器从词法分析器输出的token序列中识别出各类短语,并构造语法分析树(parse tree),语法分析树描述了句子的语法结构

3.4.1.2.语法分析的规则

语法规则又称文法,规定了单词如何构成短语、句子、过程和程序。

语法规则的标示如下,含义是A定义为B或者C

BNF:A::=BC

<句子>::=<主><谓><宾>

<主>::=<定><名>

来看下赋值语句的语法规则:

  • A::=V=E
  • E::=T|E+T
  • T::=F|T*F
  • F::=V|(E)|C
  • V::=标示符
  • C::=常数

即由标示符或者常数的表达式进行加减乘除运算

3.4.1.3.语法分析的方法

推导(derive)和归约(reduce)

  • 推导:最左推导、最右推导
  • 归约:最右归约、最左归约,推导的逆过程就是归约

最右推导、最左归约:

最左推导、最右归约:

3.4.1.4.语法树

        计算机通过语法树来进行分析,即语法分析过程也可以用一颗倒着的树来标示,这颗树叫语法树。正确的语法树叶子节点数必须是表达式的符号,例如

赋值语句的分析树:

变量声明语句的分析树:

首先看下变量声明语句的文法(文法是由一系列规则构成的):

<D> -> <T> <IDS>;
<T> -> int | real | char | bool
<IDS> -> id | <IDS>, id

3.4.1.4.语义分析

语义的任务主要有两个

3.4.1.4.1. 收集标识符的属性信息
  • 种属(Kind): 简单变量、复合变量(数组、记录、...)、过程、...
  • 类型 (Type):整型、实型、字符型、布尔型、指针型、...
  • 存储位置、长度

  • 作用域
  • 参数和返回值信息,参数个数、参数类型、参数传递方式、返回值类型、...

        语义分析阶段收集的标识符的信息都会存储在一个符号表里,每个标识符都对应符号表中的一条记录,记录的每个字段记录标识符的每个属性,符号表通常带有一个字符串表用来存放程序中用到的标识符和字符常数,Name 就会被分为两个部分,一部分存放标识符在字符串表中的起始位置,另一部分用来存储标识符的长度,符号表如下图:

除了符号表还有常量表(登记各类常量表);标号表(登记标号的定义和应用,不常用目标);入口名表(登记过程的层号、程序符号表入口等),各种表的生成大部分在词法分析阶段但是在后面各个阶段都有维护;中间代码表

3.4.1.4.2. 语义检查
  1. 变量或过程未经声明就使用
  2. 变量或过程名重复声明
  3. 运算分量类型不匹配
  4. 操作符与操作数之间的类型不匹配
  • 数组下标不是整数
  • 非数组变量使用数组访问操作符
  • 非过程名使用过程调用操作符
  • 过程调用的**参数类型或数目不匹配 **
  • 函数返回类型有误

3.4.3.中间代码生成

        通常和语义分析一起实现。对语法分析识别出的各类语法范畴,分析他的含义,进行初步翻译,产生介于源代码和目标代码质检的一种代码

3.4.3.1.常用的中间代码表示形式

  • 三地址码 (Three-address Code):三地址码由类似于汇编语言的指令序列组成,每个指令最多有三个操作数(operand)
  • 语法结构树/语法树 (Syntax Trees)
  • 逆波兰式

三地址指令的表示:

  • 四元式 (Quadruples),(op, y, z, x)
  • 三元式 (Triples)
  • 间接三元式(Indirect triples)

下面图中展示了一个中间代码生成的例子

3.4.4.代码优化

        对前面生成的中间代码进行加工变换,以便在最后极端产生更为高效的目标代码 ,需要遵循等价变换的原则,优化的方面包括:公共子表达式的提取、合并已知量、删除无用语句、循环优化。

3.4.5.目标代码生成

把经过优化的中间代码转化成特定机器上的低级语言

目标代码的形式:

  • 绝对指令代码:可立即执行的目标代码
  • 汇编指令代码:汇编语言程序,需要经过汇编程序汇编后才能运行
  • 可重定位指令代码:先将各目标模块连接起来,确定变量、常数在主存中的位置,装入主存后才能成为可以运行的绝对指令代码

3.4.6.其他

3.4.6.1.出错处理

        如果源程序有错误,编译程序应设法发现错误并报告给用户。由专门的出错处理程序来完成。 错误类型:

  • 语法错误:在词法分析和语法分析阶段检测出来
  • 语义错误:一般在语义分析阶段检测
  • 逻辑错误:不可检测,比如死循环,一般不处理因为没办法在编译阶段检测出来

3.4.6.2.遍

        指对源程序或源程序的中间结果从头到尾扫描一次,并做有关的加工处理,生成新的中间结果或目标代码。遍与阶段的含义毫无关系

        多遍扫描: 优点:节省内存空间,提高目标代码的质量,使编译的逻辑结构清晰。缺点:编译时间长。在内存许可的情况下还是遍数尽可能少较好

3.4.7.编译程序生成

  1. 直接用机器语言编写编译程序
  2. 用汇编语言编写编译程序,编译程序核心部分常用汇编语言编写
  3. 用高级语言编写编译程序,这也是普遍采用的方法
  4. 自编译
  5. 编译工具 LEX(语法分析)与YACC(用于自动生成LALR分析表)
  6. 移植(同种语言的编译程序在不同类型的机器之 间移植)

在某机器上为某种语言构造编译程序要掌握以下三方面:

  • 源语言
  • 目标语言
  • 编译方法

4.参考

想初步了解编译原理?看这篇文章就够了 - 知乎 (zhihu.com)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【编译原理】课程一:编译原理入门 的相关文章

  • 【编译原理】课程一:编译原理入门

    目录 1 为什么要学习编译原理 2 什么是编译原理 3 编译与计算机程序设计语言的关系 3 1 程序设计语言的转换方式 3 2 编译的转换过程 3 3 编译器在语言处理系统中的位置 3 4 编译系统的结构 3 4 1 词法分析 扫描 3 4
  • 为什么每个程序执行都有内核地址空间和程序地址空间?

    为什么每个用户态的程序映射到虚拟地址空间 都需要有内核地址空间和程序地址空间呢 因为程序地址空间最终都会调用系统调用 也就是内核的东东 所以每个程序要想执行 就必须有内核地址空间 也必须有程序地址空间 所用的application程序要想使
  • 编译原理 CS-143(更新至week4)

    编译原理 CS 143 Pre Course Survey Navigation Your Course 01 01 Introduction 8m20s 01 02 Structure of a Compiler 13m53s 编译器结构
  • windgb调试

    reference http hi baidu com lewutian blog item 191047882b9c399fa5c27261 html 调试前的必备工作 在开始调试前首先要做的工作是设置好符号 Symbols 路径 没有符
  • IDA使用之旅(一)用IDA查看最简单的sys文件

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家拍砖 本系列内容是我根据 知其所以然论坛 博主录制的学习视频 做的笔记 使用的IDA软件版本 IDA pro 5 5 参考下载地址 http w
  • ARM中的程序状态寄存器(CPSR)

    31 30 29 28 27 8 7 6 5 4 3 2 1 0 N Z C V 保留 I F T M4 M3 M2 M1 M0 N Negative Less Than I IRQ disable Z Zero F FIQ disable
  • 汇编小作业(3) 十进制数的平方根

    用子程序结构编程 从键盘输入一个十进制数 对其开平方后分别将其平方根和余数以十进制数的形式显示 DATA SEGMENT SUM DW 2 DUP BUF DB 7 DUP DATA ENDS stack segment 定义栈段 保存di
  • 编译原理实验二:Bison

    编译原理实验二 Bison 实验要求 1 了解Bision基础知识 如何将文法产生式转换为Bison语句 2 阅读 src common SyntaxTree c 对应头文件 include SyntaxTree h 理解分析树生成的过程
  • 语法分析—自上而下分析

    1 美图 2 位置 语法分析器的功能 语法分析的任务是分析一个文法的句子结构 语法分析器的功能 按照文法的产生式 语言的语法规则 识别输入符号串是否为一个句子 合式程序 语法分析的方法 不行 看不懂 我太难了 不看了
  • libtool的作用及应用

    gcc library makefile archive command object 注意 本文为转载 原文也是转载 但是为了尊重他人得劳动成果 我将将转载网址贴出来 libtool常见于autoconf automake 单独用的例子很
  • dosbox+masm汇编环境的安装和使用 + dosbox进行debug调试教程

    1 dosbox masm汇编环境的安装和使用 https blog csdn net yuzuruhanyu article details 80287419 2 dosbox进行debug调试教程 https blog csdn net
  • 编译原理-总概

    语言执行过程 代码 解释器编译器 机器代码 cpu执行 编译型语言 在程序在执行之前需要一个专门的编译过程 通过编译器把程序编译成为可执行文件 再由机器运行这个文件 运行时不需要重新翻译 直接使用编译的结果就行了 解释型语言 是一边执行一边
  • 编译原理三大经典书籍(龙书 虎书 鲸书)

    1 龙书 Dragon book 英文名 Compilers Principles Techniques and Tools 作者 Alfred V Aho Ravi Sethi Jeffrey D Ullman 中文名 编译原理技术和工具
  • 【Python】代码实现LL(1),LR(1)上下文无关文法(Stack()类)

    任务要求 针对书上第三章中的表达式文法 采用LL 1 LR 1 进行分析 相关文法 需要进行消除左递归等操作 顺手分享一下课本资源好了 可能不是最新版 排版略有点别扭 后文的书上内容就是指这本书 编译原理 陈意云 文字版 提取码 e0ag
  • asm:常见指令大全

    常见指令大全 算数指令 INC 指令 DEC 指令 ADD 指令 SUB指令 MUL指令 IMUL指令 DIV指令 IDIV指令 逻辑指令 AND指令 OR指令 XOR 指令 TEST指令 NOT指令 交换指令 xchg 比较指令 CMP指
  • arm64汇编b带条件跳转指令和bl跳转带返回ret指令

    文章目录 ret返回指令 B 跳转指令 BL 带返回的跳转指令 B指令可以接上后缀 用来和cmp比较后待条件的跳转 ret返回指令 cpu遇到ret之后 会把lr赋值给pc 这样cpu执行了pc里的地址的指令 就是执行调用这个函数的下一条指
  • 自下而上分析方法-算符优先,LR(0),SLR,LR(1),LALR大全

    文章目录 自下而上分析法 一 规范规约 相关定义 短语 直接短语 句柄 素短语 最左素短语 语法树表示 示例 规范规约 二 语法分析器 三 算符优先分析算法 算符文法 1 算符优先文法 2 FIRSTVT P 和LASTVT P 1 FIR
  • 程序员的自我修养——链接、装载与库

    1 温故而知新 操作系统概念 北桥 连接高速芯片 系统调用接口 以软件中断的方式提供 如Linux使用0x80号中断作为系统调用接口 多任务系统 进程隔离 设备驱动 直接使用物理内存的弊端 地址空间不隔离 内存使用效率低 程序运行的地址不确
  • C语言深入学习--checklist4:宏、枚举、switch

    宏 1 宏的本质是什么 函数 语句 类型定义 或者其它 预编译器的文本替换 1 你知道语言设计者为什么设计宏吗 这些原因目前是否成立 在 C程序中 可以用宏代码提高执行效率 宏代码本身不是函数 但使用起来象函数 预处理器用复制宏代码的方式代
  • [原创]C++98升级到C++20的复习旅途-从汇编及逆向角度去分析“constexpr“关键字

    简介 常用网名 猪头三 出生日期 1981 XX XX QQ 643439947 个人网站 80x86汇编小站 https www x86asm org 编程生涯 2001年 至今 共22年 职业生涯 20年 开发语言 C C 80x86A

随机推荐

  • counterfactual generation network——因果推断用于提高分类器鲁棒性

    因果推断本是一个小众方向 但是感觉近几年突然火了起来 本文便是2021年发表于ICLR的一篇将因果推断用于提高图像分类的文章 本文出发点 先说一下本文针对的问题 我们知道图像分类任务就是将输入网络的图像尽量映射成我们想要的输出结果 通常是一
  • 2021江西省icpc(A,B,D,F,G,H,J,K,L)

    K Many Littles Make a Mickle 签到题 任意门 先从最简单的签到题开始吧 include
  • IPIDEA的使用方式

    文章目录 一 平台介绍 1 前言 2 简单介绍 3 适用场景 4 特色功能 二 获取代理ip池 1 注册信息 2 获取代理API 3 获取代理信息并检测代理可用性 三 代理爬取数据 1 编写功能代码 2 插入到代理代码 四 使用感受 一 平
  • Mac OS X 上干净卸载软件

    英文参考文章地址 http www cultofmac com 90060 how to completely uninstall software under mac os x macrx 在Mac OS X上卸载软件一般都很简单 在 应
  • 【Sentry使用】自定义transaction

    在使用Sentry时 你会发现有两种颜色的柱形图 一个是紫色的 在上面 一个是灰色的 在下面 这两类柱形图分别代表error和transaction 而在Python脚本环境下 不会自动进行transaction的记录 也就是说只会在出现异
  • YOLO的XML和TXT标注文本解释

    XML和TXT标注文本解释 转换函数 xml 左上角坐标和右下角坐标 转换为txt txt 中心点坐标 比例 宽 比例 高 比例 0到1之间 转换函数
  • aix安装bff_AIX的yum安装

    之前在AIX上安装yum是按照步骤一步步来做 今天找到一个脚本 可以很方便的执行脚本来做 ftp ftp software ibm com aix freeSoftware aixtoolbox ezinstall ppc 可惜的是很多时候
  • 中小研发团队架构实践之统一应用分层

    中小研发团队架构实践之统一应用分层 原文 中小研发团队架构实践之统一应用分层 一 写在前面 应用分层这件事情看起来很简单 但每个程序员都有自己的一套 哪怕是初学者 如何让一家公司的几百个应用采用统一的分层结构 并得到大部分程序员的认同呢 这
  • RabbitMQ死信队列

    目录 一 概念 二 出现死信的原因 三 实战 一 代码架构图 二 消息被拒 三 消息TTL过期 四 队列达到最大长度 一 概念 先从概念解释上搞清楚这个定义 死信 顾名思义就是无法被消费的消息 字面意思可以这样理解 一般来说 produce
  • 同心聚合力,开局谋发展——云孚科技参加哈工大青企联首届年会

    3月2日 云孚科技CEO张文斌先生受邀参加了历时3天的哈尔滨工业大学青年企业家联合会 以下称青企联 首届年会 并参与龙江行活动 哈工大党委常务副书记安实出席青企联年会并致辞 哈工大原副校长郭斌出席青企联年会并参加了赴香坊区调研座谈会 张文斌
  • Python 中的json模块dumps参数详解

    1 什么是JSON 维基百科中的定义 JSON JavaScript Object Notation JavaScript对象表示法 是一种由道格拉斯 克罗克福特构想和设计 轻量级的资料交换语言 该语言以易于让人阅读的文字为基础 用来传输由
  • 如何使用百度的GPU来跑自己的项目

    请先阅读如下两篇文章 并先读完我的文章再决定你是否要动手安装 因为有很多坑 白嫖百度GPU TeslaV100笔记 在 AI Studio 上使用 tensorflow 和 pytorch 的方法 亲测可用 免费使用谷歌GPU 这里谷歌是需
  • easyui field 获取对象子属性的值

    我们从服务器获取的数据格式如下 total 10 rows orderId 4 payment 1 paymentType 1 postFee 1 status 2 createTime 1510029825000 updateTime 1
  • 深入解析IT专业分类、方向及就业前景:高考毕业生如何选择适合自己的IT专业?重点探索近年来人工智能专业发展及人才需求

    目录 一 IT专业的就业前景和发展趋势 二 了解IT专业的分类和方向 三 你对本专业的看法和感想 四 本专业对人能力素养的要求 五 建议和思考 其它资料下载 当今社会 信息技术行业以其迅猛的发展和无限的潜力成为了吸引无数年轻人的热门选择 特
  • leetcode学习项目

    https leetcode cn com explore learn card data structure binary tree leetcode上专项介绍供学习树 https leetcode cn com explore lear
  • Linux中创建sftp用户并限制目录权限

    注意两点 一是禁止该用户通过ssh登录 二是不需要创建家目录 家目录简单来说 就是在 home下的用户命令 默认每个用户在 home中都是有与用户名一样的文件夹 创建组 groupadd sftp 创建用户 useradd g sftp s
  • 作为计算机专业学生,最应该学习的课程前五位是什么?【知乎】

    http www zhihu com question 19628851 answer 100293 对于目前排在首位的兵哥哥的答案 不敢苟同 本人软件工程专业 关于计算机专业和软件工程专业 实际上还是大相径庭的 远不是别人所说的软硬件的偏
  • Economic Difficulties【DP】【Codeforces 1263 F】

    Codeforces Round 603 Div 2 F 题意 给你两棵树 结点分别是1 A与1 B 然后给了N台设备 并且A树和B树的叶子结点都是链接设备的 问的是 我们最多可以割几条边使得每个设备都能链接A树或者B树上任意的一个 1 号
  • 检测鼠标位置是否有UI

    示例 using System using System Collections Generic using UnityEngine using UnityEngine EventSystems using UnityEngine UI p
  • 【编译原理】课程一:编译原理入门

    目录 1 为什么要学习编译原理 2 什么是编译原理 3 编译与计算机程序设计语言的关系 3 1 程序设计语言的转换方式 3 2 编译的转换过程 3 3 编译器在语言处理系统中的位置 3 4 编译系统的结构 3 4 1 词法分析 扫描 3 4