动态的汇编语言?

MinScript被设计成一种动态的脚本语言,类似pythonJavaScript之类的,不过是专门为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;

 

 

Otperson

 

 

Begin

 

 

Myname:=’

 

 

O=tperson.create(myname);

 

 

Write(o.iam);

 

 

End;

 

 

 

 

delphi里:

 

 

TPersonXiao=classTperson

 

 

End

 

 

继承脚本里面的tperson   

 

 

        Delphi类和脚本类的交互很直接,不用太复杂的类型注册。不过应该是做不到Groovyjava的样子的,呵呵。

 

 

    先说下脚本的运行流程,编译源代码,[经过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,而且函数调用时使用了一个折中的方式保存,espebpip,不是保存在堆栈中的,和真正的汇编不一样,下个版,就要解决这个问题,经验太少了,开始没有考虑,现在改起来太麻烦了。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可以模仿delphiclasscreate创建类,实际怎样只有实际实现了才知道,不多说啦。

 

 

二:今年毕业!毕业就要找工作!!不是名牌就找不到好工作!!!所以我什么也得试试,这也是暂时停止写代码的原因,某考试,快开始了,得看这方面的书了,之后再继续写这个程序。顺便问问,哪位同学的公司招聘啊?如果方便的话,给个信儿,我发简历。谢谢!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值