[DearBook名人堂關注]雲風:虛擬機器之比較,lua 5 的實現

來源:互聯網
上載者:User

前段把自己的虛擬機器和編譯器完成後,曾經和 lua5 做過一個比較。比較的結果很沮喪,我的虛擬機器只能達到 lua 5 一半多點的速度。所以很不服氣的又讀了一段 lua5 的源碼。而之前我是一段一段的看 lua source code 的,甚至 lua 4 和 lua5 的是在不同時期去讀的,當然我也知道其間巨大的不同。

其實,對於簡單程式來說,我的虛擬機器是有速度優勢的,而且比 lua 快很多,我把它歸咎於 coding 的技巧。但是在設計方向上卻敗下陣來。因為 lua 5 早已經是基於寄存器的虛擬機器了,而我還在用基於堆棧的虛擬機器。雖然我對其做了改良,向基於寄存器方向做了靠攏,但是還是不如純粹的寄存器虛擬機器。

最近幾天仔細考慮了基於寄存器的虛擬機器的實現難度,雖然自己也可以繼續幹,但是目前項目很緊,決定先緩一陣子,多來點思考沉澱吧。

今天休假,讀了一些信箱裡訂閱的 lua maillist ,想看看 lua 5.1 到底做了些啥改動。由於最近自己做了好些類似的工作,更容易對 lua 的進展去理解了。最後發現,lua 的改進集中在 GC 上面。這點很合我意,其實我自己實現的東西,最得意的莫過於 gc,絕對是優於 lua 的。lua 現在在做分代 gc ,我在考慮並行的方案。大約都是為瞭解決 gc 的一些個頭痛的東西。不過 lua 的 gc 終究不是記憶體整理的,在受限記憶體環境下,表現相對不是特別好。另外,lua 為了最求速度等,在深層次遞迴的支援上也有些問題,會導致堆棧滿。我曾經寫過一個用遞迴算數列和的程式,遞迴層次過深,lua 就處理不了了,我的虛擬機器是可以勝任的。當然這對一般的應用都不是問題。

畢竟 lua 發展了 10 多年,可以借鑒的東西實在太多了。我那區區三周的玩具就當是練手的開始吧。今天仔細讀了一遍 the implementation of Lua 5.0 ,如果有人對指令碼語言實現有同樣的興趣,推薦閱讀。

從這個 paper 中我們可以瞭解幾件事情,雖然通過讀源碼也可以瞭解(我就是先通過閱讀源碼的)但是讀這個可以更休閑一些。

lua5 已經是完全 Register-based virtual machine ,可以說是世界上第一個被廣泛應用的register-based 指令碼虛擬機器了。這點,現在的 Java JVM 還有 .NET 都還是 Stack-based 。據說 perl6 打算做成 Register-based 了 當然我的語言也有此計劃 ,呵呵。Registere-based 虛擬機器相對難寫,看來是個挑戰。

lua5 最佳化了 table 的實現,這點我前面的 blog 裡提到過,這篇 paper 也做了詳細闡述。

lua5 增加了 coroutine 的實現,這點我考慮過,自從我把自己的虛擬機器改成系統堆棧無關後,做多幾個 thread 無非建立多一個堆棧而已,不難實現。 lua5 的 coroutine 也是每個 thread 有獨立堆棧的。(實際上有兩個堆棧)

lua 也是一個one-pass 的基於遞迴下降演算法的 compiler ,paper 中提到,one-pass 的 compiler 是 hard-written 的,這點我是深有體會啊。寫 compiler 那幾天,腦子裡翁翁亂叫,寫了兩整天不敢向倉庫提交一行代碼。不過寫出來的好處是顯而易見的,就和 paper 裡說的一樣,smaller, more efficient, more portable, and fully reentrant

前幾天在想,一個弱類型的語言,Object 的描述資訊能不能比 lua 這種更小。lua 用了一個獨立的字描述類型,然後用 union 來存放不同類型的資料,這個也是我用的方法。前幾天想了個辦法,那就是一般指標由於對齊的原因,末兩位永遠都是 0 。(如果我們以 8 對齊的話,末三位都是 0)這樣就有點額外的資訊來儲存資料類型了,整數可以用 30 或 31bit 來表示都是夠的。

今天讀這篇 paper 發現前人已經用過了,比如 Smalltalk80 ,不過 paper 解釋了 lua 不這樣做的原因。當然,我自己的語言倒是可以一試的

至於 lua5 用的指令集,每個 instruction 只用 4 個位元組,其實現方法還是很巧妙的,這個前幾天讀源碼的時候已經領教過了。當時我想找到我的語言的速度究竟慢在哪裡,才發現是迴圈中, i=i+1 這樣的操作。基於寄存器的虛擬機器自然可以啟動並執行更快了。而且我的虛擬機器的 instruction 是 8 位元組的,而 lua 卻只用 4 位元組,資料短了,效率也能提高。

讀完這篇 paper 感覺很多地方 lua 都是鄙視 python 的低效 這點跟我在 GDC2004 上參加的 lua round table 的感覺一樣,一下就可以發展成 lua 和python 的"派系鬥爭" 我想 GDC2006 上 lua 派會更理直氣壯一些,畢竟兩年前用 lua4 的人遠不如 lua5 的人,(我發言的時候特地讓用 lua5 的人舉了次手 這次隨著 lua 5.1 的 release ,lua在遊戲行業中的地位將不可動搖了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.