课程回顾 Swarthmore学院16年开的编译系统课,总共10次大作业.本随笔记录了相关的课堂笔记以及第6次大作业. 函数声明 增加函数声明.函数调用的抽象语法:在转换成anf之前还要检查函数声明和调用是否正确. well_formed函数分别检查Program中的的函数声明列表ds和main是否有错误. well_formed_decl函数还需要检查函数体是否正确(参考下图右边第一个递归的例子). well_formed_expr函数,检查expr中调用的函数是否已经定义,接着递归调用wel…
课程回顾 Swarthmore学院16年开的编译系统课,总共10次大作业.本随笔记录了相关的课堂笔记以及第9次大作业. 赋值的副作用:循环元组 下面的代码展示了Python3是如何处理循环列表(print和==): >>> x = [1, 2] >>> x[1] = x >>> print(x) [1, [...]] >>> y = [1, 2] >>> y[1] = y >>> x is y Fa…
课程回顾 Swarthmore学院16年开的编译系统课,总共10次大作业.本随笔记录了相关的课堂笔记以及第8次大作业. First-class function: It treats functions as first-class citizens. This means the language supports passing functions as arguments to other functions, returning them as the values from other…
课程回顾 Swarthmore学院16年开的编译系统课,总共10次大作业.本随笔记录了相关的课堂笔记以及第7次大作业. 抽象语法: 存储方式: 栈中的数据如果最后三位(tag bits)是001表示元组. 堆中元组的起始地址最后三位都是000. 通过引入ESI寄存器可以实现堆区数据的存取. 编程作业 本次的大作业是实现Egg-Eater语言:支持函数,数字,布尔值以及元组:元组的语法(egg)非常像一个…
课程回顾 Swarthmore学院16年开的编译系统课,总共10次大作业.本随笔记录了相关的课堂笔记以及第5次大作业. 增加了bool数据表示和比较运算符的支持,具体语法参考下图: 第一种int和bool数据表示的方法:用2个字来表示一个int或bool类型的值. 比如:要表示int数值,可以先存入一个flag=1,再存入具体的数值37.最后返回flag的指针,在C语言的接口做相应的处理. 第二种表示int和bool数据表示的方法:使用Tag Bit. 如下图:True表示为:0x8000000…
课程回顾 Swarthmore学院16年开的编译系统课,总共10次大作业.本随笔记录了相关的课堂笔记以及第4次大作业. A-Normal Form 在80年代,函数式语言编译器主要使用Continuation-passing style(CPS)作为中间代码表示形式. 1992年Sabry和Felleisen引入了另一种和CPS一样简单的表示形式:A-normal form(ANF),并且证明了:使用ANF作为中间代码表示形式能够和使用CPS一样容易生成汇编代码并进行代码优化. Why:为什么要…
课程回顾 Swarthmore学院16年开的编译系统课,总共10次大作业.本随笔记录了相关的课堂笔记以及第3次大作业. 编译的过程:首先解析(parse)源代码,然后成抽象语法树(AST),再生成汇编代码(asm),最后用asm生成的目标文件(object)和其他库文件链接成一个可执行的二进制文件(binary).其中从抽象语法树到生成汇编代码这个过程(complier.ml)工作量最大. 具体语法树(Concrete Syntax Tree):programmer写的就是具体语法,下图展示了某…
课程回顾 Swarthmore学院16年开的编译系统课,总共10次大作业.本随笔记录了inlab1的实践过程. tiny compiler 这个迷你的编译器可以将一个源文件,编译成可执行的二进制代码.它包括以下文件: 87.int:源代码只包括一个整数 87 compiler.ml:将.int的源文件编译为.s的汇编文件 open Printf let compile (program: int) : string = sprintf " section .text global our_cod…
课程回顾 Swarthmore学院16年开的编译系统课,总共10次大作业.本随笔记录了相关的课堂笔记以及第2大次作业. 比较两个lists的逻辑: let rec cmp l ll = match (l,ll) with | [], [] -> 0 | [],_ -> -1 | _,[] -> 1 | (h::t), (hh::tt) -> if h > hh then 1 else if h < hh then -1 else cmp t tt;; 编程作业 1. 平…
课程回顾 Swarthmore学院16年开的编译系统课,总共10次大作业.本随笔记录了相关的课堂笔记以及第1次大作业. 什么是编译 编译就是执行Program->Program'转换的过程,如下图所示: 这个过程需要满足两个条件: The input and output program mean the same thing. The output is executable in a context we care about. 编译执行过程: 不可变数据结构(persistent data…