编译原理
  • 编译原理
  • 一些简答题
  • 绪论
    • 编译器简介
    • 程序设计语言
    • 静态与动态
    • 参数传递机制
  • 词法分析
    • 词法单元、模式、词素
    • 串和语言
    • 正则表达式
    • 状态转换图
    • 不确定有穷自动机NFA
    • 确定有穷自动机DFA
    • 算法:正则表达式转NFA
    • 自动机到词法分析器
  • 语法分析
    • 语法分析器
    • 上下文无关文法
    • 二义性和左递归
    • 递归下降语法分析
    • 算法:求解FIRST集和FOLLOW集
    • 算法:LL(1)
    • 自底向上语法分析
    • 移入-归约语法分析
    • 算法:LR(0)
    • 算法:SLR(1)
    • 算法:LR(1)
    • 算法:LALR
    • LR分析器和LALR分析器
  • 语法制导
    • 语法制导定义(SDD)
    • 综合属性和继承属性
    • 语法树上的SDD求值
    • 依赖图
    • L属性的SDD
    • 类型
    • SDD的应用
  • 中间代码生成
    • 三地址代码
    • SSA(静态单赋值)
    • 类型和声明
    • 表达式的翻译
    • 类型检查
    • 控制流
    • 回填
  • 运行时刻环境
    • 存储组织
    • 栈式分配
    • 栈中非局部数据的访问
    • 堆管理
    • 垃圾回收
  • 代码生成
    • 代码生成器的设计
    • 目标语言
    • 目标代码中的地址
    • 基本块和流图
    • 基本块的优化
Powered by GitBook
On this page
  • 请简述编译器、解释器、混合编译器的区别
  • 编译器前端和后端的主要区别
  • 请写出参数传递的几种机制并简述区别
  • 请简述自底向上的语法分析中,移入-归约操作是如何工作的
  • 请简述上下文无关文法和正则表达式的异同
  • 自顶向下语法分析技术和自底向上语法分析技术的异同及优缺点
  • 综合属性、继承属性、S属性SDD、L属性SDD
  • 抽象语法树(AST)的优势
  • 为什么要把代码尽可能放在被调用者中
  • 调用代码序列

一些简答题

请简述编译器、解释器、混合编译器的区别

  • 编译器:读入以某种语言 (源语言) 编写的程序,输出等价的用另一种语言 (目标语言) 编写的程序,通常目标程序是可执行的。

  • 解释器:直接利用用户提供的输入,执行源程序中指定的操作。不生成目标程序,而是根据源程序的语义直接运行。

  • 混合编译器:Java语言的处理结合了编译和解释,Java源程序编译成字节码(bytecode)中间表示,然后在虚拟机上解释执行。

编译器前端和后端的主要区别

编译器前端主要负责语法检查、语义检查、和初步的代码⽣成,包括词法分析、语法分析和语义分析等。它通常与源语⾔紧密相关,但与⽬标机器⽆关。⽽后端主要负责代码优化和⽬标代码⽣成,它通常与源语⾔⽆关,但是与⽬标机器紧密相关。

请写出参数传递的几种机制并简述区别

请简述自底向上的语法分析中,移入-归约操作是如何工作的

请简述上下文无关文法和正则表达式的异同

上下文无关文法比正则表达式的能力更强,所有的正则表达式都可以使用文法描述,但有一些用文法描述的语言不能用正则表达式描述。直观的讲:有穷自动机不能无穷计数。

  • 和文法相比,正则表达式更加简洁和易于理解

  • 根据正则表达式自动构造的词法分析器的效率高于根据任意文法自动构造得到分析器

但没有严格的指导方针,哪些东西应该放到词法/语法规则中

  • 正则最适合描述id、常量、关键字这样的语言构造的结构

  • 文法最适合描述嵌套结构,如对称的括号、对应的if-then-else 等,这些无法用正则描述

自顶向下语法分析技术和自底向上语法分析技术的异同及优缺点

⾃上⽽下解析从根(起始符号)开始构建解析树,尝试找到⼀条从根到叶⼦的路径与输⼊串匹配。常⻅算法有递归下降解析、LL 等。⾃下⽽上解析从输⼊串开始,逐步进⾏归约,直到归约到起始符号。常⻅算法有 LR 解析、SLR 解析、LALR 解析等。

自顶向下算法根据极为有限的信息预测(猜)产生式。能识别的文法有局限性:

  • 需要改造文法消除左递归

  • 改造后的文法不直观

  • 生成的语法树不易理解和处理

自底向上,先看足够输入,再选择产生式。

综合属性、继承属性、S属性SDD、L属性SDD

抽象语法树(AST)的优势

为什么要把代码尽可能放在被调用者中

假设有N个地方调用函数f,放在被调用者中可避免生成多份冗余代码

调用代码序列

Previous编译原理Next编译器简介

Last updated 4 months ago