C标准注解
首先解释几个很重要的术语:
object:执行环境数据存储区(不只是DATA和BSS,也可能在 stack中)中的一块区域,当被引用的时候,object可能会被解释为相应的类型.
expression:在以后的出现中所指的是 C语法中的expression,是一个泛指概念,可以是指一个identifier或者就是任何表达式(例如函数调用,加减...).
lvalue:是一个代表object具有类型(object类型或者不完全类型,但是不能是void)的expression.
基础架构
存储管理
存储管理是一般系统里很常见的处理方式,及通过标准库中的malloc()分配一大块存储(这里分配得到的肯定只是虚拟存储,以后用一概用"存储"描述),然后建立相应的结构来管理,使用lazy mode,及jac使用之后释放的存储链入一个空闲链表freeblocks中,当jac内部分配存储的时候也是先查找freeblocks,否则才会调用malloc来分配.
存储管理主要按生存期分为3个区:
对应于整个translation-unit的UNIT,主要是符号表,及其类型表,
对应于function的FUNC,存储局部符号,及其跳转label.
及其对应于statement的STMT.
由于代码比较简单,这里只给出接口函数,以便于以后的描述.
1 char *memalloc(unsigned m , unsigned a)
2 //m表示申请的存储量,a表示申请的存储区.
3 void memdelete(unsigned a)
4 //a表示要释放的存储区.
符号表
符号表和后面将要介绍的类型表是整个jac里面最重要的结构,后端代码生成的时候也会引用相应的member.
在这里要建立类型和符号的概念,例如struct s{int i}; ,s是一个tag,需要建立一个symbol entry,但是s同时又是一个类型.同时s也是一个identifiler,遵循identifiler的作用域覆盖规则,区分这些概念对理解jac的实现是非常重要的.
1 //符号类型的定义,很重要.
2 struct symbol{
3 char *name;
4 Type type; //符号的类型
5 int sclass; //存储类别描述
6 float ref; //大概的引用次数
7 unio{
8 struct{
9 union value v;
10 }c;
11 ... ...
12 }u;
13 };
14 //符号表的定义.
15 struct table{
16 int level;
17 Table previous; //指向外层的符号表
18 struct entry{
19 struct symbol sym;
20 struct entry *link;
21 } *buckets[256]; //size
22 };
to be continued..
要把知道的写出来真的是一件很难很难的事情,这篇blog我会再修改,先睡觉了..