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