從Go、Swift出發:語言的選擇需謹慎
英文原文:My Computer Language is Better than Yours — Medium
Google 于 2009 年第一次提出了 Go 的構思,非死book 在去年春天引入了 Hack,隨后不久 Apple 也發布了其 Swift 語言。
Google GO
在戰爭中,勝利者寫歷史書;在科技中,贏的公司都在寫編程語言。互聯是建立在開發標準和代碼之上,但是社交網絡和云計算領域受企業巨頭控制,并 且它們開始把自己獨一無二的印記烙在數字科技上——這是必然的,就像征服者威廉和他的諾曼人一樣,大量新的詞匯加入到英語中。他帶來許多新事物,如陪審制 度,這些都影響著當地的法律和語言的方式。
可以確定的是,新的語言給予程序員一些有用的支撐點。Google Go 語言的構建簡化了并發運行代碼的工作,由于存在并行編程模式,因此這一語言也被設計用來解決多處理器的任務。對于流行的 Web 腳步語言,像 PHP 和 JavaScript,Apple 的 Swift 語言提供給 iPhone 程序員一些簡潔性和靈活性。每個語言都有它自己的標志:Swift 是一只風格化的鳥,Go 語言則是一只拗腳的地鼠。
Ken Thompson、 Rob Pike 和 Robert Griesemer 是 Google 的三位編碼大師,于 2009 年半開玩笑的提出了 Go 的構思。像 C++ 和 Java 這些廣泛使用的編程語言是遲鈍的,尤其是面對 Google 那種大規模的項目部署時。每次添加或改變一些東西時候,你都需要等待編譯器將代碼轉換為機器可讀的二進制版本。
Rob Pike 說:“這個等待過程要 45 分鐘,我認為這是痛苦的。當需要等待那么長時間時,你有很多時間可以考慮,你需要怎么做可以更好。”
設計編程語言在于權衡——對于程序員容易,對于機器最適合
創建運行快的代碼要求程序員付出更多的努力。人們編寫運行迅速的代碼需要花費多少時間和精力呢?另一個主要權衡在于直接訪問機器時語言提供的內 存數量。不僅在這里,在其它地方也一樣,語言發明者必須選擇:知道他們可能會搞砸時,你為程序員提供多少自由?你為他們提供多少措施來緩解他們的失誤?
語言設計的任務是莊嚴的、正式的、宏偉的、充滿了難題和矛盾。這里沒有正確的答案,只有不同的選擇,以適應不斷變化的硬件、多變的用戶和挑剔的程序員。
Go 語言的創造者有足夠的經驗去做這些選擇,Ken Thompson 創建了 Unix,他和他的同伴 Pike(貝爾實驗室老將)共同設計了字符編碼的風格,被稱為 UTF-8,現如今大多數 Web 會使用。所以他們知道小的決策也會有巨大的影響。現在增加的每一條規則,可能就意味著在未來極多的按鍵需要程序員去操作。每一條規則的遺漏可能意味著無數 的崩潰。
例如,編程語言通常使用分號來分隔語句,使用括號將相關語句組織在一起。典型的如“Hello,World”C語言程序:
main ()
{
printf (“hello world”);
}
Go 的創造者認為括號是至關重要的。有些語言(尤其是 Python)把這放到了一邊,允許程序員使用縮進(空格)或“隱形的字符”來告訴人和機器代碼的位置。Go 團隊認為這是一個“深刻的錯誤”,括號意味著程序員可以明確不含糊的告訴計算機如何在很大一塊區域組合代碼。在一次與 Sergey Brin 會面上,Google 的創始人提出 Go 的設計人員使用方括號,而不是花括號,節約開發者無數趟使用“Shift”鍵。
在 2009 年 12 月份,Go 決定停止要求程序員以分號結束語句。分號用于解析器——把項目分解成塊(相關代碼組成一塊)的幕后工具,目前的 FAQ 解釋道:“我們想盡可能的消除它,從此當你遞送你代碼到解析器的時候,機器將注入分號。”
Go 清除分號減輕了程序員的眼睛疲勞,但是程序員需要更嚴格的部署花括號,否則分號會注入到錯誤的地方。
這些選擇并不是沒有爭議的,一個批評家在 Pike 的講座上抱怨道:“他們通過冗余的花括號破壞了語言。”語言也可以被設計的很容易,僅僅使用空格行使花括號的角色來阻斷代碼的不同部分。Google 的 Andrew Gerrand 回應道:“每天都有一定規模不可思議的倒霉事發生。意思是有人會偷偷的把一些看不見的符號放入代碼庫中,導致一個微妙的 Bug。這在 Google 的 Python 程序中已經發生了不止一次。”
然而對于那些在軟件論壇爭論細微差別的程序員來講,“任性的”語法也會使他們“醉了”。
和我們所說的語言不同,程序員稱之為自然語言。編程語言是為特別目的和用途精心編制的。Go,正如 Pike 解釋的那樣,它是由 Google 設計的用來解決 Google 問題。Google 存在大的問題......我們需要一種語言,可以讓我們更容易的完成我們的工作——編寫服務軟件。
Google 在云服務中運行它自己的全球性超級計算機,這種計算恰恰使 Go 能夠得到最佳化的使用。但是 Google 并沒有從銷售軟件中獲得一分錢。并且 Go 已經是一種免費的、開源的項目,這使得它迅速的進入了其他裝備的技術庫。Redmonk 咨詢公司的一名分析師說:“它成為云基礎設施的新興語言。”
Go 已經逐漸的流行起來。例如,Dropbox 已經從 Python 轉移了大部分的后端代碼到 Go。Automattic,一家運營 Wordpress.com 的公司,也使用了 Go,雖然 WordPress 本身一直使用 PHP 腳本語言。Automattic 開發者 Demitrious Kelly 說:“這些天有十幾個新的框架和方法擺在那,你必須要問自己,它比我們擁有的要好嗎?但是這本身就是一個復雜的問題,要好到什么程度?它可以讓我們做到什 么是我們以前做不到的事情?值得嗎?”Kelly 稱,在眾多測試當中 Go 的表現不錯,部分原因是該語言比較小,他說:“Go 語言很容易在一個星期內就上手。”
鑒于 Go 的設計主要是針對 Google 特定的問題,語法的選擇,即分號和花括號。這個問題并不那么簡單,需要追求細節,還要有熱情。愿意無視傳統的編程給這個世界帶來新的語言。可能最終推動語言的采用的就是程序員認真注意日常的編碼——程序員稱之為“痛點”
Swift 的起源
每個編程政權都有這樣的痛點,但是迅速崛起的 iOS 給了開發者多于常規的份額。直到今年夏天 Swift 語言的出現為止,如果你想為 iOS 寫一個程序,你必須使用 Objective C 語言。在 80 年代,Steve Jobs 就已經采用了 Objective C,并且當 Steve Jobs 重返 Apple 之后,該語言逐漸成為 Mac OSX 的主力工具。
現在開發者說一個語言也就透露了他的年紀。編寫 Mac 操作系統老將 Andy Hertzfeld 說:“當看到 Swift 公告的時候我非常激動。因為我一直鄙視 Objective C,我喜歡其背后的原則,但是討厭其語法,我從來沒能夠真正的享受編程。”
Apple 將其下一代產品、編程語言項目委托給一位名叫 Chris Lattner 的計算機科學家,LLVM 項目的主要發起人與作者之一。LLVM 是一個開源項目,其核心庫提供了與編譯器相關的支持,可以在不同的平臺上運行(包括 Apple 和 Google 在內,都廣泛的使用它)。在 2005 年加入 Apple 后,Chris Lattner 繼續 LLVM 項目以及相關的工作,隨后在大眾視野里消失了幾年,去年 6 月份,在 Apple 全球開發者大會上,其攜帶 Swift 出現在大家的面前。
Swift 旨在成為“第一款工業級質量的系統編程語言!”換句話說,Swift 是有前途的,你將能夠不用費力就可寫出運行迅速的代碼。這贏得了大批 iOS 開發者和旁觀者的歡呼。 Hertzfeld 說::“做得好,它緩解了每個人巨大的痛點。對于 iOS 開發者來說不去追求 Swift 的頂端是愚蠢的。”
如果你“簽約”了 Swift,意味著你購買了 Apple 的整個領域:你需要通過 Apple 開發和銷售你的程序;你的程序將運行在 Apple 機器上;如果你想在其它地方運行的話,你需要使用其它語言重新寫一遍;你的命運將和 Apple 密不可分。
Hertzfeld 說:“你必須提交到這個“有圍墻的花園”,所以他抵制了用 Swift 工作的誘惑。不過如果他們實現開源,或者對跨平臺有一點點興趣的話,我可能會接受 Swift 工作。”
開源版本的 Swift 意味著開發者能夠找到一種方法快速的將程序移植到不同的平臺,并且這也能保證在未來,當 Apple 失去了 Swift 繼續下去的興趣,該語言還是有未來的。那些曾逗留在“有圍墻的花園”外圍的開發者往往非常關心這個問題。Apple 對于開源并不完全過敏,雖然它似乎決心要抓住世界范圍內 iOS 的控制權。在 Swift 公布不久后,LLVM 項目里的開發者開始就 Swift“隔絕自然”問題糾纏于 Apple 和 Lattner,Lattner 回應說:
伙伴們,你的推測僅僅是——投機。我們還沒有討論過這個,因為我們有大量的工作去應對大量的反饋,并要在今秋發布 1.0 版本之前落實大量的事情(如訪問控制)。你可以想象我們當中有很多人希望它開源,并成為 LLVM 的一部分,但是討論尚未發生,并且短時間內也不會出現。
Swift 的出現并沒有 Go 時間長,在任何情況下,其未來在 Apple 領域是安全的,如果 Apple 說 Swift 是十億 iOS 設備的未來,那么它就是。就像一位波特蘭獨立的 iOS 開發者 David Wheeler 一樣,人們會采用它,因為從長遠看來,他們別無選擇,同時它也有意義。Wheeler 說 Swift 迅速的將他“拿下”了,他以為 Apple 將繼續修補 Objective C,“我想知道它現在去哪了?”Wheeler 說。
語言本能
大型計算機時代的主流語言有相似的起源:來自 IBM 的 FORTRAN,以及 COBOL 在很大程度上是基于 Grace Hopper 的 Flow-matic,而這個是為 Remington Rand 公司的 Unicac 創建的。在 1990 年,Sun 創建了 Java,2000 年 Microsoft 創建了C#。
事實上,大多數的語言是大型機構、企業或學校的產物。
Hertzfeld 說:“創建一種新的編程語言需要花費大量的資源。這是一個長達十年的項目去讓新的語言完全用工具加工、建立和使用,小公司做不到這點。”
盡管有困難,但是悲哀的是自 1960 年以來,計算機行業里有太多的語言存在重復的部分。今天的悲哀是無用的,程序員不太可能停止設計新的語言,或者同意去分享,因為如早期開發者 Alex Payne 說的那樣:沒有激勵,語言的歷史充斥著標準化的努力。這是非常錯誤的,浪費了大量的時間,卻沒有產出一個讓任何人都滿意的結果。
這么說并不意味著忽視 非死book 開發的新語言 Hack,盡管 Hack 是開放源代碼的,但是本質上 PHP 語言的變體或擴展。并沒有受到公司外部的人追捧。毫無疑問,非死book 希望看到變化,但是它并不是社交網絡積極推動的東西。這些天對于 非死book 的 Hack 的反應就是“觀望”。
開發者指出,每一個新的語言開始作為一個擺脫不掉的種子存在于個人或小組的大腦中,這一直困擾著我。我們可以做的更高。無論如何,需要有耐心和 努力去學習一個新的語言;開發者要仔細選擇。Payne 說:“當選用一個新的語言時,我會跟隨其他人的東西,因為這些人和你一樣依賴于圖書館和文檔,我想你希望知道你是否進入了一個正確的‘小鎮’。”
有一點我們可以有信心的說,新語言是好的,它們簡化了程序員的生活;簡化了編程的工藝;它們融入了新的有前途的思想;它們贏得了包括公司內外部開發者的尊重。
因為這些原因,霸權主義可能是一個錯誤的歷史對照來制造新編程語言潮流。相反,我們討論的這些更像是稱為軟實力的外交政策類型:Go 和 Swift 以特定方式體現它們公司的精髓。服務器 VS 個人設備;開放 Web VS 應用商店;一個跨平臺的世界 VS 一個公司。所有區分編程語言的分歧——編譯或解釋?靜態 VS 動態變量類型?內存管理/垃圾回收?在今天這些可能都是很重要的。
換句話說,任何人擔心企業發展編程語言的真正原因可能不是“OMG,他們想要接管世界!”相反,他們擔心的原因是不管他們成長的多大,他們總會受到根源語言的約束。
關于編程語言,一旦它們占領程序員的“頭腦”,那么你永遠不會知道它們最終會去哪里。在 80 年代創造 Objective C 的面向對象編程愛好者,他們可能不知道該語言在 25 年以后會變成一個巨大的全球生態系統移動設備所必要的編程語言。當 Sun 于 1995 年推出 Java 時,每個人都認為它將是一個用于構建瀏覽器小程序的好工具,然而它的命運走向了服務器端。同時發布的 Javascript 被廣泛的遺忘,在今天卻讓很多 Web“移動”。
對于開發者來說,選擇一個語言就像選擇一個國家的國籍,你不僅僅購買語法和語義,你也購買了經濟和文化,以及你怎樣獲得生計和力量的規則。就像他們常說的:為了避免一個“死”語言控制了世界,購買需要謹慎。