為什麼需要更多的程式語言

伯樂線上讀者發表於2014-07-01

編注:感謝 AvisBlume 的熱心翻譯。如果其他朋友也有不錯的原創或譯文,可以嘗試分享到伯樂頭條

蘋果公司推出了一個新的 Mac/iOS 應用開發語言——Swift。以下是一個門外漢對此的理解。

對於Swift程式語言的興奮勁逐漸消散之後,早上我醒來後在《紐約時報》看到了Farhad Manjoo的推文,他非常好奇,為什麼還有人會需要新的程式語言。

I would love to read a somewhat but not extremely technical article on this question: Why are we still seeing new programming languages?

如今計算機已經普及到各個領域,我們擁有的計算機語言難道還不夠用嗎?最簡單的答案就是:不夠。只要有人想學新語言,我們就會開發新語言。這麼做的原因很簡單,而且能讓反對機械自動化的人都可以接受。(向我們的Node.js專案中的高手Chris McClellan致敬,他和我討論了這個話題。)

教人程式設計

如果這個問題可以看做”先有雞還是先有蛋”的問題,那麼我們先從蛋開始。許多語言(譬如我接觸的第一個語言,BASIC)的開發初衷是為了將程式設計概念簡單化,好讓初學者、愛好者甚至所有人都能掌握。計算機實際上是以二進位制程式碼在“思考”。這個說法的理由很簡單:如果你將下達給機器的指令都用“是”或“否”(分別用1和0來表示)的問題來表達,那麼計算機是不可能將事情搞得一團糟的(當然,如果你的程式碼有錯的話另當別論)。這個天才的想法是一個名為克勞德·夏農的人想出來的,他在二戰後認識到無線電訊號在傳輸重要資訊的時候非常地不可靠,這些資訊現在你可能會交給計算機來儲存或者處理。

自二進位制程式碼以後,幾乎每種的語言都是為了讓人們可以簡易可靠地讀寫機器指令而存在的。如果要人用冗長的二進位制來寫這些指令的話,他們會無聊到自摳雙目的。(譬如大寫字母A,用二進位制程式碼表示的話,是01000001。小寫字母a是01100001。因此,這樣寫一個單詞就得花不少時間,更不用說一般的程式都得有成千上萬行的程式碼了。)

如果某種語言使用了大量的通俗英語單詞而簡單易讀的話,那麼它是“冗長”的。Objective-C,Apple的程式語言,其荒謬的冗長程度臭名昭著,而這也為Apple贏得了“對使用者友好”的名聲。簡單易用的並不僅僅是計算機,還包括語言本身。以下是一段虛擬程式碼,Objective-C中的函式就是這個樣子的。即使你從來沒有編過程,你也可以一星半點地明白程式設計師是想讓計算機做什麼事

實際上,使用這麼多“黑客工具”的原因在於 理解程式設計概念最愉悅的方式就是將其轉化成現實中的東西。如此一來,剛開始程式設計的人就可以很好地接受這些概念。如果以上這些你聽來覺得無聊的話,並不意味著程式設計不適合你,只是你可以從硬體開始程式設計,而不要從軟體開始。

自我複製

和其他創新一樣,語言最開始也是由一些固執的人想用自己的方式做事而創造出來的,“自己的方式”也就是“最佳方式”。下面這個故事發生在很久以前。

1971年的時候,人們用Lisp程式設計。史丹佛大學的一個工程師發明了一個工具來編輯Lisp程式碼,今天的話我們會將其稱為原始的檔案編輯器–就和Mac上的TextEdit應用一樣。但它用起來相當不直觀。

要替換字元的話,人們無法直接將其鍵入到文件中,而得將一個字元先寫到TECO命令語言中,讓其切換到輸入模式,然後鍵入要替換的字元,在此期間被編輯的文件並不會顯示在螢幕上。

然後你得敲擊ESC鍵來檢視更改的地方,就和“儲存並預覽”博文的草稿一樣。總之,這事讓人挺痛苦的。

另一個來自於麻省理工的工程師,在訪問帕羅奧多(史丹佛大學所在地)時看到了這項發明,回到劍橋市(麻省理工所在地)之後決定自己重做一個改進版。他的同行們最後開始為這種新的介面編寫“巨集”–重用部分程式碼來節省時間。當他們將這些巨集規範化到系統中之後,他們將其稱為 EMACS,“Editing MACroS”的縮寫。

你也許會說:“可這根本不算一個新語言啊。”的確如此,但和人類語言一樣,程式語言經常也是從一個相近的語言發展而來,當發展到和原語言相當不一樣的時候,就會被它的支持者們冠以“新語言”的名頭。EMACS的故事說明了新語言被髮明的另外一個原因:它們省事。

抽象

如果你是一個自由主義藝術家,不要被抽象這個術語嚇到–它在程式設計中的意思和生活中的意思其實是一樣的。試著這樣想下:在寫作的時候,我們將一段文字稱為“段落”。這是對一種想法,或者一些語句的概念作出的抽象。我們採用“段落”這個詞,於是我們向別人說起這段文字時不用將整個段落的文字背誦出來。

同樣的道理,程式設計師總是在建立可重用的程式碼,因為和其他人類一樣,他們很懶,不想做重複勞動。大約30年之前,產生了一項重大的開發運動,計算機程式幾乎都可以用可重用部件組裝而成,程式設計師們將這些部件成為“類”。(這和建築、汽車或傢俱設計中的模組化運動相似。)這個設計模式就是人們熟知的“物件導向程式設計”。NeXT,也就是賈伯斯在Apple之後創立的公司,將這個創意無限的模式稱為程式設計的未來。他們對對“物件導向程式設計”興趣十足,決定將其用來命名他們自己版本的C語言,於是Objective-C誕生了。Apple在收購NeXT之後也繼承了Objective-C,並將OS變成了Mac OS X。

Swift,Apple程式語言的新生兒,就是基於Objective-C的另一個抽象層,Web開發人員因此可以用更合適他們風格來寫程式碼。但是當程式執行時,Swift還是將其編譯成舊風格的C語言程式碼。很多語言都是這樣–僅僅是為了適應開發者的風格。另一個例子是CoffeeScript,它是另一種風格的JavaScript,但是當計算機編譯執行程式時,還是將CoffeeScript程式碼轉換成JavaScript。(Swift和Objective-C的不同之處

新的基礎結構

有時你會為了適應構造上的改變而需要一種新的語言。在“雲”的概念出來之後,這種情況一直在發生。

傳統上程式是執行在本地計算機上的。這些程式就是你下載並安裝在計算機上的那些“應用”。有時,被稱為“網路”的東西可以將一臺計算機上的應用執行到遠端的其它計算機上。這些被稱為網頁應用,譬如Facebook.com或者Twitter.com。它們被稱為應用程式,因為他們並不僅僅是靜態的資訊頁面。在網頁應用中,你可以做出動作,並立即看到隨之產生的改變,雖然真正的Facebook.com應用是執行在某處的伺服器上的,而不是在你自己的計算機上面。

建立這樣的應用實際上代價是很高的:你耗費大量的計算力和頻寬來將分發“作為服務的軟體”,也就是“執行於雲端”。執行這些雲要耗費大量的金錢,尤其是用於冷卻伺服器的空調。因此最近一群天才聚集到一起創造了一個被稱為Node.js的開源平臺,它可以大幅度地降低網頁中執行應用的成本,至於原因,在此我不會有所涉及。

許多開發者更願意他們的應用能作為服務來執行,因為網頁與可下載的應用相比有更多優點,譬如:沒有東西可下載!Node.js可以讓網頁應用大規模地降低執行成本,因此參與到此專案中的人數有爆炸性地增長。Node.js平臺使用JavaScript寫的。Node(以及其他的一些流行的庫,譬如Meteor.js和Angular.js)解釋了為何JavaScript的使用人數最近呈爆炸性增長。。

這並不是說最流行的語言就獨領風騷。其它語言譬如Erlang重新激起了人們的興趣,因為應用正在趨向於執行在雲端。實際上,正是這款並不怎麼流行的語言 Erlang給WhatsApp提供了強勁的動力

文化

程式語言是由一些人為另外一些人創造的。因此,它們承載著創造者的文化印記,有些文化印記不為其他群體的工程師們喜愛,因此他們轉而創造出了自己的版本。這在電腦科學歷史中無數次上演,導致產生了許多流行語言的方言。最明顯例子就是首個阿拉伯語程式語言。去年有篇關於Ramsey Nasser的文章,他創造了第一個表情文字程式語言:

Nasser評論到:“我們使用的工具承載著它們創造者的文化設想。”當Nasser創造قلب的時候,他在將true和false翻譯成阿拉伯語時遇到了困難。最終他使用了correct和incorrect這兩個詞,雖然兩者的概念並不完全吻合,但是他說這最終演變成了一場他不得不和他父母以及朋友進行的奇妙對話。Nasser旨在創造編碼的通用性:“Emojinal意在甩掉文化包袱。”

這是一個古老格言的另一種版本:你說的語言改變了你思考的方式。有些語言有助於某些型別的思考;而有些有助於其他型別的。正如我們在四月份寫下的文字所說

“語言不僅是針對不同工作的不同工具,它們還是可以描繪你思考程式設計的技術。”Richard Pattis說。他是加州大學的資訊學高階講師,他於1981年發明了Karel教育程式語言。Pattis建議多才多藝的程式設計師要擴充套件思維的話,最好學習不同程式設計正規化的語言,從面嚮物件語言(譬如C++/JAVA),到函式式語言(譬如ML和Haskell),到指令碼語言(譬如Lisp和Python),到邏輯基礎語言(譬如Prolog),到低階語言(譬如C,Java虛擬機器或者機器語言)。目標不是為了熟練運用這些語言,而是能從不同的角度來思考解決問題。好的程式設計師不僅僅學習如何程式設計,還要學習核心概念,用其武裝自己的大腦,從而寫出高效的程式碼來解決問題。

程式設計師們,如果你對為何程式語言會興起(或衰落)有任何見解,請在Twitter上告訴我,請@chrisdannen

更新:在”抽象”部分提到的程式設計中設計模式的重要性是不可以低估的。在我釋出這篇推文時,開發人員Matt Drance回答了這個問題。如果要我挑出一句話來回答的話,這句話也許是最精準的了:新語言之所以興起,是因為目前的設計模式(也就是目前的開發語言)可能無法滿足我們在未來的需求了。

相關文章