开始看第三部分,语义。
和其他语言差不多,都有作用域,内部全局的概念。
类需要注意的点:
类成员属性和其他一样。
这里类函数的内容和 java 比较类似:
简单的符号表可以通过堆栈完成:
符号表的操作和作用域强相关:
对于 class name 的校验
class 不需要定义,因此需要用一个新的 pass 扫描全局 class。
如果对编译有理解的话,pass 会有很多,而且优化也是一遍一遍的过一个一个 pass。
可以理解成:int 整合数字,int 可以有一系列的操作 func,比如 +,-,*,/
类型检查只能在编译器做,到了汇编层,就没法操作了。
关于静态、动态语言的优劣
现实中,静态、动态语言又会有妥协和优化:
Type 检查和 Type 推导:
Type 推导的范例:c++ 的 auto。
常用的符号:
标准化的表示:
例子:
说明:
类型检查由 AST 构成。而且是自底向上的,由页节点一点一点向上生成。
仅仅通过 AST 有时候并不能判断出变量类型。
这里引入了 Type Enviroment 的概念:
这里引入一个 O 的假设函数:
也可以写成这样:
在作用域下的 O 可以对特定的变量做转化:
宽约束的 let 定义:
这里类型完全一致,没有特别的地方。
T0 是 T 的继承。
可以 e1 的类型推出 x 的 type.
lub 定义:
这个词 LCA(least common ancestor),会经常用到。
条件表达式的转化:
定义:
理解 cool 中方法的定义:
对应的表达式:
Cool 的 Type Enviroment 命名:
总结: