|
最近尝试做了这么一件事:通过一个脚本程序来把标准的二进制图片转换为自定义的图片格式(涉及到一些常规或不常规的压缩算法)。二进制图片的信息由一个宿主程序提供。传给脚本程序后其他的宿主程序就不管了。主要要求那个脚本程序可以自由的调用其他二进制模块,甚至直接call到某个地址上(因为有些时候我们得利用别人DLL里的一些代码,而这些代码的入口根本没有导出来)。而且要求在脚本程序内可以实现一些低层次的操作,如内存、位操作等,这样就可以不过多的依赖外部二进制的模块了。 本来打算在Lua的基础上扩展。Lua与C的互动是通过一个自己定义的栈来实现的,提供了一些API来操作。为了增加更多的灵活性,我自己写一个小的脚本系统,有类似C一样的操作符和流程控制结构,提供与C一样的函数传值机制,这样只要宿主程序生成一个状态机,设好传值后就可以放飞脚本程序了。 整个程序绝大多数由纯C写成,其中有一小段汇编,核心代码中没有使用任何的外带库(包括C标准库)。内置的脚本库函数属于扩展部分,使用了C标准库和几个Win32api中关于DLL的几个调用(Unix下也有相应的调用)。通过内置的库函数,脚本程序可以直接调用DLL里的C函数,也可以调用宿主程序注册的函数。一切都是与C一致的,取值设值不需要push来pop去。 今天终于又上来了,前几天把那堆垃圾代码重新理了理,调整了一下调用(当时写的时候晕忽忽的)优化了一下,主要是把文本预处理成了二进制代码(所有能预计算的都预计算了),整体速度至少要快了5倍。其次优化了运算符函数,位操作的速度得到了很大的提升(忽略了浮点类型)。如果单做计算和大循环速度和Python差不多了(试了800x600的图片)。另外内建支持了UTF-8和UTF-16编码的字符串。二进制调用规范支持__cdecl、__stdcall和__thiscall(以便以后直接调用C++类成员函数)。
 (1)常数 浮点数:XXXXX.XXXXX; 二进制整数:0nXXXXXX; 八进制整数:0oXXXXXX; 十进制整数:XXXXXXXX; 16进制整数:0xXXXXXX; 字符型整数:'CCCC'; 原始字符串:"""string"""; 转义字符串:"\a\b\f\\n\r\t\v\char\xXX",字符串前面加u为UTF-8字符串,加L为UTF-16字符串
(2)操作符 ! ~ * / % + - | & ^ >> << @(取地址) < <= > >= == != = *= /= %= += -= |= &= ^= >>= <<=
(3)流程控制 if [exp] [ // code block ] elif [exp] [ // code block ] else [ // code block ]
// 循环 for [init, check, step] [ // code block ]
while [exp] [ // code block ]
do [ // code block ] while [exp] 循环里支持break和continue语句
(5)注释 行注释有//和#,块注释是/* */
(6)一些想法 增加sys.importBin [bin file]调用,在二进制模块里导出一个成员来装载模块内的调用; 增加sys.importXml [xml file]调用,使用一个XML文件来装载一组二进制模块的调用; 增加内嵌第三方语言的外部语言模块,可以做到在脚本里嵌入汇编、C、Lua等语言;
|
一共有 6 条评论
哦,顺便问一下,我用gv解小魔女帕妃2的时候,调色板错误,调色板文件我改了,可是仍然有问题。