當前位置:首頁 » 操作系統 » 雲風lua源碼欣賞

雲風lua源碼欣賞

發布時間: 2022-05-03 11:42:17

㈠ lua源碼分析4(lua是怎麼執行的)收藏

當分析到這里,對於lua生成中間碼的過程就比較熟悉了。關鍵是生成的中間碼必須要和lua虛擬機的執行聯系在一起。所以,對於這里分析的函數調用,要結合lua虛擬機的執行一起來分析。

上篇文章對生成局部函數中間碼做了簡單的介紹。這里知道,當lua發現一個新定義的函數的時候,會生成OP_CLOSURE指令。那麼,lua虛擬機執行到OP_CLOSURE後怎麼執行呢?
在此之前,先說在lua解析代碼完了以後,會做那些善後之事呢?
前面說過,lua會把一個代碼文件當作是一個函數解析執行。在解析期間,它會率先生成一個FuncState的結構,作為最外面的函數。但這是解析時做的事情,運行期間,是不會有FuncState這個東西出現的。在運行期間,是由一個個叫CallInfo的數據結果的,它指的是當前運行的函數。
那麼,在解析代碼以後,是怎麼轉入運行的呢?

㈡ 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做。

㈢ 如何閱讀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 VM 的源碼

2011年底開始閱讀Lua代碼,選擇的版本是5.1.4,在那個時候是最新的版本了,不過2012年不僅有更新的5.1版本出來,還有最新的5.2.暫時管不了這么多,繼續看這個版本先了。 歷經近一年,中間酸甜苦辣只有自己知道,你問有什麼方法,我的回答只有堅持。一邊看代碼,一看補一些基礎(比如看龍書),到最後覺得差不多了就自己抄Lua虛擬機代碼來跟蹤它的實現。 我的博客上:http://www.codemp.info/?tag=lua,有我寫的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 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,你如果對雲風寫的文章涉及的技術點沒有什麼涉獵就直接去看,可能很難看懂。

㈥ 雲風的網易雲風

「大話」雲風
2001年4月初的一天,雲風又從床邊厚厚的一摞歷史和哲學書中選了一本,津津有味的看了起來。這樣的日子已經有一段時間了,大學畢業後盡管曾經到北京闖盪過,不過更喜歡休閑生活的他還是感覺在武漢老家更為愜意。
電話鈴響了,竟然是丁磊從廣州打來的。原來雲風早在大學期間曾寫過2D的圖形引擎風魂,這套引擎被很多公司所使用,而天夏就是其中之一。這家很早就開始進入網路游戲開發領域的公司不久前被網易所收購,正在開發一款網路游戲「大話西遊」。在開發過程中,感覺風魂有一些模塊需要做一些擴展,於是找到了雲風。開始的時候是雲風在家裡做一些兼職,不過後來對方認為這樣異地合作有些麻煩,於是希望雲風能夠到廣州,雲風沒有答應,現在網易的「老大」親自出動了。
長談半個小時後,雲風有些動搖。更令雲風沒有想到的是,第二天,丁磊就派人把去往廣州的機票送到了家裡。抱著看看也無妨的想法,雲風到了廣州。
剛去的時候,雲風主要工作還是維護原來的引擎。然而,當時大話西遊Ⅰ的開發已經到了後期。由於很多人都是第 一次做游戲,項目混亂。最後連著幾天加班,連續工作六七十個小時,雲風也不能倖免,到處充當救火隊員。
大話西遊Ⅰ並不成功,再加上網易當時低迷的股價,很多員工選擇了離開。游戲的系統構架也有很多問題,連主程序員都覺得維護起來很麻煩。雲風建議不如重做,但多數人認為工作量太大,太浪費。
大話西遊Ⅰ收費後,雲風也沒有多少具體工作,於是跑到家裡,按照自己想法重新寫客戶端的核心架構。新系統將對象層進行了清晰的劃分,強化了對於對象的管理,包括內部消息的傳遞,整個系統架構更清晰,模塊之間的耦合度也小一些,整個系統沒有用任何的類庫,數據結構也是雲風自己實現的。
一個月左右,原型出來了。看到雲風的原型,丁磊下決心重做大話西遊,並把原來技術部的優秀程序員調了進來。後來他們還使用了第三方的LUA腳本,使網路層和界面層的處理分開,更容易擴展,這樣程序員就不需要做很多細節性的工作。
新版本做完之後,雲風也很疲憊,於是請了兩個月的假去旅遊。就在那段時間,新的大話西遊II推出,火爆的出乎所有人的預料。
雲風的職責主要是做 R&D,向其他程序員提實現方案,以及提供代碼的框架和底層。他喜歡嘗試新技術,寫升級程序的時候他也從來不拷貝原來的任何代碼。2002年學術界流行泛型的思想和模板,雲風也做了很多研究,通讀了STL的源碼,給他留下了深刻的印象。按照這種思想,雲風又重寫了圖形引擎,裁掉了很多認為不必要的內容,使之精簡到剛好夠用。雲風說:「我現在並不主張代碼復用,因為游戲不是一個特別大的工程,只要有非常基礎的代碼就夠了。我以前曾經做過一整套的UI系統,底層代碼就寫了一兩萬行。但有位朋友對我講,日本做游戲開發有一套UI代碼用了10年都沒有換,而且只用了一千行代碼就實現了,其中只有最簡單的對話框和按鈕。我比較認同這點,我認為網路游戲最重要是穩定,保證穩定的一個方案就是簡潔,其次是一定的擴展性。」 在這種的思想指導下,雲風又重新開發了一個引擎。
新引擎除了精簡了圖形方面的東西,還增加了很多功能來方便二次開發。比如用匯編寫的完全不依賴 OS 的協作式多線程模塊,可以由開發人員自己指定每個線程的工作,而且每個線程的開銷很小。每個活動的對象都由自己的線程來控制邏輯,方便了開發人員去思考問題,真正把每個對象的邏輯分開了。而且還附帶了其他的好處,這就是當在匯編一級看程序的運行時,指令的運行次序會變的相對混亂,會使製作外掛的人非常頭痛。
大話西遊Ⅱ成功後,丁磊准備做一個漫畫版的大話西遊,招聘的幾位同事看到了雲風的新技術後,提出不如用這套新引擎重新做一套游戲,於是夢幻西遊誕生了。現在正在推廣,反響也非常不錯。
雲風以前喜歡玩PC游戲,不過現在經濟寬裕了,他更喜歡玩Xbox、PS2、GBA這樣的游戲機,覺得游戲機上的游戲更好玩。看來,雲風未來還有很大的空間可以去創造新的夢想。

㈦ 如何學習 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源碼分析學習教程
你可以找找。轉載僅供參考,版權屬於原作者

㈧ 如何評價騰訊在Unity下的xLua熱更方案

我認為xlua的概念很好,很多人用lua就是為了熱更新,如果沒有熱更新的需求,大多數人是不喜歡lua,或者所謂的腳本開發的,xlua很好的解決了這部分人得需求。

但我有一點其他看法,我04年畢業在網易工作的時候,網易的游戲都是基於腳本的,不管是客戶端,還是伺服器端,那個時候不是lua,就是python,還有一種是類似c語法的腳本(我忘記名字了),這個是雲風主導的,當時選擇腳本作為邏輯開發語言的核心想法**不是為了熱更新**,而是解決

1)劃分引擎層和業務層,svn管理好許可權,讓新來的同學,接觸不到核心引擎的代碼許可權,他們只能在腳本層做業務,等你對業務足夠熟悉,對引擎足夠了解,對公司足夠忠誠後,才開放引擎層代碼,這么做早年是為了解決私服問題,很多同學拿著全部源代碼去架設私服,這多可怕,所以做業務的程序員只能拿到一個編譯後的app和一份腳本介面文檔,而編譯出來的app會檢查線上ip,報告非法伺服器地址等,協助打擊私服。

2)避免書寫不好的c、cpp代碼崩潰整個進程,腳本代碼出錯了,最多影響局部邏輯,還可以上報腳本錯誤,方便後續解決問題,現在unity里也一樣,如果c#代碼書寫不好,就直接閃退了,不如用lua做一個安全的調用層。

3)快速修改代碼,快速跑起來,早年cpp代碼編譯速度比較慢,修改一行代碼調試運行等半天,腳本代碼方便修改,方便跑起來,不用等,放到今天也一樣,同時iOS還有text size大小的限制,太多的stub function會撐大text size,而lua腳本再多的代碼也不會有這個問題,不用再為了text size取捨代碼怎麼寫,功能去留的問題。

4)反外掛,對,你沒看錯,反外掛,早年PE各種脫殼、反編譯工具,使得一個exe幾乎沒有秘密,外掛作者很容易做外掛,而用腳本後,幾乎所有邏輯都是中間代碼,這部分中間代碼可以通過修改opcode,加密,一邊run,一邊解密等技術,保證在進程空間內基本沒有完成代碼存在,對外掛作者是個很大挑戰,所以網易的游戲反外掛歷來做的都是最好的;

5)最後才是所謂的「熱更新」, 當年也不是現在這種熱更新,就是每次客戶端啟動的時候,有一個launcher去伺服器下載一個update,然後應用這個update而已。

熱點內容
傳奇腳本刷怪 發布:2024-10-06 11:57:47 瀏覽:261
c語言輸入小寫輸出大寫 發布:2024-10-06 11:49:57 瀏覽:361
金立手機伺服器異常是什麼原因 發布:2024-10-06 11:49:48 瀏覽:699
python多線程假的 發布:2024-10-06 11:37:09 瀏覽:723
自己動手構造編譯 發布:2024-10-06 11:35:11 瀏覽:550
c語言編譯器win10 發布:2024-10-06 11:33:35 瀏覽:971
安卓手機里的自動備份是什麼 發布:2024-10-06 11:30:16 瀏覽:714
想買電腦配置要注意哪些 發布:2024-10-06 11:21:50 瀏覽:541
滴滴雲存儲 發布:2024-10-06 11:17:37 瀏覽:767
精通android游戲開發 發布:2024-10-06 11:16:54 瀏覽:801