程式語言百百種,想要學 Coding 就必須先確定你的目的是什麼,有的是拿來寫 App 的,有的是專寫作業系統,有的則是拿來寫網頁的 …… 各種不同的目的都有其最適合的語言。常見的語言如 C++、JavaScript、VB、VC、Matlab、Python 等,但其實像 WhatsApp 如此受歡迎的 App 就不是前述這幾種語言寫的,為什麼要有那麼多的程式語言?

本文作者 Chris Dannen 同時是知名科技媒體《Fast Company Digital》 和《FastCo.Labs》 的編輯,曾經做過管理顧問、戶外運動的採訪記者以及 Red Bull Energy Drink 的品牌代表,曾寫過兩本關於 iOS 開發與設計的書。以下以作者第一人稱撰寫。

  • 世界上的程式語言已這麼豐富,為什麼我們還需要更多?

六月初,Apple 發布了一個新的語言 Swift,主要是為了建立 Mac Apps 而開發的,你有想過為什麼需要這麼多的程式語言嗎?難道現在開發的都還不夠用嗎?沒錯,就是一個簡單到不行的原因:只要有人想要學習,就會有各種不同的語言被開發出來。因為科技進步,加上因為使用語言的目的性不同,越來越廣泛也越齊全。

如果把這個問題套用到「雞生蛋還是蛋生雞」,這個問題的解答會是蛋生雞。許多語言的開端,都是要讓編寫程式的概念變得更簡單、更適合初學者和有興趣的朋友。事實上,電腦把語言設成二元碼(電腦進行儲存和運算時,採用二進位,也就是所有資訊都被替代成二進位字串),為什麼要這麼做呢?

原因很簡單:如果你把你所有的指示轉換成 Yes 或 No 的問題,並分別以 1 和 0 表示,這麼一來電腦就不會搞混了(除非一開始的編碼是錯的)。在第二次世界大戰時,廣播訊號是以非常糟糕又不可靠的無線電導航來傳重要訊息,而二元碼如此聰明的創新是 Claude Shannon (美國數學家、電子工程師和密碼學家,被譽為資訊理論的創始人)所發想的,只要用二元碼,電腦就可以把資訊儲存與進行處理。

自從二元碼誕生,非常多的語言都以它來設計,使工程師能夠寫得更流暢又更容易讀,雖然會感到無聊或是覺得寫二元碼很冗長。比如說大寫字母 A 好了,以二元碼表示成 01000001 ,如果是小寫 a 呢,則是 01100001 ,寫完一個程式碼要花一些時間,但不用介意長度有幾千行,因為大多數的程式都是這樣來的。

當一個語言以易懂的英文寫,就更容易讀了,但另一方面就會顯得相當冗長;像是 Apple 的程式語言 Objective-C(是一種通用、高階、物件導向的程式語言,任何原始的 C 語言承是不需要經過修改就能直接通過 Objective-C 的編譯器),就是冗長到不行;但主要也是為了要滿足對使用者友善的特色,語言本身就是非常容易使用的。即使在你的生命中從來沒有寫過程式,或多或少你也能了解一點工程師想要告訴電腦要做什麼,它長的大概是像這個樣子:

[someInstance doSomethingWithObject:a andAnotherParam:b];

事實上,為什麼在物理電子學的範疇裡有這麼多的駭客套件,主要是因為要讓現實世界的裝置通常能以最自然的方式轉換成寫程式的概念,至少對於寫程式的初學者而言,這類的程式語言是比較適合的,即使它很冗長。

  • 程式語言就是開發者自我性格的複製

就像其他的創新一樣,程式語言通常都是從一個偏執頑固的人開始,試圖要走一條只屬於自己的路。

舉例來說 1971 年,在這個領域的大多數人都在 Lisp(源於列表處理器,List Processor 的縮寫,是歷史悠久的電腦程式語言家族,於 1958 年基於 λ 演算創造,是第一個函數語言程式設計的語言)寫程式,一個在 Stanford 的工程師明白了要如何編輯 Lisp 的編碼,也就是我們今天所謂的原始的編輯器;想像一下,就是一個在 Mac 上的 TextEdit App,但當然不是像現在一樣可以直接簡單的使用。

然後你必須按 Escape 鍵跳出頁面,檢查你所做的那些改變,像是儲存或瀏覽在部落格貼文的草稿等,是否跟你預想中的一樣;不管怎麼說,重複對照你所想的與結果,這簡直是一件痛苦的事,。

另一個從 MIT 來的工程師看到在 Palo Alto 的創新後,決定要回 Cambridge 後靠自己把它複製下來,並且做一些改善與調整;而其他同事們為了新介面終於開始寫 macros(巨集,根據一系列預定的規則替換一定的文字模式)—— 可重複使用的編碼位元以節省時間。當他們將巨集的集合程序化,結合到一個系統內,他們把這個叫做 EMACS,Editing MACroS 的縮寫。

  • 抽象到不行

如果你是念文法商的,別被這樣的名詞嚇到,它代表著一個程式的生命。

換個角度想像,在寫作時,我們會把字句的結合叫做段落,這是就寫文章的觀點來看,它也是一個抽象的概念,當我們要告訴其他人正在討論文章的哪部份時,我們不需要再重新引述整個段落的文字內容,而是告訴他們第幾段就好;說到底它也是抽象的。

同樣地,寫程式的工程師經常會試著要創造可重複使用的編碼字元,因為就像其他人一樣,會懶惰,會不想做重複的事情。

大約 30 年前有個大改變,對於藉由可重複使用的部分來建立電腦程式,將它稱作為物件(若是在建築、車子或是家具設計,就很像是模組化),這樣的設計模式稱作為物件導向的程式編寫,在 NeXT(Steve Jobs 在創立蘋果後所成立的公司)的那段期間,這可是相當創新的,當時還將它視為未來程式發展的領航者。所以他們就將這樣物件導向的程式拿去賣,並且決定將它取為在 C 語言架構下屬於他們自己版本的名稱,於是 Objective-C 就這樣誕生了。

當 Apple 買下 NeXT 後繼承了 Objective-C,並把他們公司的 OS 變成 Mac OSX。

  • 雲端時代,語言也需要新架構

當本質上發生改變的時候,你必須要去適應它,因此有時候你會需要一個新的語言。伴隨著雲端時代的來臨,更是如此。

傳統上來說,程式會依下載位置在你的電腦(裝置)上跑,就像你所下載的 Apps 和安裝到你電腦內的軟體。然而有時候,某個叫作網路的東西,它有無限神奇的功能,能夠把在某一台電腦運作的 App 傳送到另一台電腦上,這些是網路 App,比如說像是 Facebook.com 或是 Twitter.com 等等。

在網路 App 你能夠做很多事情並且看到即時的變化,Facebook.com 的 App 是在某處的伺服器運作,而不是你實際的電腦上。

要創一個 App 其實是需要花好一番功夫的,你需要不只是電腦能力和頻寬傳輸,軟體是一種服務,從雲端來的服務,這些雲端是需要花一大筆成本來操作的,所以最近一群聰明的人聚集在一起,然後創造叫作 Node.js 的開源平台,透過網路跑 App 以大幅降低成本。

許多開發商偏好將他們的 App 視為一種服務,因為一個網站有非常多的下載 App 的優勢,像是免費下載,使 App 更便宜且在一定規模下運作,已經造成了 Node.js 一陣轟動,而 Node.js 是由 JavaScript 寫出來的,Node 解釋了為什麼身為一個語言的 JavaScript 最近可以如此受歡迎。

並不是要說上圖這幾個受歡迎的語言已經霸佔了大部分的市場,其他的語言像是 Erlang,自從 App 開始移往雲端後,它又重新的引起大家的興趣。事實上,相較於圖上這幾個語言來說,受歡迎程度相當低的 Erlang 是創造 WhatsApp 的最大功臣。

  • 一個程式語言,乘載了一群自造者的文化

一部份人創造的程式語言是為了其他人,因此他們承載著所有自造者的文化產物,部份文化產物又和其他的工程師群不同,他們各自走著屬於自身文化產物下的版本,在電腦科學的歷史上這已經發生過無數次,也形成著最受歡迎語言的運算子重載(對已有的運算符號重新定義,賦予它另一種功能以適應不同的數據類型)。

有些語言對於邏輯思考的類型是有一定幫助的,一個你所用的語言會改變你的思考模式。就像是 Richard Pattis(一個加州大學爾灣分校資訊學的資深講師)所說,「不只是為了不同的任務而有不同的語言工具,同時它們也形塑著你如何看待寫程式的科技」。

這也是為什麼會有這麼多程式語言存在著,不同的語言代表著一群工程師腦中的思考邏輯模式,當然如果身為語言的使用者而非語言的創造者,太多的選擇中要選擇一個對工作最有幫助的,最能達成目標的那個。

延伸閱讀:

32 個工程師應付 5 億用戶,就靠這個 80 年代誕生的程式語言

程式語言進化鏈的頂端:為什麼說蘋果的 Swift 正在顛覆整個網路生態?

想挖出 Big Data 的秘密, 這 10 個程式語言你不能不懂

(資料來源:FastCompany;圖片來源:FastCompanyDesarrollando América Latina, CC Licensed)