輕量級腳本語言 Squirrel

openkk 13年前發布 | 28K 次閱讀 編程語言

Squirrel是一種高級的面向對象的編程語言,Squirrel是一個強大的腳本工具,Squirrel可以用于開發對文件大小、內存占用、帶寬以及實時性要求非常嚴格的程序(例如游戲,偶很納悶游戲需要這么高的要求嘛?)。盡管Squirrel提供了大量的特性(例如支持動態數據類型,委托,函數對象,迭代器,尾遞歸,異常處理,自動內存管理),Squirrel包括編譯器和虛擬機的全部代碼只有6000行不到的代碼。
      它從著名的LUA語言繼承了很多特性,適用的范圍也與LUA語言相似。
Squirrel的作者是意大利人Alberto Demichelis,SQUIRREL開發的本意是用于替代LUA,LUA的很多語法與C/C++ 不一致,C/C++程序員寫腳本時,容易犯錯誤,而SQUIRREL語法與C/C++很相似,因此Squirrel更適合C/C++ 程序員。
Squirrel是一種動態語言,它有一個編譯器和虛擬機,代碼會被動態編譯成字節碼,然后在虛擬機上執行。當然,這種編譯比C/C++或者Java的編譯要簡單很多,它的虛擬機也不會有JVM這樣“底層”,Squirrel的虛擬機更像是一個“函數執行隊列”,這個虛擬機是建立在標準libc基礎上的(也就是說標準C函數在這個虛擬機中是元操作,而JVM是建立在匯編語言基礎上的)。
Squirrel在設計上就是要做到嵌入C/C++程序,因此,Squirrel虛擬機可以與C/C++工作在一個進程/線程當中,通過虛擬機的接口,C/C++的數據可以被嵌入的Squirrel代碼訪問,反之Squirrel的代碼和數據也可以被C/C++完全控制。
從語言結構上看,Squirrel與Lua一脈相承,Squirrel與Lua的基礎都是廣義表(或者說是一顆多叉樹),Hash算法在這個廣義表中起到一個關鍵的作用。
Squirrel代碼和數據都是組織在一個廣義表當中的。數據、函數、類(Lua不支持OO,Squirrel支持有限的OO)都是廣義表的一個值,值都是采用<名稱,值>的方式存儲的,通過對名稱的Hash,可以很方便的找到值。
Squirrel比Lua更好的支持OO,Squirrel可以定義類,允許類繼承,能夠自動執行構造(constructor函數),而Lua只能通過Table來模擬類。更關鍵的一點,Squirrel允許類產生實例(instance),每個實例擁有自己的存儲空間,在這點上,比Lua的模擬類明顯好用。
Squirrel支持在每個實例上設置一個Userpoint,這個特性非常有利與與C++Object的接口,一個Squirrel類可以的作為一個C++ class的影子運行,我們只需要在Squirrel上實現C++class的接口,通過Squirrel的Userpoint,即可操控這個C++ Object。
值得關注的是Squirrel的執行速度,執行一個10000元素的數組創建及遍歷,其速度大約是C++的1/4,比Lua快20%。
Squirrel的保留字與C++幾乎一致,但Squirrel沒有指針,內存由虛擬機管理,不需要手工申請和釋放,所以沒有new和delete關鍵字。Squirrel是弱類型的,所以也就沒有char、float、int、double等關鍵字,值得注意到是Squirrel不支持double(Squirrel 3.0支持使用double代替float),其浮點數內部是float,這可能與Squirrel主要為游戲設計有關。
Squirrel新增了一些關鍵字,主要有local、typeof、instanceof、resum、yield、delegate、parent等(其中delegate、 parent關鍵字在Squirrel3.0Alpha版中似乎有變化),resum、yield用于Squirrel的“協程”,可以理解為非搶先式的內部線程(Squirrel虛擬機是單線程的,一個虛擬機內部不支持系統的線程,這和Lua很相似)。
值得注意的是local關鍵字,Squirrel中的變量是需要定義的,和C++一樣,你可以在程序的任何地方定義,但定義的時候必須使用local關鍵字。使用local表明變量在堆棧里創建,離開函數才會自動銷毀。
Squirrel循環控制語句增加了foreach循環,而且這個foreach不像Lua一樣需要什么“閉包”,可以很簡單的使用,例如foreach(local i in arrayVar){},這完成對一個數組的遍歷,foreach(local key,value in tableVar){}, 這完成對一個表達遍歷。

示例代碼

local table = {
    a = "10"
    subtable = {
        array = [1,2,3]
    },
    [10 + 123] = "expression index"
}

local array=[ 1, 2, 3, { a = 10, b = "string" } ];

foreach (i,val in array) { ::print("the type of val is"+typeof val); }

/////////////////////////////////////////////

class Entity {
constructor(etype,entityname) { name = entityname; type = etype; }

x = 0;
y = 0;
z = 0;
name = null;
type = null;

}

function Entity::MoveTo(newx,newy,newz) { x = newx; y = newy; z = newz; }

class Player extends Entity { constructor(entityname) { base.constructor("Player",entityname) } function DoDomething() { ::print("something"); }

}

local newplayer = Player("da playar");

newplayer.MoveTo(100,200,300); </pre> logo.gif

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!