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