分类: C/C++
2009-06-02 21:12:59
简介:compiler 是根据《计算机系统要素:从零开始构建计算机》写的。由于在2007年9月份已经全部完成了该书的项目,这次只重写了第六章,第八章和第十章(第十章完成之后,第十一章就懒得再写了)。
目的:重构compiler的目的是为了研究软件架构和编程技巧
Compiler:主要参考了nasm汇编器和摩托的WiMax系统,当然还有其他的一些系统和自己总结的一些编程技巧。
Compiler共分为3个小项目:Hack汇编器,Jvm虚拟机和Jack编译器
Compiler文件夹下面有4个子文件夹:
Common下有两个子文件:
Inc:公用的库函数的文件
Lib:公用的库函数的实现
Inc文件夹
list.h:实现了通用的链表,关于通用链表,详见:http://blog.chinaunix.net/u3/93907/showart_1907943.html
lib
hash.cpp:哈希函数的实现
lib.cpp:将项目中的所有调用动态内存分配的函数集中处理,在处理的过程中加入了日志功能,便于在出错的时候查找
log.cpp:日志功能模块
min_malloc.cpp:实现了动态内存的分配和回收,详见: http://blog.chinaunix.net/u3/93907/article_111294.html
Hack 是两遍编译器,因为hack支持前向标号,比如说第一行出现goto Lable,而在第一百行还出现Label:
因此,第一遍,hack主要是计算所有标号的信息,比如说哪个标号在内存的哪个地址上,第二遍在讲汇编程序转化成二进制文件
Hack分为两大部分,front.cpp和end.cpp,front.cpp收集各方面的信息,比如说符号信息,生成二进制代码所有需要的信息,end.cpp则是生成可执行文件。
基于堆栈体系结构,将jack生成的虚拟机语言转换成hack能够理解的汇编语言。
Jack只做到了语法分析部门,之后就没有再过了。这里主要讲一下符号表的设计,其他的语法分析部分需要看书。
Jack的语法规定,每个文件实现一个类,而且类名要跟文件名对应。
struct symbol_info
{
struct DListNode link;
symbol_type type;
SymbolSecondType secondtype;
char sym_name[MAX_SYMBOL_NAME_LEN + 1];
};
struct symbol_table_struct
{
struct DListNode link;
struct hash_struct_info sym_table;
};
struct DListHeader symbol_header;
刚开始,初始化符号表的时候,会建立一个 哈希表
这哈希表主要是存储类成员的符号。
当我们编译类函数成员的时候,会再生成一个哈希表,在编译该函数成员的时候,所有的局部变量全都存放到hash local table中,一旦编译完成该函数,将hash local table删除就可以了。