為什么需要更多的編程語言
蘋果公司推出了一個新的 Mac/iOS 應用開發(fā)語言——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?
如今計算機已經普及到各個領域,我們擁有的計算機語言難道還不夠用嗎?最簡單的答案就是:不夠。只要有人想學新語言,我們就會開發(fā)新語言。這么做的原因很簡單,而且能讓反對機械自動化的人都可以接受。(向我們的Node.js項目中的高手Chris McClellan致敬,他和我討論了這個話題。)
教人編程
如果這個問題可以看做”先有雞還是先有蛋”的問題,那么我們先從蛋開始。許多語言(譬如我接觸的***個語言,BASIC)的開發(fā)初衷是為了將編程概念簡單化,好讓初學者、愛好者甚至所有人都能掌握。計算機實際上是以二進制代碼在“思考”。這個說法的理由很簡單:如果你將下達給機器的指令都用“是”或“否”(分別用1和0來表示)的問題來表達,那么計算機是不可能將事情搞得一團糟的(當然,如果你的代碼有錯的話另當別論)。這個天才的想法是一個名為克勞德·香農的人想出來的,他在二戰(zhàn)后認識到無線電信號在傳輸重要信息的時候非常地不可靠,這些信息現(xiàn)在你可能會交給計算機來存儲或者處理。
自二進制代碼以后,幾乎每種的語言都是為了讓人們可以簡易可靠地讀寫機器指令而存在的。如果要人用冗長的二進制來寫這些指令的話,他們會無聊到自摳雙目的。(譬如大寫字母A,用二進制代碼表示的話,是01000001。小寫字母a是01100001。因此,這樣寫一個單詞就得花不少時間,更不用說一般的程序都得有成千上萬行的代碼了。)
如果某種語言使用了大量的通俗英語單詞而簡單易讀的話,那么它是“冗長”的。Objective-C,Apple的編程語言,其荒謬的冗長程度臭名昭著,而這也為Apple贏得了“對用戶友好”的名聲。簡單易用的并不僅僅是計算機,還包括語言本身。以下是一段虛擬代碼,Objective-C中的函數就是這個樣子的。即使你從來沒有編過程,你也可以一星半點地明白程序員是想讓計算機做什么事:
- [someInstance doSomethingWithObject:a andAnotherParam:b];
實際上,使用這么多“黑客工具”的原因在于 理解編程概念最愉悅的方式就是將其轉化成現(xiàn)實中的東西。如此一來,剛開始編程的人就可以很好地接受這些概念。如果以上這些你聽來覺得無聊的話,并不意味著編程不適合你,只是你可以從硬件開始編程,而不要從軟件開始。
自我復制
和其他創(chuàng)新一樣,語言最開始也是由一些固執(zhí)的人想用自己的方式做事而創(chuàng)造出來的,“自己的方式”也就是“***方式”。下面這個故事發(fā)生在很久以前。
1971年的時候,人們用Lisp編程。斯坦福大學的一個工程師發(fā)明了一個工具來編輯Lisp代碼,今天的話我們會將其稱為原始的文件編輯器–就和Mac上的TextEdit應用一樣。但它用起來相當不直觀。
要替換字符的話,人們無法直接將其鍵入到文檔中,而得將一個字符先寫到TECO命令語言中,讓其切換到輸入模式,然后鍵入要替換的字符,在此期間被編輯的文檔并不會顯示在屏幕上。
然后你得敲擊ESC鍵來查看更改的地方,就和“保存并預覽”博文的草稿一樣。總之,這事讓人挺痛苦的。
另一個來自于麻省理工的工程師,在訪問帕羅奧多(斯坦福大學所在地)時看到了這項發(fā)明,回到劍橋市(麻省理工所在地)之后決定自己重做一個改進版。他的同行們***開始為這種新的接口編寫“宏”–重用部分代碼來節(jié)省時間。當他們將這些宏規(guī)范化到系統(tǒng)中之后,他們將其稱為 EMACS,“Editing MACroS”的縮寫。
你也許會說:“可這根本不算一個新語言啊。”的確如此,但和人類語言一樣,編程語言經常也是從一個相近的語言發(fā)展而來,當發(fā)展到和原語言相當不一樣的時候,就會被它的支持者們冠以“新語言”的名頭。EMACS的故事說明了新語言被發(fā)明的另外一個原因:它們省事。
抽象
如果你是一個自由主義藝術家,不要被抽象這個術語嚇到–它在編程中的意思和生活中的意思其實是一樣的。試著這樣想下:在寫作的時候,我們將一段文字稱為“段落”。這是對一種想法,或者一些語句的概念作出的抽象。我們采用“段落”這個詞,于是我們向別人說起這段文字時不用將整個段落的文字背誦出來。
同樣的道理,程序員總是在創(chuàng)建可重用的代碼,因為和其他人類一樣,他們很懶,不想做重復勞動。大約30年之前,產生了一項重大的開發(fā)運動,計算機程序幾乎都可以用可重用部件組裝而成,程序員們將這些部件成為“類”。(這和建筑、汽車或家具設計中的模塊化運動相似。)這個設計模式就是人們熟知的“面向對象編程”。NeXT,也就是喬布斯在Apple之后創(chuàng)立的公司,將這個創(chuàng)意無限的模式稱為編程的未來。他們對對“面向對象編程”興趣十足,決定將其用來命名他們自己版本的C語言,于是Objective-C誕生了。Apple在收購NeXT之后也繼承了Objective-C,并將OS變成了Mac OS X。
Swift,Apple編程語言的新生兒,就是基于Objective-C的另一個抽象層,Web開發(fā)人員因此可以用更合適他們風格來寫代碼。但是當程序運行時,Swift還是將其編譯成舊風格的C語言代碼。很多語言都是這樣–僅僅是為了適應開發(fā)者的風格。另一個例子是CoffeeScript,它是另一種風格的JavaScript,但是當計算機編譯運行程序時,還是將CoffeeScript代碼轉換成JavaScript。(Swift和Objective-C的不同之處)
#p#
新的基礎結構
有時你會為了適應構造上的改變而需要一種新的語言。在“云”的概念出來之后,這種情況一直在發(fā)生。
傳統(tǒng)上程序是運行在本地計算機上的。這些程序就是你下載并安裝在計算機上的那些“應用”。有時,被稱為“網絡”的東西可以將一臺計算機上的應用運行到遠程的其它計算機上。這些被稱為網頁應用,譬如Facebook.com或者Twitter.com。它們被稱為應用程序,因為他們并不僅僅是靜態(tài)的信息頁面。在網頁應用中,你可以做出動作,并立即看到隨之產生的改變,雖然真正的Facebook.com應用是運行在某處的服務器上的,而不是在你自己的計算機上面。
創(chuàng)建這樣的應用實際上代價是很高的:你耗費大量的計算力和帶寬來將分發(fā)“作為服務的軟件”,也就是“運行于云端”。運行這些云要耗費大量的金錢,尤其是用于冷卻服務器的空調。因此最近一群天才聚集到一起創(chuàng)造了一個被稱為Node.js的開源平臺,它可以大幅度地降低網頁中運行應用的成本,至于原因,在此我不會有所涉及。
許多開發(fā)者更愿意他們的應用能作為服務來運行,因為網頁與可下載的應用相比有更多優(yōu)點,譬如:沒有東西可下載!Node.js可以讓網頁應用大規(guī)模地降低運行成本,因此參與到此項目中的人數有爆炸性地增長。Node.js平臺使用JavaScript寫的。Node(以及其他的一些流行的庫,譬如Meteor.js和Angular.js)解釋了為何JavaScript的使用人數最近呈爆炸性增長。。
這并不是說***的語言就獨領風騷。其它語言譬如Erlang重新激起了人們的興趣,因為應用正在趨向于運行在云端。實際上,正是這款并不怎么流行的語言 Erlang給WhatsApp提供了強勁的動力。
文化
編程語言是由一些人為另外一些人創(chuàng)造的。因此,它們承載著創(chuàng)造者的文化印記,有些文化印記不為其他群體的工程師們喜愛,因此他們轉而創(chuàng)造出了自己的版本。這在計算機科學歷史中無數次上演,導致產生了許多流行語言的方言。最明顯例子就是***阿拉伯語編程語言。去年有篇關于Ramsey Nasser的文章,他創(chuàng)造了***個表情文字編程語言:
Nasser評論到:“我們使用的工具承載著它們創(chuàng)造者的文化設想。”當Nasser創(chuàng)造قلب的時候,他在將true和false翻譯成阿拉伯語時遇到了困難。最終他使用了correct和incorrect這兩個詞,雖然兩者的概念并不完全吻合,但是他說這最終演變成了一場他不得不和他父母以及朋友進行的奇妙對話。Nasser旨在創(chuàng)造編碼的通用性:“Emojinal意在甩掉文化包袱。”
這是一個古老格言的另一種版本:你說的語言改變了你思考的方式。有些語言有助于某些類型的思考;而有些有助于其他類型的。正如我們在四月份寫下的文字所說:
“語言不僅是針對不同工作的不同工具,它們還是可以描繪你思考編程的技術。”Richard Pattis說。他是加州大學的信息學高級講師,他于1981年發(fā)明了Karel教育編程語言。Pattis建議多才多藝的程序員要擴展思維的話,***學習不同編程范式的語言,從面向對象語言(譬如C++/JAVA),到函數式語言(譬如ML和Haskell),到腳本語言(譬如Lisp和Python),到邏輯基礎語言(譬如Prolog),到低級語言(譬如C,Java虛擬機或者機器語言)。目標不是為了熟練運用這些語言,而是能從不同的角度來思考解決問題。好的程序員不僅僅學習如何編程,還要學習核心概念,用其武裝自己的大腦,從而寫出高效的代碼來解決問題。
程序員們,如果你對為何編程語言會興起(或衰落)有任何見解,請在Twitter上告訴我,請@chrisdannen。
更新:在”抽象”部分提到的編程中設計模式的重要性是不可以低估的。在我發(fā)布這篇推文時,開發(fā)人員Matt Drance回答了這個問題。如果要我挑出一句話來回答的話,這句話也許是最精準的了:新語言之所以興起,是因為目前的設計模式(也就是目前的開發(fā)語言)可能無法滿足我們在未來的需求了。
原文鏈接: Chris Dannen 翻譯: 伯樂在線 - 伯樂在線讀者