随笔-341  评论-2670  文章-0  trackbacks-0
    把中间指令都搞定了之后,得开始做一门JIT的脚本引擎了。但是这门脚本引擎不是用来写的,而是用来给更高级的语言编译的。这是什么意思呢?虽然我现在写了个语法分析器,提供了语法树,是我的目的是让我以后设计的更高级的语言可以编译成这门相对底层的语言(从一棵语法树转换成另一棵语法树),而不是直接编译成中间指令。这样很多事情都会好做很多。

    这一门语言主要模仿C,提供指针、结构、数组、基本类型和函数指针。还有extern函数做外部链接用。因为编译成机器码,所以可以直接把一个函数指针丢进我的脚本引擎,就可以这么用了。而且我的脚本里面的函数也可以直接作为一个函数指针提供出来。复合类型组要勇于跟C++交互。在C++与脚本里面声明同样的struct,不需要做额外工作,就可以互相使用了。

    语法如下:
  1 Vczh JIT Native Language
  2 -----------------------------------------
  3 基本数据类型:
  4 
  5 [signed|unsigned]byte
  6 [signed|unsigned]short
  7 [signed|unsigned]int
  8 char
  9 wchar
 10 float
 11 double
 12 bool
 13 
 14 复合类型:
 15 
 16 TYPE*
 17 TYPE[LENGTH]
 18 TYPE(TYPE,)
 19 void(TYPE,)
 20 
 21 结构类型:
 22 struct
 23 {
 24   TYPE NAME;
 25   
 26 }
 27 -----------------------------------------
 28 表达式:
 29 
 30 数字、浮点、字符、宽字符、truefalsenull(指针,函数指针)
 31 操作符表达式
 32 (表达式)
 33 VALUE(VALUE,)
 34 TYPE(VALUE)
 35 NAME
 36 -----------------------------------------
 37 操作符:
 38 
 39 + - * /        :int X int = int
 40                :float X int = float
 41         :int X float = float
 42         :float X float = float
 43         :ptr X int = ptr(+ -)
 44         :int X ptr = ptr(+ -)
 45 
 46 & | ^ %        :int X int = int
 47 
 48 && || ^^    :int X int = bool
 49 
 50 < > == <= >= !=    :int X int = bool
 51         :float X float = bool
 52         :ptr X ptr = bool
 53 
 54 -        :X int = int
 55         :X float = float
 56 
 57 ~        :X int = int
 58 
 59 !        :X int = float
 60 
 61 &        :X VALUE,获取指针
 62 
 63 *        :X PTR,获取内容
 64 
 65 X[Y]        :数组、指针
 66 -----------------------------------------
 67 对象声明:
 68 
 69 TYPE NAME
 70 TYPE NAME=VALUE
 71 const TYPE NAME=VALUE
 72   数组:{VALUE,}
 73   结构:{NAME=VALUE,},必须全员赋值
 74 -----------------------------------------
 75 语句:
 76 
 77 对象声明
 78 
 79 表达式
 80 左值=表达式
 81 
 82 if (bool) 语句块[else 语句]
 83 if (bool) 语句;[else 语句]
 84 while (bool) 语句
 85 do 语句 while (bool)
 86 {语句;}
 87 
 88 break
 89 continue
 90 return 表达式
 91 return
 92 空语句
 93 -----------------------------------------
 94 函数:
 95 
 96 TYPE NAME(TYPE NAME,){语句;}
 97 void NAME(TYPE NAME,){语句;}
 98 extern TYPE NAME(TYPE,) alias "KEY";
 99 extern void NAME(TYPE,) alias "KEY";
100 -----------------------------------------
101 类型声明:
102 
103 typedef TYPE NAME
104 -----------------------------------------
105 程序:
106 
107 类型声明;
108 对象声明;
109 函数
110 -----------------------------------------
111 关键字:
112 
113 signed unsigned byte short int double float char wchar bool struct
114 null true false
115 void extern typedef if else while do break continue return alias

    大部分照搬了C语言,主要修改是那个恶心的函数指针类型被重新设计了,还有添加了非参数用的const(这不是类型的一部分,跟C++不同),修改了struct初始化的赋值方法。
posted on 2009-04-18 00:17 陈梓瀚(vczh) 阅读(3154) 评论(7)  编辑 收藏 引用 所属分类: JIT

评论:
# re: JIT脚本引擎:开始做第一门编译成机器码的脚本引擎 2009-04-18 01:30 | lccc
楼主强人....

跟 LLVM Compiler 有些相像的地方,都是把其它的各种语言转成自己的,再统一处理  回复  更多评论
  
# re: JIT脚本引擎:开始做第一门编译成机器码的脚本引擎 2009-04-18 01:44 | 清風
基本上,你就是在做c语言编译器  回复  更多评论
  
# re: JIT脚本引擎:开始做第一门编译成机器码的脚本引擎 2009-04-18 02:23 | SOS
native化  回复  更多评论
  
# re: JIT脚本引擎:开始做第一门编译成机器码的脚本引擎 2009-04-18 04:57 | 巫云
应该是基于虚拟机的C语言,很帅。  回复  更多评论
  
# re: JIT脚本引擎:开始做第一门编译成机器码的脚本引擎 2009-04-18 05:56 | 陈梓瀚(vczh)
@巫云
是要编译成机器码让CPU直接跑的。  回复  更多评论
  
# re: JIT脚本引擎:开始做第一门编译成机器码的脚本引擎 2009-04-19 22:11 | 席子
"但是我的目的是让我以后设计的更高级的语言可以编译成这门相对底层的语言(从一棵语法树转换成另一棵语法树),而不是直接编译成中间指令。"

"恶心的函数指针类型被重新设计了,还有添加了非参数用的const(这不是类型的一部分,跟C++不同),修改了struct初始化的赋值方法"


呵呵, 深有同感  回复  更多评论
  
# re: JIT脚本引擎:开始做第一门编译成机器码的脚本引擎[未登录] 2009-04-22 01:14 | jans2002
期待楼主的精彩表演  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理