编译原理——course intro

根据上课内容顺序写的博客,并不是按照书的目录来的
使用龙书以及编译程序设计原理(第二版)金成植、金英编著
老师的PPT是英文的,我自己随便翻的,不一定对

  1. 浏览课程讲什么
  2. 理解为什么需要学习这门课
  3. 思考怎么学习这门课



文章目录

  • 编译器介绍 Introduction to Compiler
      • 课程目标
      • 什么是编译器?
    • 编程语言
    • 编译器和解释器
    • 编译相关程序
    • 编译器的设计和实现
    • 编译器的功能分解和组织结构
    • 普通的编译器工作流程
    • 总结






编译器介绍 Introduction to Compiler



课程目标

介绍为高级程序设计语言开发编译器时的一般设计原则、方法和实现技术

  • 学习编译相关技术
    • 设计,实现,理论/方法
    • 怎么利用他们在未来的应用中
  • 理解高级程序设计语言
    • 设计和实现
  • 提高编程能力
    • 第一次有机会了解一个 元级软件系统
    • 第一次了解怎么去一个开发一个复杂的,大规模的系统软件
  • 应用
    • 学习一些简单的方式去开发一些应用

什么是编译器?

什么是编译器
  将源程序录入编译器,编译器输出为目标程序,同时输出错误信息



编程语言


历史

  • 1800,第一个程序员
  • 1950,第一个程序语言(FORTRAN; COBOL; Algo1060; LISP)
  • 1960,浮现数百种编程语言(特殊目的语言; 通用语言)
  • 1970,简化,抽象(PASCAL; C)
  • 1980,面向对象(Ada; Modular; Smalltalk; C++)
  • 1990,网络(Java),libraries,script
  • 2000,新规格语言

类别

  • 功能
    • 科学计算
    • 商务
    • 表处理
    • 表格
    • 字符串
    • 多功能
  • 抽象级
    • 低级
      • 机器语言
      • 汇编语言
    • 高级
      • 过程式语言 FORTRAN PASCAL C
      • 对象式语言 Smalltalk Java C++
      • 函数式语言 LISP HASKELL ML
      • 逻辑式语言 PROLOG

编程语言的定义包括

  • 词法
    • 单词的正确集 allowed set of characters
    • 词法的结构 lexical structure
  • 语法
    • 程序结构
  • 语义
    • 不同的结构的意义
      结构1
      编译原理——course intro_第1张图片

分析例子

编译原理——course intro_第2张图片
程序 → 声明 → 赋值声明 → 表达式
      →声明   → read声明
             →赋值声明 →表达式




编译器和解释器


编程语言的实现

  • 解释器
    • 源程序和数据输入,解释器解释,输出(计算结果)
    • 原程序的一个执行系统,届时其的工作结果是原程序的执行结果。
  • 翻译(语言1→语言2)
    • 汇编 汇编语言→机器代码
    • 编译器 高级语言→低级语言
  • 编译器
    • 将用高级语言写成的程序转换成等价的机器语言程序,编译程序也称编译器
    • 地位
      • 操作系统(系统软件)
      • 元级软件系统

编译器和解释器的比较

编译器和解释器在工作性质上具有某些共同点,但若从不同角度对比仍有一些差异

共同点:使用了相同的实现技术

使用解释器的优势:

  • 解释器通常使用高级语言写的,因而能够在大多数类型的计算机上运行(通用性)
  • 设计解释器的后端工作量要是少得多(中间代码生成并不那么重要)
  • 使用解释器比使用编译器更加安全(可移植性:java)
编译器 解释器
程序规模 规模较大 规模中小
内部形式 机器代码(低级) 数据结构(高级)
运行机构 硬件CPU 软件系统
运行速度 相对较快 相对较慢




编译相关程序

  • editor 编辑器
  • preprocessor 预处理程序
  • compiler 编译器
  • assembler 汇编器
  • loader 加载器
  • linker 连接器
    编译原理——course intro_第3张图片




编译器的设计和实现


与编译器相关的三个语言

  • 源语言Ls 输入
  • 目标语言Lt 输出
  • 实现语言Li 编译器开发的语言

编译器的实现

  • 现在不存在的编译器
    • 手工编写机器代码
      • 低效,难以持续
    • 自展法 self extending
  • 现有的编译器
    • 预处理方法
    • 移植法
    • 工具法 自动生成工具
    • 写代码

自展

  • 问题
    • 如果这里没有任何可用的编译器,我们想要为一个程序语言L开发一个编译器
  • 解决
    • 定义L0作为L的子语言
    • 为L0手动地写一个编译器
    • 对L0做一些拓展,成为L1
    • 开发一个L1的编译器使用L0
    • ……
    • 开发Ln(=L)的编译器,使用L(n-1)语言

预处理

  • 问题
    • 如果我们有一个程序语言L和他的编译器,我们想要为程序语言L1开发一个编译器,L1是在L的基础上做了一些拓展
  • 解决
    • 开发一个预处理器 L1翻译成L
    • 使用L的编译器:从L到目标代码
  • 例子
    • C++ → C

移植

  • 问题
    • 源语言L
    • 为机器M1的L的编译器
    • 我们想开发另一个使用L的编译器为机器M2
  • 相同的源语言,不同的目标语言
  • 两种方法
    • 开发一个程序用来把机器M1代码翻译到机器M2代码
    • 重建一个编译器后端




编译器的功能分解和组织结构


编译器功能分解

  • 输入
    • 使用源语言写成的程序(源程序)
    • =sequence of characters 单词序列
  • 输出
    • 使用目标语言携程的程序(目标程序/代码)
    • =sequence of instructions 指令序列
  • 算法
    • 将每个源程序转换成相应目标程序的一般过程
  • 例子
    编译原理——course intro_第4张图片

总结

  • 理解源语言和目标语言
    • 词法,语法,语义
  • 翻译一个语句的过程包括
    • 分析这个句子来确保它是正确的
      • 拼写 包括识别单词和他们的属性(词法分析)
      • 使用源语言的语法来构造语法结构(语法分析)
      • 确保是有意义的语句(语义分析)
    • 翻译这个句子到目标语言
      • 翻译每个语法部分
      • 把他们合成为一个有意义的目标语言句子

编译原理——course intro_第5张图片


编译器前后端

  • 前端
    • 词法分析、语法分析、符号表构造、语义分析
    • 中间代码生成、代码优化、错误处理
    • 不依赖于机器
  • 后端
    • 中间代码到目标代码生成的阶段
    • 对中间代码和目标机有较高的依赖,一般不依赖于源程序代码

编译原理——course intro_第6张图片


  • 词法分析 lexical analysis(scanning)
    • 读取源程序,以符号流的形式
    • 收集词符号序列到有意义的单元,成为词法单元(tokens)
    • 主要任务:检查词法错误并把源程序中的单词转换成一种内部形式(数据形式)
  • 语法分析 syntax analysis(parsing)
    • 读取词法单元序列
    • 确定程序的语法结构
    • 语法分析的结果形式是一颗语法树
    • 主要任务:检查源程序的语法错误,发现错误时输出相关信息,并尽可能地继续检查
  • 语义分析 semantic analysis
    • 静态语义检查,比如类型检查
    • 符号表(标识符的属性)
    • 主要任务:构造符号表,并检查语法错误
  • 代码生成
    • 中间代码生成
      • 中间表示
      • 可移植性
      • 任务:产生便于优化和便于生成目标代码的中间嗲吗
    • 目标代码生成
  • 代码优化
    • 目标程序的效率
      • 中间代码优化
        • 任务:根据目标机的特点由中间代码产生高质量的目标代码
      • 目标代码优化




普通的编译器工作流程


举例说明编译器如何将C0中的程序转换成汇编代码

语言 具体语言
源语言 一个toy程序语言C0
目标语言 汇编语言AL

C0语言一般定义

  • 词法结构
    • 允许字符集 {a-z, A-Z, 0-9}
    • 词法单元
      • 关键字 {, read, write, }
      • 标识符 以字母开头的有限字符序列
      • 数字 整数
      • 操作符 +, *, :=
      • 分隔符 { ;, (, )}
    • 语法(程序结构)
      • 编译原理——course intro_第7张图片
      • 编译原理——course intro_第8张图片
    • 语义
      • 静态语义
        • 一个标识符不应该被声明多次
        • 使用声明过的标识符
        • 赋值和表达式中的类型等价
        • if或while语句中的条件表达式的结果类型应该是布尔型的
      • 动态语义

例子

  1. 程序
    编译原理——course intro_第9张图片
  2. 词法分析
    读取
    编译原理——course intro_第10张图片
    词法分析表
  3. 语法分析
    编译原理——course intro_第11张图片
  4. 语义分析
    编译原理——course intro_第12张图片
  5. 代码生成
    代码生成




总结

  • 编程语言的不同分类
  • 一个编程语言的定义
  • 编译器和解释器的不同和定义
  • 过程化程序语言相关的程序
  • 编译器的设计和实现
  • 编译器的功能分解
  • 编译器的一般工作流程
  • 原则
    • 分而治之 dibvide and conquer
    • 问题 → 编程任务 → 解决方案 → 基本原则和方法

你可能感兴趣的:(编译原理,编译原理)