lua源碼雲風
『壹』 如何在Windows平台使用VS搭建C++/Lua的開發環境
環境
Windows 8.1
VS2012
Lua5.2.3
如何搭建
1.生成Lua靜態庫
(1)下載lua src。
最新版本是5.2.3。下載地址。
(2)新建VS Win32控制台應用程序,取名為Lua。在應用程序設置中選擇應用程序類型為靜態庫,附加選項中取消預編譯頭的勾選。
『貳』 Lua為什麼在游戲編程領域被廣泛運用
用過Lua的都知道,Lua無論在與C/C++數據傳遞,還是在封裝都很方便,API非常簡單。同時Lua的許可證和緊湊性(把lib編譯進程序即可),都十分利於集成。這些都是Python和V8不能比的。同時,Lua編程學習難度極低。Python雖然容易學,但不簡單;JavaScript學習難度不夠低。實際上,Lua進入游戲業非常早,早在1998年盧卡斯的《異域狂想曲》(Grim Fandango)中,就首次在游戲領域用到了Lua。十年之前著名的游戲博德之門、猴島4都用了Lua。至少從開源代碼來看,雲風對Lua的使用是十分重度的,比如skynet的入口是在Lua上。國內很多游戲對Lua的使用很淺,多是把一些需要經常改的運算放出來給Lua做。
『叄』 Lua 為什麼在游戲編程領域被廣泛運用
Lua雲風在九十年代就開發游戲引擎並建設個人網站(雲風工作室),在游戲開發領域聲望高。網易《大話西遊II》是首個在市場上取得成功的國產網路游戲。所以後來國內游戲開發行業紛紛受此影響採用Lua。
《大話西遊》用的腳本語言是微軟的JScript(JavaScript的一種方言),維護不便bug多,受系統IE版本的影響兼容性差。所以2002年網易開發《大話西遊II》時,決定在客戶端內嵌別的腳本語言。當時該項目技術負責人雲風認為要挑不出名的語言,讓做外掛的人搞不懂(《大話西遊》一代被外掛《月光寶盒》搞死了),於是就選擇了Lua 4.0。
現在,2013年,Lua和其他流行腳本語言Python、JavaScript各分秋色:
語言規范精簡、運行時庫小。其創始人稱Lua是穿過針孔的語言(Passing a Language through the Eye of a Needle),他加入的任何語言特性都能用C API簡單的調用。
易於創建受限環境,C語言一端可以控制暴露給Lua腳本的任何功能。我猜這也是《魔獸世界》的插件語言選用Lua的原因。
性能方面,雖然仍然比Python快,但不如V8(谷歌的JavaScript實現)。
『肆』 如何閱讀luajit的代碼
為什麼要看luajit的源碼
作為目前最快的腳本語言之一,luajit確實是一個傑作,但相比原生lua僅僅幾萬行的代碼而言,luajit卻可以說是巨無霸。更要命的是,luajit之所以快,是因為大量使用了機器碼相關的技術,無論是它的機器碼編譯部分,還是位元組碼執行部分,讀起來都非常麻煩。
網上這方面的資料非常少,即使是lua社區的雲風大大也主要以分析原生lua為主,跟luajit有很多不同。萬一遇到了性能坑,或者其他難以解決的問題,需要找到原因,又不能閱讀源碼的話,就只能依賴網上其他人的結論,否則完全無從下手。
調試luajit
萬事的開頭,從能夠自己調試代碼開始
一個能調試的代碼,閱讀起來會遠遠比眼看要清晰得多。
而如果能利用visual studio進行調試,那麼對讀luajit而言還是非常有幫助的,畢竟藉助visual assist的代碼查找,能夠非常快的幫你找到你想了解的東西
luajit下面提供了一個msvcbuild.bat用於編譯luajit,但如果你需要調試的話,可以進行以下幾個步驟:
1.將luajit解壓,比如解壓到LuaJIT-2.1.0-beta2_msvc目錄
2.如果要得到精確的棧,修改LuaJIT-2.1.0-beta2_msvc\src\msvcbuild.bat,搜索/O2,將/O2改為/Od
3.在win64版本的visual studio命令行,執行一次msvcbuild.bat debug,這時會生成luajit.exe,測試一下exe是否正常。
4.用visual studio建立一個命令行工程,例如工程保存在LuaJIT-2.1.0-beta2_msvc\luajitcmd
5.把LuaJIT-2.1.0-beta2_msvc\src下所有.h和.c代碼加入工程
6.把工程的調試路徑設置為
命令:$(ProjectDir)..\..\src\luajit.exe
工作目錄:$(ProjectDir)..\..\src\
7.此時你可以正常按f5下斷點調試了
至於可以調試什麼呢?
最簡單就是寫一個lua文件,require之,執行裡面的代碼,下斷點觀察luajit的行為。
這里必須說明,luajit的執行過程中有兩大部分是沒有.c對應的:
1.有一部分代碼是通過dasm工具生成的,這部分直接通過匯編生成,沒有.c,所以沒有辦法在visual studio調試(其實也可以,但是只能匯編調試)。這些主要是lua虛擬機的代碼(是的,為了快,作者hand tune匯編的方式來寫lua虛擬機)
2.luajit會通過jit模塊編譯一部分代碼變為高度優化的機器碼,這些也是臨時生成的可執行機器碼,你只能在.c看到他們是如何生成的,但執行階段當然是沒有.c對應的。
除此以外,幾乎所有東西都可以直接vs調試:所有的編譯過程、所有的lua標准庫和api、luatable等常規數據結構、profiler,等等
下一步我們會簡單說一下代碼結構,以及結果luajit一些基本原理來說說怎麼閱讀
尤其是luajit的原理,如果對此毫無了解的情況下,閱讀其源碼是十分困難的,因為luajit從編譯到執行的過程,走了很多步,跨越了多個模塊,涉及了三種不同形式的編碼(bytecode, SSA IR, 機器碼),可見其復雜程度。
『伍』 請問自己的軟體如何運行Lua腳本
programming in lua 有相關的例子,一般腳本語言和c/c++之類的互相調用分兩類,一類是擴展,就是將c/c++模塊封裝起來給腳本語言用,用swig做封裝很方便的,一類是嵌入,就是在c/c++等應用中嵌入lua引擎,一般是用來分離經常變化的邏輯部分,比如WOW就是用lua語言作為擴展,用戶可以編寫lua腳本來完成一些特定功能的機器人。你要做的就是使用lua c api來在你的程序中執行lua。類似這種:
int iErr = 0;
lua_State *lua = lua_open (); // Open Lua
luaopen_io (lua); // Load io library
if ((iErr = luaL_loadfile (lua, "test.lua")) == 0)
{
// Call main...
if ((iErr = lua_pcall (lua, 0, LUA_MULTRET, 0)) == 0)
{
// Push the function name onto the stack
lua_pushstring (lua, "helloWorld");
// Function is located in the Global Table
lua_gettable (lua, LUA_GLOBALSINDEX);
lua_pcall (lua, 0, 0, 0);
}
}
lua_close (lua);
『陸』 如何看懂lua的源碼
你需要掌握 lua 語言,才可能看懂 lua 語言的源代碼。
你需要精通 c 語言,你才可能看懂 lua 的源碼。
『柒』 lua源碼分析4(lua是怎麼執行的)收藏
當分析到這里,對於lua生成中間碼的過程就比較熟悉了。關鍵是生成的中間碼必須要和lua虛擬機的執行聯系在一起。所以,對於這里分析的函數調用,要結合lua虛擬機的執行一起來分析。
上篇文章對生成局部函數中間碼做了簡單的介紹。這里知道,當lua發現一個新定義的函數的時候,會生成OP_CLOSURE指令。那麼,lua虛擬機執行到OP_CLOSURE後怎麼執行呢?
在此之前,先說在lua解析代碼完了以後,會做那些善後之事呢?
前面說過,lua會把一個代碼文件當作是一個函數解析執行。在解析期間,它會率先生成一個FuncState的結構,作為最外面的函數。但這是解析時做的事情,運行期間,是不會有FuncState這個東西出現的。在運行期間,是由一個個叫CallInfo的數據結果的,它指的是當前運行的函數。
那麼,在解析代碼以後,是怎麼轉入運行的呢?
『捌』 如何配置一套優雅的Lua開發環境
優雅的Lua開發環境
優雅的Lua開發環境至少包含以下幾點:
安裝適合需求的最新穩定版Lua
安裝合適的Lua包管理器
源碼安裝(合理的組織安裝目錄,設置環境變數使Lua環境更易用且易於管理)
版本選擇
首先我們要關注當前流行的各種Lua版本(5.1x,5.2x,5.3x),如何選擇我的觀點是根據自己的需求,選擇適合自己的最新穩定版。
我的環境用來做基於Openresty(Openresty是一個Nginx與其Http_lua模塊結合的一個衍生版本)的Web應用開發,Openresty中Lua代碼的執行是通過LuaJit解析和加速,而LuaJit基於Lua5.1x的ABI開發,Openresty官方明確指出使用LuaJit運行Lua代碼是最優方案,所以毋庸置疑Lua5.1x是最適合我的,最新穩定版為Lua5.1.5。
安裝部署
相比brew、apt-get、 yum等安裝方式,我更推薦使用源碼安裝,這樣幫助我們對整個環境細節有更多的認識和把握,合理的組織安裝目錄,結合環境變數的設置,便於使用和管理。
下載並解壓Lua源碼:
wget http://www.lua.org/ftp/lua-5.1.5.tar.gz
tar zxvf lua-5.1.5.tar.gz
cd lua-5.1.5
打開Makefile,可以看到如下信息:
PLAT= none #安裝平台,默認平台為none
INSTALL_TOP= /usr/local #安裝跟目錄,默認為/usr/local
# Convenience platforms targets. #源碼所支持的平台
PLATS= aix ansi bsd freebsd generic linux macosx mingw posix solaris
將INSTALL_TOP修改為你既定的安裝目錄後保存
INSTALL_TOP= /usr/local/lua-5.1.5
繼續如下步驟進行安裝:
make macosx #編譯平台設置為macosx,其他平台直接將macosx替換即可,如make linux
make macosx install #安裝平台設置為macosx
成功安裝後如下:
~/Desktop/ ll /usr/local/lua-5.1.5
total 0
drwxr-xr-x 4 root wheel 136B 10 19 18:48 bin
drwxr-xr-x 7 root wheel 238B 10 19 18:48 include
drwxr-xr-x 4 root wheel 136B 10 19 18:48 lib
drwxr-xr-x 3 root wheel 102B 10 19 18:48 man
drwxr-xr-x 3 root wheel 102B 10 19 18:48 share
運行lua -v查看所安裝的Lua版本
~/Desktop/ lua -v
zsh: command not found: lua
~/Desktop/ ln -sf /usr/local/lua-5.1.5/bin/lua /usr/local/bin/lua
~/Desktop/ lua -v
Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio
以上安裝目是得到一個Lua可執行文件,優雅之處在於使用源碼安裝,組織安裝目錄使我們更方便的管理Lua環境,今後Lua5.1.5版本相關的ABI、Lua包等將會安裝到安裝目錄下的lib,share路徑下,我們甚至可以定義LUA_PATH=/usr/local/lua-5.1.5來更方便的引用lua.h等做相關模塊開發。
因為指定的安裝目錄/usr/local/lua-5.1.5並不在PATH環境變數下,所以直接執行lua會報command not found: lua,我們這里使用添加軟連接的方式將可執行文件鏈接到PATH路徑下達到了同樣的效果,也可直接將/usr/local/lua-5.1.5/bin添加到環境變數PATH中。
多版本共存
使用源碼安裝可以天然實現多版本共存
~/Desktop/luarocks-2.2.2/ ll /usr/local/lua*
/usr/local/lua:
/usr/local/lua-5.1.5:
/usr/local/lua-5.2.3:
/usr/local/lua-5.3.1:
// ll /usr/local/bin/lua*
lrwxr-xr-x 1 root admin 28B 10 19 23:16 /usr/local/bin/lua -> /usr/local/lua-5.1.5/bin/lua
lrwxr-xr-x 1 root admin 28B 10 20 10:08 /usr/local/bin/lua52 -> /usr/local/lua-5.2.3/bin/lua
lrwxr-xr-x 1 root admin 28B 10 20 10:12 /usr/local/bin/lua53 -> /usr/local/lua-5.3.1/bin/lua
lrwxr-xr-x 1 root admin 29B 10 20 10:12 /usr/local/bin/luac -> /usr/local/lua-5.1.5/bin/luac
lrwxr-xr-x 1 root admin 29B 10 20 10:08 /usr/local/bin/luac52 -> /usr/local/lua-5.2.3/bin/luac
lrwxr-xr-x 1 root admin 29B 10 20 10:11 /usr/local/bin/luac53 -> /usr/local/lua-5.3.1/bin/luac
『玖』 如何學習 Lua VM 的源碼
我最後希望能做到的是:把Lua某個版本的代碼通透看完,在github上寫一個開源的分析Lua源碼的文檔,最後能正確寫一份英文的得到Lua社區的認可。
之所以花這么大功夫去啃Lua代碼,是因為我覺得Lua是門很好的語言,參見知乎我在其他帖子中對Lua的評價。另一方面是Lua的代碼數量足夠小,5.1.4僅僅1.5W行,去掉空白行和注釋估計能到1W行。Lua是世界最流行的腳本語言之一,前幾年還進過top20的流行語言,另外又是C\C++的完美伴侶。另外,我自己對如何實現一門語言也充滿了好奇,Lua雖小五臟俱全而且還是正經實用的項目。就這些理由一直在支撐著我看下去。當然現在最難的時候已經過去了。
『拾』 如何安裝luasocket源碼
第一種方法:如果你有安裝了 Lua 模塊的安裝和部署工具 LuaRocks,那麼一條指令就能安裝部署好 LuaSocket:
# luarocks install luasocket
第二種方法:如果沒安裝有 LuaRocks,也可以源碼安裝。
先把 LuaRocks 下載下來,當前可用的版本是 luasocket-3.0-rc1(luasocket的源碼有託管在Github.com):
# git clone https://github.com/diegonehab/luasocket.git
把源碼clone下來之後就可以進行本地源碼安裝,直接進入到luasocket目錄進行編譯安裝了
# cd luasocket
# make && make install