1. 程式人生 > >在C++專案中引入Lua(AlphaGo使用的方案)

在C++專案中引入Lua(AlphaGo使用的方案)

       最近大火的AlphaGo,其中的deepmind已經開源,可以到github中下載https://github.com/deepmind/lab·,網上還有一個基於Python開源AlphaGo,那個不是google的。通過看deepmind原始碼,我們可以知AlphaGo使用的是C++和Lua方案。當然語言不是AlphaGo的重點,但還是說明了c++和Lua方案能夠完成大型的專案。
      從2009年開始在三維模擬專案中引入Lua,C++專案的開發效率得到了大幅度。在我們三維模擬這種對效能要求較高的專案中,Lua對效能並沒有造成大的影響。我最早接觸Lua是看到魔獸世界中的任務指令碼,後來看了雲風的部落格,他在網易的網遊中引入了Lua,這讓我確定了在我的專案中引入這種指令碼。當前還有很多應用程式和遊戲也是使用LUA作為嵌入式指令碼語言,以此來實現可配置性、可擴充套件性。這其中包括魔獸世界、博德之門、憤怒的小鳥、VOCALOID3、太陽神三國殺 等。你在玩遊戲時看他的安裝目錄中,你會經常看到lua字尾的指令碼檔案。
      從2010年我公司開始進入視訊處理領域,由於視訊分析處理對效能要求和技術要求較高,所以開發成本也很高,一般一兩年c++經驗的開發人員很難做出成果,但是在引入了Lua之後,一些新人也可以參與到專案中去了,在核心架構搭建好後,通過引入Lua將部分業務邏輯放到Lua中開發,不僅提高了開發效率,對開發人員要求也降低了。
      在這多年專案開發中總結出來,對於c++專案不管多大,一定要引用一種指令碼,Lua是其中比較成熟可靠的方案。Lua指令碼原始碼非常小沒有依賴,可以很容易在各個平臺上編譯,Lua原始碼不僅提供了執行程式碼,還提供了編譯程式碼,也就是說你可以將你寫過的Lua指令碼進行編譯以防止原始碼洩露,並提高執行效率。Lua指令碼內部還提供了除錯斷點函式,所以你可以自己開發一個除錯工具,當然也有第三方提供的開源斷點除錯工具,我們都知道寫c++程式如果不能除錯那開發效率一定會大幅度降低。這也是我使用Lua,暫時還沒有使用node.js的原因。
下面介紹一下Lua:
      Lua 是一個小巧的指令碼語言。是巴西里約熱內盧天主教大學(Pontifical Catholic University of Rio de Janeiro)裡的一個研究小組,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所組成並於1993年開發。 其設計目的是為了嵌入應用程式中,從而為應用程式提供靈活的擴充套件和定製功能。Lua由標準C編寫而成,幾乎在所有作業系統和平臺上都可以編譯,執行。Lua並沒有提供強大的庫,這是由它的定位決定的。所以Lua不適合作為開發獨立應用程式的語言。Lua 有一個同時進行的JIT專案,提供在特定平臺上的即時編譯功能。
     Lua指令碼可以很容易的被C/C++ 程式碼呼叫,也可以反過來呼叫C/C++的函式,這使得Lua在應用程式中可以被廣泛應用。不僅僅作為擴充套件指令碼,也可以作為普通的配置檔案,代替XML,ini等檔案格式,並且更容易理解和維護。Lua由標準C編寫而成,程式碼簡潔優美,幾乎在所有作業系統和平臺上都可以編譯,執行。一個完整的Lua直譯器不過200k,在目前所有指令碼引擎中,Lua的速度是最快的。這一切都決定了Lua是作為嵌入式指令碼的最佳選擇。
      Lua還具有其它一些特性:同時支援面向過程(procedure-oriented)程式設計和函數語言程式設計(functional programming);自動記憶體管理;只提供了一種通用型別的表(table),用它可以實現陣列,雜湊表,集合,物件;語言內建模式匹配;閉包(closure);函式也可以看做一個值;提供多執行緒(協同程序 ,並非作業系統所支援的執行緒)支援;通過閉包和table可以很方便地支援面向物件程式設計所需要的一些關鍵機制,比如資料抽象,虛擬函式,繼承和過載等。

我們做一個示例 lua呼叫c++函式
////////////////////////////////////////////////////////////////////////////
///C++程式碼部分
int LuaCallC(lua_State *L)
{
    //獲取第一個引數
    int para1 = lua_tonumber(L, 1);

    //獲取第二個引數
    int para2 = lua_tostring(L, 2);
    return 0;
}
//註冊這個C++函式給lua呼叫
lua_register(lua, "LuaCallC", LuaCallC);

-----------------------------------------------------
---Lua程式碼部分
---呼叫c++函式
LuaCallC(100,"teststring")



     這個示例只是演示下呼叫過程,多型別引數、返回值、型別檢查都沒有加。但通過這個示例可以看出來C++與Lua互動的簡單,同樣C++呼叫Lua函式也比較簡單。後面我會再來出一些詳細教學文章。
也可以看我一個視訊教程
Lua與C++互動實戰視訊課程
http://edu.csdn.net/course/detail/3386
Lua與c++互動實戰