摘要: 脚本引擎的作用在于增强程序的可配置性。从游戏到管理系统都需要脚本,甚至连工业级产品的Office、3DS Max以及AutoCAD等都添加了属于自己的脚本语言。DHTML的出现让我们可以在网页代码中嵌入脚本语言,PHP和ASP等技术的出现让我们可以将一个应用程序的界面换成网页,而逻辑使用脚本语言编写。现在脚本语言的种类繁多,Python的发展让BOOST库拥有了对Python的支持,Rails框架的出现壮大了Ruby的实力,LUA更是被大量应用在游戏开发中。Windows甚至提供了wscript以便让我们能够调用javascript和vbscript的代码。
既然有了这么多可供选择的脚本引擎,为什么我们仍然要开发自己的脚本引擎呢?
阅读全文
posted @
2008-07-07 07:45 陈梓瀚(vczh) 阅读(21590) |
评论 (12) |
编辑 收藏
考试结束了,Vczh Free Script 2.0也放出来了,正则表达式的代码也一并发包含在VFS 2.0里面了。于是想写一个关于如何开发脚本引擎的系列。过几天要去实习了,如果找到晚上上网的办法的话会陆续发出来,要不然的话只能在实习结束之后一并发上来了。
脚本引擎在很多时候都能用上,而且现在也有很多脚本引擎的产品了。为什么还要学习如何写脚本引擎呢?其一是为了学习,其二是为了了解。学习对于自己的编程水平的提高很有帮助,了解对于使用当今的脚本引擎也很有帮助。而且自己开发脚本引擎的好处在于可以自己控制安全问题。虽然这个在大多数情况下并不是优先考虑的条件。
脚本引擎的开发是有一定的方法的。首先,要把输入的脚本代码变成记号,也就是说把“printf("Hello World");”变成print、(、"HelloWorld"、)和;五个部分。至于开发可配置的高速词法分析器可以看这篇文章。接下来就是语法分析器。这个时候首先需要了解为什么代码是一棵树(数据结构的树),然后才能开始工作。至于如何写语法分析器,或者词法分析器也想手写的话,可以看这篇文章。为了执行效率,我们需要将语言抽象成指令集,就像X86的指令集一样,但是更加简单。可以使用堆栈机。
一门支持能垃圾收集的string、array和不能垃圾收集的class的语言是很容易编译成机器码的。现在我正在阅读intel的文档了解x86(32位)的指令格式。如果在写文章的过程中这个问题被我解决了的话,我也会顺便把如何将脚本编译成机器码以便加快执行速度的办法写出来。现在我对于x86指令集的模式已经了解了,剩下具体问题。垃圾收集器的资料并不多,我唯一找到的就是《Garbage Collection,Algorithms for Automatic Dynamic Memory Management》。中文版貌似卖完了,我只能下载英文版的影印版看。很惨。在文章里面我会讲述一种比较简单的单代compact垃圾收集器(.NET用的是多代)。
文章的组织暂时决定使用如下方法:
·如何设计合适自己使用的语言
·词法分析器、语法分析器与语法树的结构(一开始只有函数、字符串以及能进行垃圾收集的数组,弱类型语言)
·如何设计合适的指令集
·指令集(堆栈机)的数据结构以及从语法树翻译到指令集的方法
·虚拟机的开发
·如何向虚拟机加入外部函数以便让脚本可以调用程序提供的其他功能
·进一步修改语言,加上其他特性等
如果x86的指令集研究的速度够快的话,将会添加如下内容
·分配寄存器的算法
·x86指令格式
·如何调用自己产生的机器码
这个系列持续的时间将比较久,而且每一篇文章将附带示例代码。如果只需要了解方法而不需要看具体的实现的朋友们可以略过这个部分。关于具体实现的部分我将可能在文章中标明出来。
posted @
2008-07-06 08:37 陈梓瀚(vczh) 阅读(2274) |
评论 (5) |
编辑 收藏
摘要: 作者保留对源代码的一切权利
文件是一个rar压缩包,结构如下:
【产品】
【Demo】两个Demo的编译结果。这个文件夹里面的脚本代码仅供测试用。
【库】编译结果以及Vczh Free Script 2.0提供的插件封装,使用Vczh Free Script脚本语言编写。
【文档>】使用说明书。
【源代码】源代码仅能使用Visual C++ 2005或以上编译器编译。
【FreeScript】使用FsRuntime.dll写的C++Demo,控制台虚拟机。
【FreeScript_CSharp】使用FsRuntime_clr.dll写的C#Demo,控制台虚拟机。
【FsRuntime】Vczh Free Script 2.0 DLL接口。
【FsRuntime_CLR】使用FsRuntime.dll写的.NET接口。
【Library】
【Data】数据输出以及必要的操作系统接口封装。
阅读全文
posted @
2008-07-01 05:35 陈梓瀚(vczh) 阅读(11138) |
评论 (23) |
编辑 收藏
摘要: 玩了几天空之轨迹 FC,终于快结束了。距离最后一门考试还有3天,于是把整个XPath的代码写完了。于是试用一下。
现在展示一下我那个XPath的使用方法:
1 VL_List
Result;
2 VL_XPath XPath(L"//Files//File[contains(@RelativePath,\".cpp\") or contains(@RelativePath,\".h\")]");
3 XPath.Query(Doc.GetRootElement(),Result); 第一行声明一个XML节点列表,第二行构造一个XPath,第三行将XPath作用在一个XML文档的根节点上。这个XPath用于把VC++9.0的工程文件中包含的所有.h文件和.cpp文件提取出来。虽然Files里面包含若干Filter,每一个Filter包含一些Filter和File,不过输出结果Output.xml把所有的满足要求的File节点都找了出来。
阅读全文
posted @
2008-06-27 20:55 陈梓瀚(vczh) 阅读(2396) |
评论 (2) |
编辑 收藏
摘要: 花了2个小时终于把XPath的数据结构和语法分析做完了。这个XPath的语法完全按照MSDN所说的做,除了减少了2个跟DTD相关的函数和11个Microsoft扩展的"ms:"开头的函数以外,剩下的功能将一概支持。
代码写完了之后,我打开MSDN找里面的几十条XPath Example进行测试,发现了一些Bug,然后修正。现在MSDN所列举的所有例子都通过了,接下来只有自己写Example进行测试了。因为MSDN的例子并没有覆盖所有等价类。
下面是运行结果和测试程序的代码:
阅读全文
posted @
2008-06-21 00:34 陈梓瀚(vczh) 阅读(2447) |
评论 (2) |
编辑 收藏
摘要: 为了整理出可以实现的XPath,我把根DTD相关的两个内置函数去掉了,Microsoft扩展的11个函数也没有考虑进去。XPath是一门非图灵完备的、没有副作用的、弱类型以及很难看的语言,用于把一个XML的某个节点转换成一些节点。
Context:上下文。指的是使用指定条件正在搜索的XML路径的节点。
ContextList:被PREDICATE过滤的列表... 阅读全文
posted @
2008-06-20 01:44 陈梓瀚(vczh) 阅读(4900) |
评论 (1) |
编辑 收藏
摘要: 为了纪念自己为了明天的XML考试复习了半天,特地根据MSDN描述的标准做了一个XML的解释器。接口类似DOM和SAX的混合体。
目前什么都不支持,不过以后打算做完DTD和XPath。XSD和XSL就先算了。反正是写着玩的。把代码贴出来先。这个代码使用了自己开发的一套C++基础库。
阅读全文
posted @
2008-06-19 05:28 陈梓瀚(vczh) 阅读(3150) |
评论 (8) |
编辑 收藏
摘要: 首先吐槽一下:今天考IT项目管理,100道选择题。前几天考配置管理,10道大题。如今的老师都喜欢走极端……
这个方法是在考完试回宿舍的路上想到的,适用于2D与3D。主要想法是这样的。给定两个几何图形A、B,把A和B都分成『内『、『外』两部分。A的『内』就是处于B内部的部分。于是A和B就变成了A内、A外、B内、B外。然后就有如下公式:
·A and B=A外+B外
·A sub B=A外+B内
·A or B=A内+B内
·A xor B=A外+B外+A内+B内
这种数据结构是为了满足如下算法:一个A点在图形内<==>过这个点的直线交图形与点集P,其中|{Pi|Pi<=A}|和|{Pi|Pi>=A}|都是奇数。注意我们使用的是<=和>=,这样的话两个集合的数量的奇偶性都是一致的。这个算法无论2D、3D多边形还是3D多面体都能适用,就算是这个图形有孔(镶嵌)也可以,而且跟凹凸体无关。这个算法只有一种情况是不能用的:就是自己跟自己有交叉,譬如我们习惯的5条直线构成五角星的画法。这 阅读全文
posted @
2008-06-16 19:20 陈梓瀚(vczh) 阅读(4490) |
评论 (7) |
编辑 收藏
摘要: 网龙公司招聘
网龙公司是中国网络游戏开发商和运营商的领导者之一,总部位于中国福建省福州市。
1、大型WEB2.0网站架构师
2、3D游戏引擎程序设计师
3、游戏客户端程序员
4、游戏服务端程序员
5、游戏工具开发程序员
6、手机平台开发程序员
7、驱动开发程序工程师
8、B/S程序员
9、WEB2.0游戏社区软件开发工程师
10、应用软件开发程序员
月薪6千起,优秀者月薪不封顶。享受基本养老、医疗、失业、工伤、生育等保险,以及公积金和公司福利。
联系方式:
QQ:611990694(请备注:您的姓名和应聘岗位)
EMAIL:hr@nd.com.cn
内详,版主勿删。 阅读全文
posted @
2008-06-16 07:35 陈梓瀚(vczh)|
编辑 收藏
摘要: 在写可配置的语法分析器之前,我觉得还是先说说如何手写语法分析器好。因为对于大部分人来说,开发一个可配置的语法分析器并没有什么作用,反而针对某种特定的语法开发特定的语法分析器是特别有必要的。典型的有表达式计算器、某种格式化的文件(HTML、XML等)或者是其他的复杂而且符合树型结构的字符串。根据目前论坛的反应来看,有一些朋友们对如何开发一套自己的脚本引擎比较感兴趣。等基础的文章都写完以后我会考虑撰写一个系列的文章介绍如何开发自己的脚本引擎。
这篇文章会附带一些必要的代码以便帮助读者们理解。为了方便,代码使用DevC++开发。 阅读全文
posted @
2008-06-15 05:59 陈梓瀚(vczh) 阅读(40067) |
评论 (28) |
编辑 收藏