標籤:

想學習一個優秀解釋器源碼,有推薦的嗎?Lua 怎麼樣?


Lua 代碼我一直再看。也推薦你看。至於如何看可以參考這個問題。如何學習 Lua VM 的源碼?

一點沒有覺得 Lua 被過譽。名副其實。代碼很精練。有個答案說 Lua 把所有東西寫到一起,還「醉了」。他自己說理解不了,那是他的理解力問題,不是 Lua 代碼問題。

Lua 的 VM,Parser,GC 都是單獨的文件。雖然有相互依賴,但是介面清晰。那個自稱不覺得好理解的答案估計是認為軟體系統不能有 mutual dependency,必須是 tiered-structure 的,只能上層依賴下層,這樣才好理解。很不幸,像 Lua 這樣的小系統,再劃分子模塊都是這種 mutual dependent 的,這個級別,這個複雜度什麼系統都一樣。只有更大系統的大粒度模塊才能採用 tiered-structure。

捧一個也不用貶一個,有人說 Luna 才 8000 多行,不錯是不錯,可是這個和 Lua 的兩萬行沒有實質的區別。就拿 table 的實現來說,Lua 要自己實現 insert,Luna 用 std::unordered_map 一行就實現了。可是研究的時候花的精力並沒有太大區別。Lua 的 insert 如果你不深究實現也不用細看那 60 多行,Luna 的你要深究也得研究 std::unordered_map。再有,Lua 的指令集本身就比 Luna 全面,但研究的時候你一個一個指令研究就好,根本不用一次完成。

總之我真的不明白對於 Lua 的「全攪在一起」的評價到底是什麼意思。

而且,Lua 是擁有活躍的社區,有一個活躍的 mailing list,三位 PUC-Rio 的計算機教授會回答你提出的問題(這在一定程度上幾乎成為他們 day job 的一部分)。我不知道其它為了「學習的目的」而做的 simplified 項目能在多大程度上做到這點。

然後,給你一些 tips。Lua 的源代碼里,function definition 中的 function name 和後面的左括弧中間有一個空格,而 function invocation 中沒有這個空格。所以最最簡單的 search 就能精確的過濾 function definition 和 function invocation。代碼可讀性的一個衡量標準就是你的代碼是不是用簡單工具就能進行分析(是呀,用 full-function parser 當然能分析了)。建議 Luna 的作者也趕緊採納這個小技巧。

最後再總結一句。計算機是很年輕的學科。大多數軟體系統遠沒有汽車發動機、飛機發動機那麼複雜,那麼不可理解。很多系統的複雜度其實來自多年趕工的 tech debt。而對於一些沒有商業壓力的項目,比如 Linux kernel,Lua,只要領導人想做 elegant,不管系統的需求多麼複雜,代碼都可以做到儘可能清晰。不要為了「學習的目的」特意尋找縮水版的系統。


Ruby Under a Microscope


Lua解釋器極其精鍊,可以參考雲風博客上面的源碼剖析。


樓上那些說lua的我真心懷疑你們看過么,lua的源碼是不長,但是把vm parser lexer gc寫一起我也是醉了。我一點都不覺得那個代碼簡練好理解,反而看到了很多妥協的醜陋和c的醜陋。

你要是真想看lua的解釋器的寫法,我覺得 @airtrack哥寫的luna真心是漂亮。地址在此airtrack/luna · GitHub


直接自己寫一個比看啥都強。推薦從lisp的解析器開始寫,不用關注那些各種語言裡面奇怪得語法。


Ruby Hacking Guide (Ruby 1.7)


推薦閱讀:

C、Scheme、Lua 和 Go 究竟哪個最簡單?
Lua元表有哪些讓人感覺到精彩的應用?
用LuaStudio調試Unity中SLua里的Lua5.3代碼
用好Lua+Unity,讓性能飛起來—LuaJIT性能坑詳解
Lua性能優化—Lua內存優化

TAG:Lua | 動態語言 |