随笔-341  评论-2670  文章-0  trackbacks-0
JIT
使用JIT技术的脚本引擎
【源码下载】JIT脚本引擎:CMinus 0.1版开放下载      摘要: 说明:CMinus是一个读入修改过语法的C源程序,然后编译成x86指令集写入内存,最后用__stdcall调用约定跟C++互相交流的脚本引擎。
目标:CMinus的定位是中间语言,用于将其他语言编译到CMinus上,享受本地指令带来的好处。
进度:完成所有功能,但是由于指令集生成的算法不好,打算修改。
下载:【内详】。  阅读全文
posted @ 2009-05-22 16:32 陈梓瀚(vczh) 阅读(9165) | 评论 (24)  编辑
JIT脚本引擎:CMinus编译冒泡排序程序      摘要: 虽然CMinus到中间指令的代码是精心控制的,但是中间指令到x86的代码却是很随意写出来的。现在看来用窥孔优化只是一种治标不治本的方法。打算在CMinus整个都完成了之后,将中间指令到x86的代码生成那部分重写,使用一种广为人知的寄存器分配算法来做。下面是冒泡排序的程序:  阅读全文
posted @ 2009-05-20 08:51 陈梓瀚(vczh) 阅读(2750) | 评论 (3)  编辑
JIT脚本引擎:第一个CMinus程序运行成功      摘要: 目前其实只能编译单目运算符和return语句,主要是为了看看整个大框架有没有错误。如果没有发现错误的话,其他种类的表达式和语句的代码生成很容易加上去。下面是一个CMinus程序的例子和编译结果(汇编):  阅读全文
posted @ 2009-05-18 15:00 陈梓瀚(vczh) 阅读(2409) | 评论 (1)  编辑
JIT脚本引擎:基本完成CMinus的语义分析      摘要: 整整写了一天,终于基本写完了CMinus的语义分析的代码,只剩下一个检查struct是否可以计算出长度的问题(环引用造成的)。下面贴出语义分析的结果,从结果中可以看出符号表的结构以及构造方法:  阅读全文
posted @ 2009-05-07 00:13 陈梓瀚(vczh) 阅读(2754) | 评论 (4)  编辑
JIT脚本引擎:CMinus大部分语法测试通过      摘要: 今天写了一些CMinus程序供语法分析器分析,然后程序从语法树重新生成格式化后的代码,两边比较检查优先级什么的是否正确处理。下面是CMinus写的冒泡排序、菲薄纳气数列、链表操作函数以及其他程序:  阅读全文
posted @ 2009-05-05 11:44 陈梓瀚(vczh) 阅读(1839) | 评论 (1)  编辑
JIT脚本引擎:实现CMinus语法分析器      摘要: 这一次的语法分析器,我使用Vczh Combinator Parser,按照文法的定义,将字符串转换成了语法树。Vczh Combinator Parser构造较大规模的编译器的时候还是较为吃力,主要原因出在Visual C++竟然限制一个类型全名不能超过某个长度T_T……下面是代码:  阅读全文
posted @ 2009-05-04 11:25 陈梓瀚(vczh) 阅读(2643) | 评论 (11)  编辑
JIT脚本引擎:C Minus语言语法树定型      摘要: 今天照着C Minus的语法(略有修改)设计出了C Minus的语法树。语法树的设计尽量让生成语法树的代码易于编写。每一个结构的意义十分明确,而且结构与结构之间不需要有相互联系。下面是语法树的代码:  阅读全文
posted @ 2009-04-24 16:58 陈梓瀚(vczh) 阅读(2837) | 评论 (5)  编辑
JIT脚本引擎:开始做第一门编译成机器码的脚本引擎      摘要: 把中间指令都搞定了之后,得开始做一门JIT的脚本引擎了。但是这门脚本引擎不是用来写的,而是用来给更高级的语言编译的。这是什么意思呢?虽然我现在写了个语法分析器,提供了语法树,但是我的目的是让我以后设计的更高级的语言可以编译成这门相对底层的语言,而不是直接编译成中间指令。这样很多事情都会好做很多。

这一门语言主要模仿C,提供指针、结构、数组、基本类型和函数指针。还有extern函数做外部链接用。因为编译成机器码,所以可以直接把一个函数指针丢进我的脚本引擎,就可以这么用了。而且我的脚本里面的函数也可以直接作为一个函数指针提供出来。复合类型组要勇于跟C++交互。在C++与脚本里面声明同样的struct,不需要做额外工作,就可以互相使用了。
  阅读全文
posted @ 2009-04-18 16:17 陈梓瀚(vczh) 阅读(2885) | 评论 (7)  编辑
JIT脚本引擎:完成20个浮点函数      摘要:
FPU写起来还真是囧啊,下面20个函数实现到想死……
Sin,Cos,Tan,Cot,Sec,Csc,ASin,ACos,ATan,ACot,ASec,ACsc,Sqrt,Exp,Ln,Abs,Round,Trunc,Ceil,Floor
下面是这20个函数的汇编代码,其中Exp更是登峰造极……  阅读全文
posted @ 2009-04-16 21:39 陈梓瀚(vczh) 阅读(4576) | 评论 (3)  编辑
JIT脚本引擎:测试除特殊浮点函数外的所有指令通过      摘要: 昨天为机器码编译程序写了个专用的unit test框架,今天用中间语言在这个框架上写了个程序。程序将12个字符串连接起来,然后跟另外一个字符串进行比较,如果相等返回true。当然程序如果返回false了,要么就是程序有问题,要么就是编译器有问题。当然现在是测试通过了。程序如下:  阅读全文
posted @ 2009-04-16 13:15 陈梓瀚(vczh) 阅读(1957) | 评论 (1)  编辑
JIT脚本引擎:成功将第一个脚本编译成机器码      摘要: 这次工作将一个中间语言的程序翻译成了汇编,然后再翻译成机器码。这一次产生的汇编比较烂,到时候做个窥孔优化稍微处理一下就好了。等上层的设施搞定之后再将这个中间语言到汇编的程序重写。下面是一个菲薄纳气数列的例子。  阅读全文
posted @ 2009-04-14 16:11 陈梓瀚(vczh) 阅读(2508) | 评论 (9)  编辑
JIT脚本引擎:继续工作      摘要: 大约两个多星期没做JIT了,经过之前些其他代码消遣,现在还是继续做下去的好。目前的成果是完成了汇编数据结构、完成了汇编到机器码的转换器、知道了成员对齐、调用转换的约定、知道如何实现异常处理以及完成了中间指令的数据结构和检查。现在需要做的事中间指令到汇编的转换程序。  阅读全文
posted @ 2009-04-11 15:30 陈梓瀚(vczh) 阅读(1805) | 评论 (1)  编辑
JIT脚本引擎:中间语言定稿并完成验证工作      摘要: 经过一个多星期的推敲,终于将中间语言定稿。为了屏蔽寄存器、堆栈、数值比较逻辑、跳转、变量参数存放位置等,设计了以下中间语言。  阅读全文
posted @ 2009-03-20 12:49 陈梓瀚(vczh) 阅读(2077) | 评论 (1)  编辑
JIT脚本引擎:中间指令草稿      摘要: 中间指令主要用于解决以下问题:
1、不同大小的整数、浮点、指针的互相转换和计算
2、寄存器分配
3、跳转
4、调用转换(stdcall、cdecl、fastcall)
5、临时存储单位(变量等)

因此指令在设计的时候需要
1、不让用户知道东西是放在哪里的(没有堆栈给你push和pop,而且变量在物理上不一定存在,譬如说可能在寄存器里面,或者直接优化没了等等)
2、不让用户接触到各种标志位(譬如说那个恶心的浮点比较)
3、不让用户接触到stdcall、cdecl和fastcall的区别(因此call指令需要将所有参数一起写入,而不是在之前push)
4、不让用户接触不同类型数据的转换过程(全自动处理,就算你int32=fp32+int16,也是一条指令。)
5、为了保持灵活性,声明变量的时候只指出其大小,在使用变量的每一处地方标记类型(因此可以在不同的地方标记为不同的,可以救急)
  阅读全文
posted @ 2009-03-11 13:05 陈梓瀚(vczh) 阅读(1675) | 评论 (0)  编辑
JIT脚本引擎:成员对齐详解      摘要: 为了让编译成x86后的代码可以转换成C++的函数指针,我们也必须处理成员对齐的事情。如果脚本里的结构成员对齐跟C++不一致的话,会造成很多麻烦。下面是成员对齐的计算方法:  阅读全文
posted @ 2009-03-10 12:46 陈梓瀚(vczh) 阅读(3465) | 评论 (2)  编辑

Full JIT Archive