MinScript被设计成一种动态的脚本语言,类似python,JavaScript之类的,不过是专门为delphi程序员设计的,有两个目标:1:使用类delphi语法,delphi程序员不用学习就可以直接使用,2是弱类型的。现存的脚本语言这两个目标应该(避免孤陋寡闻,加上应该二字)都没有实现,呵呵,所以,还是有一定的研究意义的。
整个代码思想源自GameScriptingMastery这本书。
Minscript现在还没有实现,我只是说说我的设想,
脚本:
Tperson=class
Name,age
Function Iam;
Begin
Result:=name;
End;
Constructor Create(YourName);
Begin
Name:=YourName;
End;
destructor Destroy;
begin
end;
End;
执行
Var myname;
O:tperson;
Begin
Myname:=’小旻’;
O:=tperson.create(myname);
Write(o.iam);
End;
在delphi里:
TPersonXiao=class(Tperson)
End;
继承脚本里面的tperson
Delphi类和脚本类的交互很直接,不用太复杂的类型注册。不过应该是做不到Groovy和java的样子的,呵呵。
先说下脚本的运行流程,编译源代码,[经过minscript编译,产生minasm源代码],经过minasm编译,产生 二进制代码,经minvm解释执行输出结果。整个过程类似java的执行过程。
MinAsm:汇编语言。
var
b,a,c,i,param[10];
function add100;
var
a;
begin
mov a,param[0]
add a,100
mov @result,a
end;
begin
mov a,100
push a
push 1;参数个数
call add100;
mov a,@result
mov b,10
mov b,a
push b
call iwrite;调用宿主函数输出结果
end.
Minasm的语法就是上面这个样子。
Minasm使用预测分析法,处理源代码,支持的关键字可以看uconst.pas文件,整个程序以UParser语法分析单元为中心。
错误:直到昨天晚上,我才理解GameScriptingMastery的作者为什么要实现param关键字传递参数,我想当然的以为只要pop param,就可以取出参数了,可没想过转跳过后ebp会改变,用delphi写了个测试函数才发现了,delphi取参数都是用的[ebp-xx],所以,设了一个全局数组param[],存放参数,minasm现在最大的问题就是,RunTimeStack,而且函数调用时使用了一个折中的方式保存,esp,ebp,ip,不是保存在堆栈中的,和真正的汇编不一样,下个版,就要解决这个问题,经验太少了,开始没有考虑,现在改起来太麻烦了。uHospapi,注册宿主函数的,iwrite就是我实现的,为了方便传值,暂时宿主函数一定是stdcall的,下一版,将支持所以的传值方式,
说来惭愧,GameScriptingMastery这书有中文版的,但是网络上只能下载到英文版的,我是一边看,一边拿金山词霸翻译,直到词法分析单元,实在看不下去了,大略把剩下的都看完了,虚拟机和词法分析单元,都是我自己用非常直观的方式写的,可能和书里的很不一样。英语是个我的大问题呀,哎。
Minscript。没有实现。但是也实现了一小部分,有:
1:预处理:去掉注释,处理uses关键字,即,load所以文件,检测循环引用
2:词法分析,借助于cncack里的一个单元,CnTokens.pas,可以检测全部delphi语法,Minscript作为delphi语言的一个子集。
3:语法分析:用递归下降的方法,只实现了var关键字的处理
MinVm:代码执行的虚拟机,解释执行指令。
如果你想看看代码的话,打开minvm里的testvm.dpr,调试,源代码输入在文件test0txt里面.
----------------------------------------------------------------------------------------------------------------
先说到这里,对于一个有问题的程序说的太多,就像介绍大便一样,会令人恶心的,呵呵,明知道有错误,你还整出来让人家知道,和拉了便便非要指着让人看有啥差别?你要拉的好看有个性,说说也就得了,你说就是一普通的大便,,,,,,,,啊哈,呵呵,开个玩笑。有两个原因:
一:我的能力实在是太有限了,这4000多行代码,我写了1个多月,特别是放寒假这10多天,差不多每天都是每天早9点到晚2点,看看书,写代码,写代码,看看书,不懂的太多,当然,有时候会边看死神,边干这事儿。所以,如果有人能给我些指导,或者一起研究就好了。说到这里还有一个问题,就是Minscript能不能实现?GameScriptingMastery里并没有实现类,还记录都没实现,那你用他的思想能实现类吗?答案是:我也不知道。但是我想当然的认为可以,因为delphi实现了类,delphi也是编译成的汇编啊,minasm可以模仿delphi的classcreate创建类,实际怎样只有实际实现了才知道,不多说啦。
二:今年毕业!毕业就要找工作!!不是名牌就找不到好工作!!!所以我什么也得试试,这也是暂时停止写代码的原因,某考试,快开始了,得看这方面的书了,之后再继续写这个程序。顺便问问,哪位同学的公司招聘啊?如果方便的话,给个信儿,我发简历。谢谢!