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















 
 
 





 
 
 
 