Ruby之父松本行弘:為什么要自創編程語言?
通過實際創造一門新的編程語言,可以學到編程語言的設計思路和實現方法。隨著開源的普及,創造新編程語言的門檻一下子降低了許多。創造編程語言不僅可以提升你作為技術者的價值,而且還可以使你從中獲得很大的樂趣。
大家都知道我是編程語言 Ruby 的作者,我其實還是一個編程語言迷,對編程語言的癡迷程度無人能及。Ruby 是我出于興趣鉆研編程語言的最大成果,把它稱為我興趣的副產品可能更為貼切。副產品就能如此普及看起來很了不起,但與其把它全部歸功于我的實力,倒不如說運氣的成分更大。Ruby 已經誕生 20 多年了,如果沒有這么多年來發生的各種事情與邂逅,根本不可能有今天這樣的成績。
進入創造編程語言的世界
大家有創造編程語言的經歷嗎?對于有過編程經歷的人來說,編程語言是非常親切的存在,但是他們往往會認為編程語言是現成的東西,也許誰都沒有想過自己去創造一門新的編程語言。這也是情理之中的事情。
與人們說話用的語言(自然語言)不同,世界上所有的編程語言都是由某個地方的某個人創造的。它們不是自然產生的,而是根據明確的意圖和目的被設計并實現的。所以,如果過去沒有這些創造編程語言的人(編程語言的作者),那么我們今天可能還在用匯編語言編程呢。
在人們剛開始編程時,編程語言就隨之出現了,可以說編程的歷史就是編程語言的歷史。
可能有的讀者會想:“現在再創造編程語言還有什么意義呢 ?”我稍后回答這個問題,現在我們先來看一下編程語言的歷史。
個人創造編程語言的歷史
早期的編程語言是由在工作中切切實實與編程語言打交道的人創造的,這些人大多就職于企業的研究所(比如 FORTRAN、PL/1 的發明)、大學(比如 LISP)以及標準委員會(比如 ALGOL、 COBOL)等。也就是說,設計開發編程語言是專業人士的工作,但是這個傳統隨著 20 世紀 70 年代計算機的普及開始發生了變化。一些計算機愛好者在擁有了自己的計算機后,出于興趣開始編程,甚至開始開發新的編程語言。
其中最具有代表性的就是 BASIC 語言。BASIC 語言原本是美國達特茅斯學院用于教學的編程語言,它的語法非常簡單,用極少的代碼實現了最基本的功能,所以深受 20 世紀 70 年代編程愛好者的喜愛,并被他們廣泛使用。
這些編程愛好者也開始開發自己版本的 BASIC 語言。當時,個人計算機[1]的內存頂多幾千兆,他們開發的 BASIC 語言就是可以在內存如此之小的機器上工作的小規模版本。這些小規模的 BASIC 程序大小不到 1 KB,它們在 4 KB 左右的內存上也能工作,跟現在需要大內存的語言處理器比起來真是令人驚訝。
微機雜志的時代
以個人開發的 BASIC 為代表的小規模語言(Tiny 語言)處理器不久便以各種各樣的形式進行了發布。當時的軟件有的以 Dump list 的形式刊登在計算機雜志上,有的將程序數據進行音頻轉換后收錄在雜志附帶的薄膜唱片(sonosheet)中發布?,F在的人恐怕已經不知道薄膜唱片了吧。薄膜唱片是指塑料做的薄薄的唱片,不過唱片這個詞幾乎沒有人用了。據說當時的計算機愛好者都用唱片播放器連接計算機來讀取數據,而不使用磁帶錄音機這個最普遍的外部存儲設備。
20 世紀七八十年代是計算機雜志(當時稱為微機雜志)的全盛時期,在日本以下 4 種雜志競爭激烈。
- RAM (廣濟堂出版)
- My Computer (電波新聞社)
- I/O (工學社)
- ASCII (ASCII 公司)
這 4 種雜志中現在只有 I/O 仍在發行,不過也大不如前了。作為一個了解當時情況的人,我的內心充滿了無限感慨。
這之后,My Computer 雜志派生出了 My Computer BASIC Magazine,又發生了很多事情,繼續講下去恐怕就會變成上歲數人的敘舊了,所以點到為止吧。如果去問問現在三四十歲的程序員,相信他們中間很多人都會眉飛色舞地講起那個年代的事情。
當時的微機雜志附帶了收錄 BASIC 的薄膜唱片,除此之外還介紹了其他幾個小規模語言,如 GAME、TL/1 等。這些語言都反映了當時那個時代的特色。
個人創造編程語言的現狀
為什么從 20 世紀 70 年代后期到 80 年代前期開始興起個人創造編程語言了呢?我認為最大的原因是當時難以獲取開發環境。
20 世紀 70 年代后期廣泛使用的微機是 TK-80 那樣的主板裸露在外的單板機,很多都是半成品,需要自己去釬焊。這樣的機器不可能自帶開發環境之類的東西,軟件都要自己輸入機器語言之后才會工作。
20 世紀 70 年代末期才出現 PC-8001 和 MZ-80 那樣的“成品計算機”。然而,這種計算機頂多帶一個 BASIC 開發環境,因此人們很難自由地選擇開發語言。雖說市面上也有商用的語言處理器,但 C 編譯器的定價就要 19.8 萬日元,這不是普通人可以輕易買得起的。于是,人們便有了熱情去創造一門自己的編程語言。
可現在獲取語言的開發環境已經不再是麻煩事了。各種編程語言和開發環境作為開源軟件被公開,即使是非開源的,也可以輕松地通過網絡得到免費版本。這樣一來,現在自己創造編程語言豈不是沒有任何意義嗎?
我認為,這個問題的答案為“否”。即使是現在,自己創造一門新的編程語言也是有意義的,而且有很重要的意義。
而且現在很多廣泛使用的編程語言也都是在開發環境容易獲取的情況下,由個人設計和開發出來的。如果個人開發編程語言真的沒有意義,那么 Ruby、Perl、Python 和 Clojure 這些語言也就不會誕生了。
不過即便如此,我認為 Java、JavaScript、Erlang 和 Haskell 這些語言也可能會以其他形式出現,因為它們會作為業務和研究的一環被開發出來。
為什么要創造新的編程語言
那么如今個人設計開發編程語言的動力究竟是什么呢?回顧我自身的經歷以及參考其他語言作者的意見,我認為有以下幾點理由。
- 提高編程能力
- 提高設計能力
- 打造個人品牌
- 獲得自由
首先,編程語言的實現可以說是計算機科學的綜合藝術。作為語言處理器的基礎,詞法分析和語法分析也可以應用在網絡通信的數據協議的實現等方面。
實現語言功能的庫和實現其中的數據結構,這正是計算機科學要做的事情。尤其是編程語言的應用范圍廣泛,很難事先預測會被用于什么方面,因此庫和數據結構的實現難度也就更大,但也變得更加有意思了。
另外,編程語言還是人與計算機間的接口。設計這樣的接口,就需要深入考察人是如何思考問題的、下意識中有什么樣的期待。反復進行這樣的考察,對編程語言之外的應用程序接口(API)設計、用戶界面(UI)設計,甚至用戶體驗(UX)設計都是有益的。
提升個人品牌
也許有人會感到意外,實際上在 IT 行業,對編程語言感興趣的人不在少數。這是毋庸置疑的,因為編程與編程語言有著切不斷的關系。以編程語言為主題的活動和會議等往往都會吸引很多人參加,由此我們也能感受到編程語言的魅力。正因如此,很多人在網上發現新的語言后就會開始嘗試。就拿 Ruby 來說,它在 1995 年被發布到網上之后,僅僅 2 周左右就吸引了 200 多人加入郵件列表,著實令人驚訝。
可是,雖然有很多人愿意嘗試使用新的編程語言,卻幾乎沒有人會去設計并實現一門編程語言,而且是超越雜志提及的“小兒科語言”那種程度的能夠實用化的編程語言。但我保證,僅憑設計出一個實用的編程語言這一點,你就會得到人們的尊敬。
在這個開源的時代,技術人要想生存下去,在技術社區的存在感是非常重要的。雖然技術人只要開源其軟件就能達到站穩腳跟的效果,但編程語言的“特殊感”會進一步提升其品牌效應。
樂趣第一
另外,編程語言的設計與實現比任何事情都更有趣。的確如此。與計算機科學相關的具有挑戰性的工程也是這樣。設計編程語言還可以幫助使用這門語言的程序員思考,甚至左右他們的想法,這一點也非常有意思。
通常來說,編程語言有一種從別處獲取的、不容侵犯的感覺。如果是自己創造編程語言,就完全沒有這個問題。你可以按照自己的喜好進行設計,如果不滿意或者有更好的想法,也可以自由地修改。從某種意義上來說,這是終極的自由。
編程在某種意義上是對自由的追求。通過親自編程,我們可以獲得單純使用他人的軟件時享受不到的自由。至少對我來說,這是編程的一個重要動機。于我而言,創造編程語言是獲取更高程度自由的手段,也是我的樂趣與快樂的源泉。
為什么創造新編程語言的人不多
雖說自己創造一門編程語言有這么多好處,但并不是每個人都會去做。正如上文所說的那樣,對編程語言感興趣的人雖然有一些,但著手去創造編程語言的人幾乎沒有。說是“感興趣的人有一些”,但從占總人口的比例來看,其實少到可以算作誤差范圍的程度,更不用說有動力去創造新編程語言的人了,就算沒有也不足為奇。
我自己在關注編程語言幾年后就著了迷,但是在進入大學主修計算機科學之后,才注意到并不是所有人都對編程語言感興趣。這是因為我在偏僻的鄉下長大,周圍沒有喜歡編程的人可供比較。這一點對我來說也不知道是幸還是不幸。
“難道我跟別人不一樣?”意識到這一點的時候,我很震驚。因為當時的微機雜志上刊登了很多關于 TL/1 等編程語言的文章。我本以為對編程感興趣的人(和我一樣)很可能也會對編程語言著迷,但實際上并非如此。
本來就對編程語言不感興趣的人自不用說,即使是感興趣的人,也很難走到自己設計并實現編程語言這一步。
關于這個問題的原因,我思考過很長時間。作為編程語言設計者,在參加編程語言相關的活動時,我也曾以過來人的身份鼓勵別人嘗試一下,但結果總是不盡如人意。當然,萬事開頭難,開始一件新的事情是需要很大勇氣的。但即使是這樣,反響也太差了。
沒必要想得很難
問了很多人之后,我才知道大家為什么不去著手嘗試了。那是因為就算有興趣創造一門新的編程語言,在開始之前多半也會有某種心理障礙,也就是覺得“編程語言有現成的,本來就不需要自己去設計和開發”。難得有那么幾個人不會產生這種心理障礙,卻又覺得語言的實現似乎很難。也就是說,他們覺得編程語言很有趣,自己也想做做看,卻不知道如何去實現。
仔細想來,關于編程語言的實現的書雖然出乎意料地出版了很多,但大部分都是大學教材的難度,非常不容易理解。另外,與編譯原理有關的“文法類型”和“Follow 集合”等晦澀的術語也頻繁出現。
但是認真想一想,我們的目的是出于興趣創造自己的編程語言,而不是去掌握編程語言的實現所需的所有知識。如果你認為在沒有完全掌握正確的知識之前就無法著手創造編程語言,那就大錯特錯了,你的熱情會被逐漸消磨殆盡。
成就一番偉大的事業首先需要的就是熱情,不能保持熱情是不行的。一旦有了創造編程語言的熱情,就應盡快開始,以后再根據需要慢慢地掌握所需的知識即可。