新程式語言選擇需謹慎

csdn發表於2014-12-19

  Google於2009年第一次提出了Go的構思,Facebook在去年春天引入了Hack,隨後不久Apple也釋出了其Swift語言。

新程式語言選擇需謹慎

  在戰爭中,勝利者寫歷史書;在科技中,贏的公司都在寫程式語言。互聯是建立在開發標準和程式碼之上,但是社交網路和雲端計算領域受企業巨頭控制,並且它們開始把自己獨一無二的印記烙在數字科技上——這是必然的,就像征服者威廉和他的諾曼人一樣,大量新的詞彙加入到英語中。他帶來許多新事物,如陪審制度,這些都影響著當地的法律和語言的方式。

  可以確定的是,新的語言給予程式設計師一些有用的支撐點。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說的那樣:沒有激勵,語言的歷史充斥著標準化的努力。這是非常錯誤的,浪費了大量的時間,卻沒有產出一個讓任何人都滿意的結果。

  這麼說並不意味著忽視Facebook開發的新語言Hack,儘管Hack是開放原始碼的,但是本質上PHP語言的變體或擴充套件。並沒有受到公司外部的人追捧。毫無疑問,Facebook希望看到變化,但是它並不是社交網路積極推動的東西。這些天對於Facebook的Hack的反應就是“觀望”。

  開發者指出,每一個新的語言開始作為一個擺脫不掉的種子存在於個人或小組的大腦中,這一直困擾著我。我們可以做的更高。無論如何,需要有耐心和努力去學習一個新的語言;開發者要仔細選擇。Payne說:“當選用一個新的語言時,我會跟隨其他人的東西,因為這些人和你一樣依賴於圖書館和文件,我想你希望知道你是否進入了一個正確的‘小鎮’。”

  有一點我們可以有信心的說,新語言是好的,它們簡化了程式設計師的生活;簡化了程式設計的工藝;它們融入了新的有前途的思想;它們贏得了包括公司內外部開發者的尊重。

  因為這些原因,霸權主義可能是一個錯誤的歷史對照來製造新程式語言潮流。相反,我們討論的這些更像是稱為軟實力的外交政策型別:Go和Swift以特定方式體現它們公司的精髓。伺服器VS個人裝置;開放Web VS應用商店;一個跨平臺的世界VS一個公司。所有區分程式語言的分歧——編譯或解釋?靜態VS動態變數型別?記憶體管理/垃圾回收?在今天這些可能都是很重要的。

  換句話說,任何人擔心企業發展程式語言的真正原因可能不是“OMG,他們想要接管世界!”相反,他們擔心的原因是不管他們成長的多大,他們總會受到根源語言的約束。

  關於程式語言,一旦它們佔領程式設計師的“頭腦”,那麼你永遠不會知道它們最終會去哪裡。在80年代創造Objective C的物件導向程式設計愛好者,他們可能不知道該語言在25年以後會變成一個巨大的全球生態系統移動裝置所必要的程式語言。當Sun於1995年推出Java時,每個人都認為它將是一個用於構建瀏覽器小程式的好工具,然而它的命運走向了伺服器端。同時釋出的Javascript被廣泛的遺忘,在今天卻讓很多Web“移動”。

  對於開發者來說,選擇一個語言就像選擇一個國家的國籍,你不僅僅購買語法和語義,你也購買了經濟和文化,以及你怎樣獲得生計和力量的規則。就像他們常說的:為了避免一個“死”語言控制了世界,購買需要謹慎。

  原文連結:medium

相關文章