编译原理
  • 编译原理
  • 一些简答题
  • 绪论
    • 编译器简介
    • 程序设计语言
    • 静态与动态
    • 参数传递机制
  • 词法分析
    • 词法单元、模式、词素
    • 串和语言
    • 正则表达式
    • 状态转换图
    • 不确定有穷自动机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
  • 静态/动态(static/dynamic)
  • 作用域(scope)
  • 环境与状态
  • 静态作用域和块结构
  1. 绪论

静态与动态

静态/动态(static/dynamic)

  • 静态:支持编译器静态决定某个问题(编译期 compile time)

  • 动态:只允许在程序运行时刻作出决定(运行时 run time)

作用域(scope)

  • x 的作用域指程序的一个区域,在其中对x 的使用都指向这个声明

  • 静态作用域:编译期即可决定作用域(仅通过阅读程序就可以确定一个声明的作用域),也叫词法作用域(lexical scope),大部分语言(如C和Java)使用静态作用域。

  • 动态作用域(dynamic scope):运行时才可决定作用域,程序运行时,同一个对x 的使用会指向x 的几个声明中的某一个。

比如Java类声明中术语static 的使用:public static int x;

指明变量的存放位置可静态确定:

  • 这里static 不是指变量的作用域,而是编译器确定用于存放声明变量的内存位置的能力

  • 不管创建了多少个这个类的对象,只存在一个x 的拷贝

  • 反之,如果去掉static ,那么这个类的每个对象都有它自己的用于存放x 的位置,编译器无法在运行前确定所有这些位置

环境与状态

  • 环境:是从名字到存储位置的映射

  • 状态:从存储位置到它们值的映射

静态作用域和块结构

C语言使用静态作用域,C语言程序由顶层的变量、函数声明组成,函数内部可以声明变量(局部变量/参数),这些声明的作用域在它出现的函数内,一个顶层声明的作用域包括其后的所有程序。

  • 作用域规则基于程序结构,声明的作用域由它在程序中的位置决定

  • 后面出现的语言(如C++、Java、C#),也通过public、private、protected 进行明确控制

  • 块(block)是声明和语句的一个组合

C语言使用{} 来界定一个块。

规则:如果名字x 的声明D 属于块B ,那么D 的作用域包括整个B ,但是嵌套在B 中的B' 如果重新声明了x ,则不在此作用域中。

Previous程序设计语言Next参数传递机制

Last updated 4 months ago