lua虛擬機以太坊
Ⅰ skynet 什麼時候調用 luaopen
lua_State* p = lua_open();
//創建lua虛擬機的環境。#define lua_open() luaL_newstate()
luaopen_base(p);
luaopen_math(p);
luaopen_string(p);
//以上加入這些庫,就像C包含頭文件
lua_settop(p, 0);
//清空棧空間
lua_getglobal(p, "key");
//取一個全局變數為「key」,壓入棧頂
int temp = lua_isstring(p, 1);
//當判斷值是一個字元串或是一個數字(數字總能轉換成字元串)時,返回 1 ,否則返回 0
const char* str = lua_tostring(p, 1);
//把棧頂的數據轉換成字元串。這個函數沒有出棧功能,
可以使用lua_pop(p,1)將棧頂元素彈出
lua_close(p);
Ⅱ ulua中lua怎麼調用c#的函數
目前的示常式序是使用 FFI 庫來實現的從Lua調用C#函數。 FFI 因為用到了反射機制來調用C#函數,性能會比較低。 應該盡量避免使用,如果沒有找到更好的辦法,准備之後把這個FFI實現廢棄掉。 其實直接用C#實現一個庫的形式,來讓lua調用這種傳統的做法效率會比較高,也是推薦採用的方式。而且也並不會麻煩太多。
比如我現在要實現一個叫 libfoo的庫, 裡面提供兩個方法: add(a, b) 和 sub(a, b)
庫的實現
usingUniLua;
publicstaticclassLibFoo
{
publicconststringLIB_NAME="libfoo.cs";//庫的名稱,可以是任意字元串
publicstaticintOpenLib(ILuaStatelua)//庫的初始化函數
{
vardefine=newNameFuncPair[]
{
newNameFuncPair("add",Add),
newNameFuncPair("sub",Sub),
};
lua.L_NewLib(define);
return1;
}
publicstaticintAdd(ILuaStatelua)
{
vara=lua.L_CheckNumber(1);//第一個參數
varb=lua.L_CheckNumber(2);//第二個參數
varc=a+b;//執行加法操作
lua.PushNumber(c);//將返回值入棧
return1;//有一個返回值
}
publicstaticintSub(ILuaStatelua)
{
vara=lua.L_CheckNumber(1);//第一個參數
varb=lua.L_CheckNumber(2);//第二個參數
varc=a-b;//執行減法操作
lua.PushNumber(c);//將返回值入棧
return1;//有一個返回值
}
}
庫的初始化
//創建Lua虛擬機
varLua=LuaAPI.NewState();
//載入基本庫
Lua.L_OpenLibs();
Lua.L_RequireF(LibFoo.LIB_NAME//庫的名字
,LibFoo.OpenLib//庫的初始化函數
,false//不默認放到全局命名空間(在需要的地方用require獲取)
);
庫的使用 (在lua代碼中)
//獲取庫
locallibfoo=require"libfoo.cs"
//調用庫的方法
print(libfoo.add(42,1))
print(libfoo.sub(42,22))
Ⅲ ruby python jvm lua php 哪個虛擬機性能
這種問題問了也沒意思的。因為不同語言適合不同的場景。腳本慢,如果主要花在網路等待上,代碼慢些也沒啥關系的。
Ⅳ lua中並不是所有的虛擬機都被摧毀了怎麼解決
Lua運行代碼時,首先把代碼編譯成虛擬機的指令("opcode"),然後執行它們。 Lua編譯器為每個函數創建一個原型(prototype),這個原型包含函數執行的一組指令和函數所用到的數據表。1
從Lua5.0開始,Lua使用基於寄存器的虛擬機(虛擬機主要分為基於寄存器的和基於棧的)。 為了分配寄存器使用時的activation record,這個虛擬機也使用到了棧。 當Lua進入函數時,它從棧中預分配了足夠容納所有函數寄存器的activation record。 所有的局部變數在寄存器中分配。因此提高了訪問局部變數的效率。
Ⅳ cocos lua 是怎樣實現跨平台的
基本流程如下:
1.下載Cocos2d-x庫,分別在Windows平台和Mac平台上解壓,並安裝對應的向導。
2.在Windows平台和Mac平台上創建同名工程。
3.在Windows平台上開發代碼,保證將代碼放在Class目錄和Resource目錄。
4.把Windows平台上開發的Class目錄和Resource目錄中的代碼拷貝到Mac電腦上,覆蓋同名目錄。
5.在Xcode中將剛添加的代碼和資源加入工程。
6.在Xcode中啟動編譯,在虛擬機和真機上測試,完工。
Ⅵ 為什麼lua語言中使用全局變數就會造成內存泄漏呢
會導致多線程不安全。在創建多個lua虛擬機的時候會2個線程同時操作一個變數。這是你代碼設計問題。不一定會造成泄露。
Ⅶ java虛擬機怎麼可以跑lua代碼
可以從 Lua 調用 Java Class Static Method
調用 Java 方法時,支持 int/float/boolean/String/Lua function 五種參數類型
可以將 Lua function 作為參數傳遞給 Java,並讓 Java 保存 Lua function 的引用
可以從 Java 調用 Lua 的全局函數,或者調用引用指向的 Lua function
luaj 的功能很簡單,但對於集成各種 SDK 來說已經完全滿足需求了。
Ⅷ lua虛擬機位元組碼怎麼改變
Lua的位元組碼在意義上等價於cpu的指令碼,但lua本身並沒有那麼多強大復雜的指令,只用了6個位來表示操作碼,這表示lua最多隻有64個操作碼(實際使用到的還沒有這么多),一個位元組碼由四位元組組成,這些個opcode又可進一步分成四大類,分別是iABC,iABx,iAsBx,iAx,這里i代表opcode,A,B,C分別代表參數,s代表有符號參數。
Ⅸ 如何學習 Lua VM 的源碼
2011年底開始閱讀Lua代碼,選擇的版本是5.1.4,在那個時候是最新的版本了,不過2012年不僅有更新的5.1版本出來,還有最新的5.2.暫時管不了這么多,繼續看這個版本先了。
歷經近一年,中間酸甜苦辣只有自己知道,你問有什麼方法,我的回答只有堅持。一邊看代碼,一看補一些基礎(比如看龍書),到最後覺得差不多了就自己抄Lua虛擬機代碼來跟蹤它的實現。
我的博客上:codemp,有我寫的Lua分析文章,還沒有完全寫完。當然我現在也不認為我完全理解的通通透透了。
我最後希望能做到的是:把Lua某個版本的代碼通透看完,在github上寫一個開源的分析Lua源碼的文檔,最後能正確寫一份英文的得到Lua社區的認可。
之所以花這么大功夫去啃Lua代碼,是因為我覺得Lua是門很好的語言,參見知乎我在其他帖子中對Lua的評價。另一方面是Lua的代碼數量足夠小,5.1.4僅僅1.5W行,去掉空白行和注釋估計能到1W行。Lua是世界最流行的腳本語言之一,前幾年還進過top20的流行語言,另外又是C\C++的完美伴侶。另外,我自己對如何實現一門語言也充滿了好奇,Lua雖小五臟俱全而且還是正經實用的項目。就這些理由一直在支撐著我看下去。當然現在最難的時候已經過去了。
其他人的文章,國內雲風寫的是最多的。不過我認為雲風的文章key太高,很難follow,你如果對雲風寫的文章涉及的技術點沒有什麼涉獵就直接去看,可能很難看懂。
另外國外人寫過的,最推薦的有:
《》
《The implementation of Lua 5.0》
還有一個:
詳解關於Lua源碼分析學習教程
你可以找找。轉載僅供參考,版權屬於原作者
