《Lua設計與實現》的作者codedump:學習也要講究價效比 (圖靈訪談)

劉敏ituring發表於2017-09-28

導讀:

訪談之前,我曾多次央求codedump給我一張照片,用於簡介部分的介紹。如他所願,不管是派人偷拍還是全網開搜,我都沒有得到也不可能找到一張照片。所以,就有了這樣一篇沒有嘉賓圖片的訪談文章。

我想,這大概就是技術型人才的“通病”吧。低調、務實、有乾貨!

不過,我還是知道了codedump筆名掩蓋下的真身,他被Lua吸引的原因,研究Lua的方法,Lua的優勢以及Lua的編譯原理,等等。

好了,還是你們自己開閱吧~


訪談嘉賓:

codedump, 一線開發人員,長期從事網際網路後端服務的開發工作。

他曾經在網易等公司從事遊戲伺服器後臺開發,因為工作需要,使用C++編寫服務核心引擎和使用Lua指令碼編寫遊戲邏輯的技術組合,之後開始對Lua產生濃厚的興趣。他不斷地研究Lua的實現原理,並且陸續公佈在網路上:www.codedump.info。

codedump多年的努力,最終以紙質圖書的形式——《Lua設計與實現》呈現給了大家。

enter image description here

訪談話題:

越想做好一件事,心理負擔就越大

接下這件事之後,我的心理負擔變得很大。如果成為正式的出版物,讀者是要真金白銀地花錢來買的,我希望儘量做好,不辜負別人的期望。

為什麼使用codedump這個筆名?有什麼特殊的含義?

codedump是我自己造的單詞,其實是code和dump這兩個單詞的組合。我很喜歡深入到程式碼層面去了解一些專案的運作原理,也就是把code給dump出來,所以就起了這個名字。總是會有人把它錯看成coredump,話說哪有程式設計師用這個名字咒自己的。(笑)

寫作《Lua設計與實現》的時候,最大的困難是什麼?

寫作過程中,主要有兩方面的困難。

一方面是技術上的。最大的問題是,Lua直譯器解析Lua檔案、生成Lua Opcode的過程中,涉及一些編譯原理的知識。另外,Lua為了效率其實是一次遍歷的,也就是說,只分析一遍原始檔就生成Opcode。雖然效能提升了很多,但是對於(當時基礎不太好的)我來說就有不小的困難。

這方面的分析文件比較少,因為大部分Lua分析的文件集中在虛擬機器本身的結構和運作上,涉及Lua直譯器解析過程的文件太少了。後來,我找到了除錯分析的辦法,也就是像書裡分析的那樣:每分析一種型別的指令時,就以一段簡單的Lua來具體分析,同時把握住分析的幾個關鍵函式,如luaK_code和luaV_execute,慢慢地自己也就啃下來了。從我的角度來看,這部分的內容仍然不是很滿意。如果精力允許,我希望可以繼續這方面的研究。

另一方面的困難是心理上的。編輯王軍花看到了我在Github上公開的文件,通過郵件找到我,希望把內容整理成書出版。等接下這件事之後,我的心理負擔變得很大。如果成為正式的出版物,讀者是要真金白銀地花錢來買的,我希望儘量做好,不辜負別人的期望。

越想做好一件事,心理負擔就越大。加上工作、家庭等因素,寫作會被打斷,重新撿起來又需要更多的時間和精力。因為覺得有些章節寫得不夠好,我一度有放棄這次出版計劃的打算,還好編輯王軍花有足夠的耐心,才把這個差點半途而廢的事情堅持做完了。

從最開始簡單地寫一些東西,到最後和出版社合作、和網上的朋友合作等,這些都是很好的經歷。

你認為,書中哪部分最重要,為什麼重要?

哪些部分“最重要”,其實還要看個人的需求。不過,我認為,應該瞭解Lua棧和虛擬機器的一些原理,比如程式碼是如何先分析再到虛擬機器中執行的,比如Opcode是如何組織在Lua棧中的。這部分的內容可以在書中的第五章找到,因為明白了這些知識會對理解程式碼的生成有幫助。

學習也要講究價效比

接觸Lua時,我發現Lua 5.1.4版本的程式碼量只有不到兩萬行。對於一個世界級同時在業界大量使用的指令碼語言,這樣的程式碼量確實價效比太高。

為什麼對Lua產生濃厚的興趣,談一談對Lua產生興趣的緣由?

接觸Lua時,我發現Lua 5.1.4版本的程式碼量只有不到兩萬行。對於一個世界級同時在業界大量使用的指令碼語言,這樣的程式碼量確實價效比太高。加上,我一直對如何實現一門語言很感興趣,所以就堅持著學習了下來。我發現Lua的程式碼組織形式精幹簡潔,幾乎沒有冗餘。相比Nginx,我認為Lua才是最好的C語言專案。

另外,我在Lua身上看到了一種別樣的程式語言設計哲學。Lua從來沒有追求過要做一門號稱“可以解決所有問題”的語言,它對自己的定位就是輔助型的語言,這樣的出發點也決定了它的特點——小巧、效能高、可擴充套件性強。

跟Python、Ruby這樣的語言相比,Lua有哪些特點?更適合解決哪類的問題?

Python、Ruby的定位是全能型的語言,即它們可以獨立完成一些工作。而Lua的定位是傳球者、助攻者,它需要藉助宿主語言,輔助宿主語言解決問題。

根據我之前從事網路遊戲伺服器開發的經驗來看,Lua更適合運用在既需要高效能又需要靈活性的情況下。我們可以採用C、C++這樣的編譯型語言實現核心的模組,如網路、資料庫操作等,同時提供介面給Lua層進行呼叫,在需要靈活實現的業務層用Lua程式碼來實現。

討論Lua解決技術問題的時候,你想到的、最佳的實際例子是什麼?

OpenResty,這個專案在章亦春(網名agentzh,OpenResty專案的發起人)的帶領下,已經取得了巨大的成功。它的架構正是我前面提到的:使用高效能的編譯型語言實現底層,同時給業務編寫提供Lua介面。經過這些年的發展,OpenResty已經越來越像一個平臺化的軟體,開發人員不需要自己寫底層的C程式碼,使用Nginx配置檔案和Lua指令碼就能驅動Nginx來完成業務。

另外,OpenResty把Lua的協程很好地使用了起來,以同步的方式來寫業務程式碼,避免了非同步回撥的問題。做過高併發伺服器的人都知道,事件驅動加非同步回撥是常用的手段,但是回撥層次多了,又會讓程式碼邏輯變得支離破碎,這些痛點就是協程類技術最好的發揮場所了。當然,這很大方面也得益於Lua的精簡和高效。試想如果根據OpenResty的設計,每個連結就建立一個對應的Lua協程,那成本是很大的。

除了遊戲、擴充套件資料庫外掛等方面,Lua適合開發Web應用嗎?

前面提到的OpenResty就是基於Web伺服器的例子。但是,好像現在還沒有看到很流行的Web框架是使用Lua編寫的。

簡單介紹下Lua的編譯原理?

Lua使用最簡單的遞迴下降的分析方式,只需要掃描一遍Lua原始檔,就生成Lua虛擬機器執行所用的OpCode。原理本身並不難,只要能夠清楚一些編譯前端的知識就可以閱讀Lua原始碼了,只是由於Lua對效能的追求,所以程式碼寫得很精簡,需要結合具體程式碼的生成過程去理解。我在生成程式碼那一章也是這樣,一個一個例子逐漸展開來分析這一過程的。

回頭看你自己學習Lua的這一段歷程,哪部分是最耗費精力的?

其實,前面已經提到了,Lua分析程式碼生成Opcode的過程是最耗費精力的。GC部分也是難度比較大的,但是因為雲風寫的關於“Lua GC分析”的系列文章,難度會相對減少很多。

平民化的資本,構建出龐大的網路世界

程式設計跟數學的特點很像,只需要有一臺可以程式設計的電腦就能構建起虛擬的世界。它對場地裝置的要求也還算比較平民化,更多的是需要抽象和邏輯思維能力,這對我而言是相對簡單的。

聽說你並非科班出身,為什麼會選擇進入程式設計這一行?

雖然我讀的是理科,但是對於需要自己動手做實驗的學科,如化學、物理,卻並不擅長。像數學這樣的只需要紙和筆就能完成的科目,我學得還不錯。程式設計跟數學的特點很像,只需要有一臺可以程式設計的電腦就能構建起虛擬的世界。它對場地裝置的要求也還算比較平民化,更多的是需要抽象和邏輯思維能力,這對我而言是相對簡單的。

DOOM之父卡馬克有一個類似的說法,“在資訊時代,進入程式設計領域的壁壘完全不存在了。即使有也是自我強加的。如果你想著手去開發一些全新的東西,不需要數百萬美元的資本。你只需要足夠的比薩和健怡可樂存在冰箱裡,有一臺便宜的PC用於工作,以及讓你堅持下來的奉獻精神。”

如果不能走得比別人快,那就儘量走得比別人遠一點、長一點

實際上,很多開發人員遇到的,比如中年危機,比如面對新知識的焦慮,等等,我也有一樣的困惑。目前能想到的不多,只是確定自己是喜歡技術的,願意一直在技術的道路上走下去的。

你平時很喜歡寫作,記錄技術學習的點滴。寫作是你的技術學習方法嗎?

最開始寫部落格記錄技術學習的時候,是想在整理思路的前提下,能夠和其他同行分享一些知識。如果能把一個知識點用簡潔清晰的語言寫出來,讓別人看懂,才能說明我的理解很到位。

寫技術類文章的時候,我建議首先把原理和問題解釋清楚,然後才解釋具體的資料結構和虛擬碼的演算法,最後才是具體的程式碼。我不建議大量地貼程式碼,因為可能當時你懂了,等過段時間後你就不懂了。決定寫Lua原始碼分析的文章,我也是堅持這個初衷和方式。最開始的時候,我並沒有想到能以紙書的形式呈現,回過頭來看,以前做過的積累才是最重要的。

技術學習的過程中,最重要的三點是什麼?

首先還是得有興趣吧,沒有興趣的話,事情做起來彆扭。其次是善於歸納和總結知識,寫部落格、技術文章,嘗試向別人解釋清楚一個知識點,時常整理知識點,跟以前學過的東西串聯起來。最後應該就是不斷提高自己解決問題的思路、能力等。出現了問題不是大事,問題是出了問題之後自己能否解決、能否從裡面學到東西。

你對自己未來的技術之路,是怎麼規劃的?

這個問題太大了,實在回答不了太多。實際上,很多開發人員遇到的,比如中年危機,比如面對新知識的焦慮,等等,我也有一樣的困惑。目前能想到的不多,只是確定自己是喜歡技術的,願意一直在技術的道路上走下去的。然後找對適合自己的技術方向,走好眼前的路吧。

如果不能走得比別人快,那就儘量走得比別人遠一點、長一點吧。當然,做到這些的大前提,還是身心的健康。


更多精彩,加入圖靈訪談微信!

相關文章