Post has attachment
网友废柴评:脚本语言PAWN与LUA
(Liigo注:根据文章分析,作者比较推崇和喜欢Pawn语言;但Lua语言的coroutine机制还是决定性的吸引了他选用Lua。文章写于2010年,三年前。)

首先推荐1个脚本语言PAWN. 如果你需要1个极其轻量和快速的脚本语言, 那无疑就是PAWN了. PAWN名字很酷, 其意为国际象棋里的"卒", 在2005年之前的名字是SMALL, 东西恰如其名, 非常小, 纯虚拟机代码7-8K就能搞定, 效率方面也是我见过脚本语言中最高效的, 支持JIT.
PAWN也是个经过了一些项目包括商业项目考验的脚本引擎, 虽然其数量远无法与大热的LUA相比.
PAWN有大量我非常喜欢的特性:
- c风格的语法, 太舒服了
- 舒服的API, 更直接的c与脚本的交互
- 真数组, 以连续内存存在, 以及配合enum实现的简易"struct"
- 支持传引用, 支持缺省函数参数
- 字符串的实现, unicode不是问题
- 轻量的tag和重载运算符
但是, 我计划中的PuppetMaster项目还是没有选择PAWN, 这是因为以下两点:
- PAWN不支持obj.xxx这样的引用或者函数调用, 虽然这个可以通过自己写预处理猥琐实现, 但是不美
- LUA的coroutine, 作为嵌入脚本实在太帅, 正是我最理想的需要, 远不是其他可比, 真线程(python)或者无线程(PAWN, 囧)都太不美
虽然非常喜欢PAWN, 最后还是不得不选择LUA, 因为coroutine, 几天前简单把LUA 5.1.4的虚拟机提了一下, 编译了个只能跑字节码只有lbaselib的lua.exe, 39KB, 犹豫之后还是保留调试信息处理, 否则是34KB, 勉强接受吧...

Post has attachment
Pawn脚本语言在 DSO Quad 设备中的应用

Post has attachment

Post has attachment

Post has attachment

Post has attachment
64位Linux系统编译 Pawn 源代码遇到问题
许多编译错误,都是跟64位指针和整数类型转换不兼容有关:
--------------------------------------------------------------------------------------
/home/liigo/pawn-4.0.4733/source/amx/amx.c: In function ‘amx_Callback’:
/home/liigo/pawn-4.0.4733/source/amx/amx.c:553:7: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
/home/liigo/pawn-4.0.4733/source/amx/amx.c:575:1: error: size of array ‘__ASSERT_STATIC_575’ is negative
/home/liigo/pawn-4.0.4733/source/amx/amx.c:582:18: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
/home/liigo/pawn-4.0.4733/source/amx/amx.c: In function ‘amx_Init’:
/home/liigo/pawn-4.0.4733/source/amx/amx.c:1340:20: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
/home/liigo/pawn-4.0.4733/source/amx/amx.c: In function ‘amx_Cleanup’:
/home/liigo/pawn-4.0.4733/source/amx/amx.c:1473:39: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
......
--------------------------------------------------------------------------------------
以第一个警告为例:f=(AMX_NATIVE)func->address; 试图将一个uint32_t 类型的值(func->address)强制转换为64位指针变量(AMX_NATIVE),难怪编译器会抱怨。
第二个编译错误:assert_static(sizeof(f)<=sizeof(cell)); /* function pointer must fit in a cell */ 要求 cell 必须是足以容纳64位指针。 
我尝试过修改宏 PAWN_CELL_SIZE=64,编译时仍然有一堆编译警告 。所以我怀疑作者根本就没有在64位系统内编译过Pawn/AMX。

那么,现在有一个问题: Pawn是否支持在64位系统内运行呢? 
根据官方的资料,应该是支持的:
[1]: "pawn runs as a 32-bit language on 8-bit and 16-bit processors; it supports fixed-point or floating-point arithmetic (when available on the platform). You can also build pawn as a 64-bit language, too."
[2]: "The pawn compiler can now generate 32-bit, 64-bit or 16-bit AMX files (for the abstract machine). A new command-line option indicates the cell size. There is no more need to create two versions of the pawn compiler if you wish to support both 32-bit and 64-bit scripts."

[1] http://www.compuphase.com/pawn/pawnfeatures.htm
[2] http://www.compuphase.com/pawn/pawnhistory.htm

但事实上,还有别的网友遇到了和我同样的问题,他们也不能在64位系统下编译运行Pawn:
https://code.google.com/p/pawnscript/issues/detail?id=6
这是Pawn官方源码仓库里的 Issue 6,另一网友也回复确认了这个问题。但官方人士(一年多以来)至今没有回复或处理该Issue,让人费解。

结论:Pawn暂不支持在64位操作系统下运行Pawn脚本 (但将来支持并不困难)。

最大的理由还是这一句代码:
AMX_NATIVE f = (AMX_NATIVE) func->address;
AMX_NATIVE是一个函数指针类型,func->address是一个uint32_t类型,两者在64位系统下明显不兼容的。func->address实际上用来存储(Windows平台的HANDLE或Unix平台的void*),但是在64位系统下,一个uint32_t显然是不足够的。

至于前面引用到的有关官方对cell尺寸和所谓"64-bit"的表述,应该理解为仅仅是针对Pawn虚拟机自身而言的。

Post has attachment

Post has attachment
就是这篇文章,促使我下决心学习Pawn语言:它的运行速度和小巧的身板,给人印象太深刻了!初步了解后发现,Pawn语言已经很成熟了,文档也相当全面,只是人气比Lua差很多。感谢译者RingOfTheC,让我读到如此好文,我(Liigo)决定把此次阅读本文的日子,2013年12月3日,作为我的Pawn语言纪念日。

英语原文:http://codeplea.com/game-scripting-languages
原文作者:Lewis Van Winkle

Liigo必须提醒读者留意:这篇文章写于2009年(译文出现在一年后),似乎已经陈旧?2009年至今(2013年),Lua已经从版本5.1升级到5.2,Pawn已经从版本3.3升级到4.0,相信大家都有了不小的进步。

Post has attachment
Pawn:嵌入式脚本语言  (Lua之外的又一选择)

Pawn是一个简单的、无类型的、32位、语法类似C语言的扩展语言。Pawn源代码被编译为二进制文件以优化运行速度。Pawn编译器输出P-code(字节码)然后在虚拟机中运行。运行速度、稳定、简单、小巧,是Pawn语言及其虚拟机的核心设计准则。

Pawn: An embedded scripting language
pawn is a simple, typeless, 32-bit extension language with a C-like syntax. A pawn "source" program is compiled to a binary file for optimal execution speed. The pawn compiler outputs P-code (or bytecode) that subsequently runs on an abstract machine. Execution speed, stability, simplicity and a small footprint were essential design criteria for both the language and the abstract machine.
Wait while more posts are being loaded