Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1292022
  • 博文数量: 196
  • 博客积分: 4141
  • 博客等级: 中将
  • 技术积分: 2253
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-21 20:04
文章存档

2019年(31)

2016年(1)

2014年(16)

2011年(8)

2010年(25)

2009年(115)

分类: C/C++

2009-06-02 21:12:59

compiler 文档

简介:compiler 是根据《计算机系统要素:从零开始构建计算机》写的。由于在20079月份已经全部完成了该书的项目,这次只重写了第六章,第八章和第十章(第十章完成之后,第十一章就懒得再写了)。

目的:重构compiler的目的是为了研究软件架构和编程技巧

Compiler:主要参考了nasm汇编器和摩托的WiMax系统,当然还有其他的一些系统和自己总结的一些编程技巧。

Compiler共分为3个小项目:Hack汇编器,Jvm虚拟机和Jack编译器

Compiler文件夹下面有4个子文件夹:

  • l  Common:存放了三个小项目公用的数据结构;
  • l  Hack:汇编器项目
  • l  Jvm:虚拟机项目
  • l  Jack:编译器项目

Common

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 是两遍编译器,因为hack支持前向标号,比如说第一行出现goto Lable,而在第一百行还出现Label:

因此,第一遍,hack主要是计算所有标号的信息,比如说哪个标号在内存的哪个地址上,第二遍在讲汇编程序转化成二进制文件

Hack分为两大部分,front.cppend.cppfront.cpp收集各方面的信息,比如说符号信息,生成二进制代码所有需要的信息,end.cpp则是生成可执行文件。

Jvm

基于堆栈体系结构,将jack生成的虚拟机语言转换成hack能够理解的汇编语言。

Jack

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删除就可以了。



源码下载:


阅读(2454) | 评论(0) | 转发(0) |
0

上一篇:min_malloc(第二版)

下一篇:序言

给主人留下些什么吧!~~