大神爲你分析 Go、Java、C 等主流編程語言(Go能夠替代Java,並且最小化程序員的工做量,學習比較容易)

本文主要分析 C、C++9八、C++十一、Java 與 Go,主要論述語言的關鍵能力。在論述的過程當中會結合華爲各語言編程專家和華爲電信軟件內部的骨幹開發人員的交流,摒棄語言偏好或者語言教派之爭,儘可能以客觀公正的角度來論述下各個語言的特色和不足,對語言選型做爲一個客觀的參考。java

把這些寫出來,指望獲得你們的指正與反饋,讓整個分析更客觀,性能方面,着重對 Go 作深刻剖析參考。內容不少,指望不會讓你望而卻步。python

語言總體概要linux

一、Goandroid

在併發方面, goroutine 和 channel 機制提供了語言層面的輕量級和毫無拖泥帶水的併發機制;在性能方面,提供了不弱於 Java 的性能(性能是個僞命題),而內存資源消耗方面,相對 Java 和其它動態語言,具有明顯的優點;在語法方面,具有了部分 Python 的動態語言特性,在對象初始化、構造和序列化等方面提供了無比簡潔的表述方式,而這些處理代碼可能佔據 10%~50% 的代碼份量,尤爲對於處理數據、配置和協議映射場景,相比 C、C++、Java 在此方面拙笨,這就是動態語言爲什麼讓人着迷的關鍵所在。nginx

這也是爲啥 Go 語言第一個版本發佈時就如此受人矚目的關鍵所在,尤爲是對於動態語言來講,它提供了動態語言所不具備的併發與性能優點,Pike 設計 Go 語言目的是想做爲 C/C++ 的另一個可選的角色(注意不是替換,其設計目標不是替換),Go 語言之父 Google 首席軟件工程師 Pike 2012 年「大道至簡」演講稿中對於此目標充滿沮喪,引用其中一句話:「Although we expected C++ programmers to see Go as an alternative, instead most Go programmers come from languages like Python and Ruby. Very few come from C++.」 C++ 的價值精髓在於:語言提供更加普遍的抽象、優雅和靈活的特性,而這些表達能力是硬件零成本的,而 C 語言一開始就把硬件零成本做爲其設計目的,但語言表述力是 C++ 來解決,Go 思考的方向顯然不是零成本,至少不是零 CPU 成本,Go 的主張更多考慮的是最小化程序員的工做量。git

一個是硬件零成本的極致追求,一個是最小化程序員的工做量,誰都替換不了誰最有價值的部分,Go 沒法同時符合兩個目標,它選擇了動態語法和 gc,就註定了它選擇開發效率,會爲開發效率犧牲硬件效率,因此它走向另一個方向,也就是 Java 所擅長的應用方向,尤爲是目前的網絡和 HTPP 應用方面,這就須要有良好的標準庫和生態系統支持,而在標準庫方面,Go 已提供了處理 tcp/http/xml/json/ 加解密等更輕量級和優秀的代碼庫,對網絡的核心協議 http 的高併發支持,已經爲它提供了撬動 Java 的敲門磚。程序員

可是咱們必須面對它目前的不足,在其語言重要特性和嚴謹性方面還遠未成熟,還有很多斷層或臨時解決方案,而這也會影響到其生態的成熟度,這些問題還須要在新版本中解決。Go 語言 2012 年 3 月 28 日正式發佈第一個版本,截止目前 1.7 版本發佈,差很少一年兩個大版本發佈,中間還有數個 beta 與 RC 版本發佈,這也基本能說明 Go 語言還未徹底準備好。github

小結算法

Go 已經證實在動態語言須要性能方面,是做爲 Python 和 Ruby 的理想候選者;在應用開發方面,尤爲是 HTTP 相關應用方面,目前已是站在 Java 面前的一位挑戰者,同時在對資源的掌控力不是那麼強烈訴求的地方也是 C/C++ 以外提供另一種角色。shell

在生產力方面,其語言特性和生態系統還未成熟,版本還在快速迭代中,相比動態語言和 Java,並不具備優點,目前階段是這些語言在某些場景下的可選角色。長期看,在 Google 的鼎力支持下,新特性和庫的應用能力還會不斷加入,是一門欣欣向榮的編程語言,但目前階段,建議必須控制好程序的規模和複雜度,語言和生態還未提供健全的支撐,同時還必須留意它的不成熟和版本快速迭代帶來的風險。

二、Java

Java 的成功得益於 10 年前以 Unix 系統爲主的 SUN、IBM、Oracle 等大型公司的強力支持,這讓它在企業應用領域和 WEB 應用方面站穩了腳跟,而隨後的 10 年,前半段是靠 x86+Linux 帶來的革命繼續保持份額,後半段就是 android 的成功讓其在步履蹣跚中止腳步後再一次登頂。這二十年,Java 積累了最強大的生態系統,你能夠說它無所不包, 毋庸置疑,Java 早已經是一艘航空母艦的巨大身軀,這足已證實它的地位與成功。可是其語言、庫、框架和生態系統的複雜度,對技術人員構築其巨大的障礙,好比並發方面,語言的 synchronized 機制,標準庫的 notify 再到 concurrent,也能夠經過 Apache+tomcat 容器來得到 HTTP 等的並,而基於 JVM 技術,Java 又與其它語言具備良好的互操做性,好比並發方面的 Scala,能夠選擇其 Actor 或者也是用 Scala 寫的 Akka,固然業界選擇 nginx 等混搭的場景更多,太多太多…

這就是 Java 的世界,永遠不嫌多,無須要重複造車馬,這是 Java 成功的關鍵所在,歷史沉澱下來的,讓 Java 提供的選項太多,深刻後就知道 Java 的學習成本比 C++ 更高,對程序員的要求比 C++ 更高,除非掉隊了,還在用 7 年甚至 10 年前的 Java 技術,技術人員要很是精心地組織框架和設計,不然各類複用的結果就是堆砌出一個異常臃腫的程序,其運行時對資源的消耗有時候會讓你感到恐懼,而這是太多的基於 Java 所開發的平臺被普遍詬病的關鍵所在,重用是個雙刃劍,須要量體裁衣而不是一鍋端,拿捏的尺度對開發人員要求無疑是最高昂的,除非語言和標準庫提供了最好最直接的選項。

小結

Java 早已證實它的無所不包,近十年基本都是排名最好的語言,積累最強大的生態系統。要澄清下一個誤區:現在 Java 的學習成本和對開發人員的技能要求,已經遠高於 C/C++ 的,也許大多數的開發人員沒法駕馭 Java 這艘航空母艦。若要長期使用 Java,務必跟上 Java 的最新技術,同時在重用方面必定要拿捏好尺度,這會對人員技能提出更高要求,不然及其容易寫出資源佔用和運行時效率讓人感到恐懼的應用。

三、C、C++9八、C++11……

C/C++ 在嵌入式和系統級編程方面,依然佔據着牢固的位置,由於諸如 Java 和 Go 等語言的關鍵發力點顯然在開發效率這一側,參考前面 Go 一章節的論述。

可是在併發、網絡和應用編程等方面,一直處於諱莫如深的黑暗時代,語言自己未提供任何支持,而太單薄的標準庫也毫無此方面的野心,C/C++ 的標準庫的規模恐怕始終沒法比擬 Java 與 Go,由於 C/C++ 不受任何一家大型商業公司控制而徹底是「放養」狀態,標準庫須要獲得大型商業公司持續的投資,這就是爲啥 C++98 的標準庫在 13 年後纔得到一次大的更新。這直接致使 C/C++ 必須封裝各類硬件平臺的系統 API,而在 linux+x86 大面積擊敗 Unix 以前,衆多的 Unix 系統更加重了跨平臺編程的難度,2000 年前出現一個很糟糕的跨平臺的 ACE,還有 windows 平臺上充斥大量宏靜態全局變量的一樣糟糕的 MFC 庫,這些都曾經被程序員當成救命稻草,這些技術顯然很快都被歷史丟棄,這下能夠知道爲啥如此多的人對 C/C++ 諱莫如深感到恐懼。而此時 Java 提供了多線程、網絡和應用開發方面的標準庫和基於 JVM 技術的跨平臺支持,把 Java 推向主流編程語言,也就是 Java 前十年成功的關鍵所在。

對於 C/C++ 程序員,有一個振奮人心的大事件,C++11 發佈,相比 C++98,不管在語言和標準庫上,都是一個極大飛躍,C++ 之父說它是一門新語言,這不爲過,同時如此多的頂尖 C++ 高手對 boost 庫的貢獻(其實已經是實時上的標準庫),在網絡、併發編程和一些基本應用方面,已經提供了性能最優秀的庫,極大地下降了此方面的開發難度。傳統的 C++ 程序員,儘快過渡到 C++11 上,這須要編譯環境的更新,而編譯環境更新又會帶來內存檢測和性能分析方面最強力的工具,C\C++ 曾經最廣受詬病的內存越界與泄露問題,在 gcc5.2 版本和 Intel 最新 CPU 面前,內存飛踩能夠被抓在第一現場,同時Intel提供的 vtune 性能分析工具,是我的目前爲止所遇到的最強大工具。

小結

傳統的 C++ 程序員,儘快過渡到 C++11 上,擁抱新的標準庫和 boost,這會極大提升在嵌入式和系統級編程方面的開發與維護效率。要擁抱全新語言,而語言的重大升級,廣義上看也是一門新語言,也要放到一樣重要位置,更好地發揮已有資產的產效。而在應用開發方面,因爲標準庫方面就不要期望它能夠匹敵目前階段的 Go,更不要說 Java,因此老老實實作好它最擅長的領域。

語言特性

一、併發

Go 在輕量級和簡潔方面具有最大優點:goroutine 和 channel 機制提供語言層面的輕量級和毫無拖泥帶水的併發機制,標準庫也提供了基於此的應用庫;

在併發世界的混合編程方面,Java 提供了最多的選擇項和生態支持:十年前 java.util.concurrent 發佈後就已經把 Java 推向了併發編程高峯,在雲化下,Java 與 Scala 等高併發框架和語言具備良好互操做性;

C++11 相對於 C/C++98,向前邁出了一大步,標準庫和擴展庫 boost 庫已提供了優秀的跨平臺封裝,告別對操做系統 API 的維護,如同 10 年前 Java 的 concurrent 包發佈同樣,極大下降了此語言在併發編程方面的跨平臺的心智負擔,但在線程調度和管理方面,仍是須要本身精心維護;

而對於 C/C++98 來講,僅華爲電信軟件,有依賴 SNE/ENIP、有依賴 ACE、有風格各異的自行跨平臺封裝,尤爲是 10 年前要支持 windows、linux、solaris、aix 等平臺,併發編程的黑暗時代,C/C++ 的開發難度也多半由於其併發和網絡編程,語言和庫未提供支撐,必須白手起家。

小結

 

開發難度 Go < Java < C++11 < C/C98,學習曲線 Go < C++11 < Java < C/C98。可能有人會疑惑爲啥 Java 比 C++11 的併發還難學,是由於 Java 提供的選擇項太多,語言、標準庫和其它語言框架互操做方面,要掌握和拿捏好,學習成本很是高昂,不然寫出來的程序可能很是低效或者不健壯或者複雜。

二、面向對象

Java、C++、Python 均提供了良好的面向對象的語言支持,配合設計模式、類型系統和工具鏈的支持等,Java 和 C++ 具有構建大規模程序所具有的基本要素;Go 語言雖然號稱支持面向對象,但它是經過方法與 interface 等間接模擬,沒法直接清晰地組織對象結構並初始化銷燬它們,與 C 同樣,會充斥大量的全局對象和結構體,管理對象的成本比較高,在構建大規模程序方面,語言能力還比較弱,還須要新的語言特性加入。

三、物理結構組織

物理結構的組織,對於中大規模的程序來講,相比類接口等邏輯結構的表述,具備更相當重要的做用,好比100萬行左右的C++代碼,若是結構組織很差,影響是戰略層面的(邏輯結構組織對於大規模程序影響是戰術層面):一行代碼變動,編譯連接時間可能都是10分鐘以上,甚至數小時,僅僅編譯和重啓耗費的時間可能已擊垮整個開發效率。

包:在代碼組織方面,包的做用無須要在闡述,Java 與 Go 基本上是天生就具有了此語言特性,而 C/C++ 顯然還不具有,C++ 只有比較弱的名字空間來避免名字衝突(更多的是邏輯結構組織),更可能是經過目錄、頭文件/源文件/HPP 文件來組織代碼分類,須要很是精心地處理和設計,不然引入循環和混亂依賴是屢見不鮮,對大規模程序的組織,對人員技能要求更高。

庫:在程序運行方面,Java 支持 jar 包的動態加載,具有良好地擴展和升級能力,而 C/C++ 支持靜態和動態兩種連接方式,但在加載方式方面,基本沒有控制力,未能如 Java 般靈活,Go 編譯後 linux 下基本只依賴 libc 庫,不支持動態連接,只支持靜態連接,最終編譯出一個兼容 gdb 格式的執行程序,在部署方面具備極簡配置,但必須控制程序規模,不然在做業域可能會帶來聯動升級。

小結

Java 在此方面是最優的,而 C++ 必需要謹慎處理,Go 介於二者之間。

四、類型系統和泛型

Java/C++ 均支持強類型的編譯時檢測,提供了編譯時的類型安全,便於發現低級的類型錯誤,同時支持泛型,便於表述通用的算法和容器;Go 語言支持 Python 的動態語法,在處理類型申明定義方面代碼更簡潔,但類型方面稍弱,目前階段還不支持泛型,這爲表述通用的算法和容器方面帶來了極大障礙和類型不安全,須要經過 interface {} 來模擬,如同 C 語言世界的 void *,或者 10 年前沒有泛型的 Java,其對象都繼承自 Object,固然 interface {} 不僅是對象或數據結構類型,Java 的歷史已經證實此路不通,早晚會走到泛型,因此 Go 語言只是目前階段不支持而已,長期看應該是支持的,其發明者也說過,目前還未找到好的支持辦法。

小結

Go 還須要語言層面的新特性加入,相信這也是早晚的,在泛型方面,目前這幾門語言中,C++11 是作得最好的,Java 次之,而 C++98 在處理泛型類型方面經常會遇到晦澀和極難處理的語法錯誤。

五、初始化

初始化對於程序的健壯性、靈活性和可讀性,是相當重要一環,程序沒法在各類複雜場景下良好地對變量賦值,其結果可想而知。

Java 作得比較好,有良好的 gc,面向對象,不支持全局變量,數據成員支持分階段的初始化,未顯示賦值也有明確含義的初值,而類加載過程當中也能夠控制類、jar 包之間的複雜依賴關係。

C 在初始化方面的語言支持是最原始的,貶義點來講就是「最糟糕的」,不支持面向對象,全局變量、自由函數和沒有明確含義的初值帶來了大量程序問題。

C++ 支持得比較好,面向對象,這幾門語言中惟一支持對象的析構和 RAII,在複雜對象和對象協做之間的初始化管理方面具備最強控制力,而 C++11 引入了 auto 與 decltype 等偏動態點的特性,讓 C++ 表現得更好;可是同時兼容 C 語言的糟糕初始化,若是像 C 同樣用 C++,結果與 C 語言同樣,而這可能很廣泛,這也是 C++ 被詬病的地方,這是繼承 C 語言資產帶來的其中一個負面,能夠作得很好,也可能作得很是很是糟糕。

Go 在初始化方面,Go 借鑑了 Python 部分動態語言,在變量、數組、struct、list 和 map 等結構方面,相信看過的都會爲其簡潔點個贊。但目前還須要更多的版本催熟:gc 相比 1.5 以前版本已經有較大提高,目前還不支持構造和析構,而 defer 必定程度上模擬了,但相比 C++ 的 RAII 和 Java 的對象、finally 等機制,還不成熟,很容易引入諸如性能和資源泄漏方面的缺陷;初始化不統一, New、make、{}等各類特定領域的初始化方式,這也是暴露 Go 的語言設計方面還不成熟的一方面,要知道 Java 與 C++、C 只須要一個 new 或者 malloc。

六、錯誤處理

錯誤處理對於複雜邏輯的組織和程序的健壯性,是相當重要的,好比一個簡單的讀文件,C 語言處理須要打開文件,判斷打開結果;讀取數據,判斷讀取數據結果;把數據映射爲對象,判斷每一個參數結果….,就知道錯誤處理是多麼地繁瑣。

健全的編程語言 Java/C++/Python/C# 等無疑都把異常處理放在第一優先位置。惋惜 Go 目前還不支持,而是經過多值返回錯誤碼方式,或者 panic – recover 機制,讓錯誤處理代碼充滿整個邏輯,相比 C 的錯誤返回,有時候可能更糟糕。

七、動態語法

爲啥要把動態語法做爲一個關鍵項呢,相信用過 Python 等的,不考慮其它運行效率因素,無疑會對其簡潔耳目一新,尤爲是在對象初始化和構造方面,而這是程序代碼中可能佔據 10% 甚至 50% 代碼的地方,尤爲對於處理數據、配置和分析的系統。

Go 借鑑了 Python 的部分動態語法,在反射的配合下,相比傳統的 JAVA、C++ 的拙笨,是一個大的提高,固然此方面還須要不斷提高,尤爲字符串和類型兼容方面,斷層還比較多,無疑在作數據處理方面,相對 Java、C++、C,Go 是更好的選擇。

八、其它重要語言特性

運算符重載對於可擴展的類型運算來講,無疑是最優雅的;函數重載對於增量維護開發和支持各類簡便調用來講,也是必不可少的;lambda 已是健全的通用語言 C++11/Java/python/C# 的必選項,lambda 在數據的初始化和控制邏輯表述方面,無疑是一個利器…… Go 語言還不支持這些重要的語法特性,須要後續版本加強。

生態

一、標準庫

Java 的標準庫無疑是最成熟最強大的,提供了拿來即用的高可複用的類和庫,無須要重複造車馬,這是 Java 成功的關鍵所在,但 Java 發展至今,其語言、類庫和框架早已是一艘航空母艦,且圍繞其 JVM 不斷有新技術新庫涌現,要掌握拿捏好的學習成本是最高昂的,許多 Java 程序員其實掉隊了,如同 C++ 同樣,可能還在使用 7 年前甚至 10 年前的 Java 技術,Java 應用領域,必須跟上新技術步伐,同時要很是精心地組織框架和設計,不然各類複用的結果就是堆砌出一個異常臃腫的程序,其運行時對資源的消耗有時候會讓你感到恐懼,而這是一些平臺被普遍詬病的關鍵所在,重用是個雙刃劍,須要量體裁衣而不是一鍋端,拿捏的尺度對開發人員要求無疑是最高昂的。

Go 除了提供雷同 C++11 標準庫和 boost 庫的基礎能力,同時在應用庫方面,尤爲是網絡和 WEB 編程,提供了支持併發的優秀庫,若是對於 C++ 的應用能力薄弱和 java 的龐大感到恐懼,無疑 Go 是須要面對一個好的選擇。

C++11,併發編程等已經歸入到標準庫,同時實時上的標準擴展庫 boost 無疑提供了基本的應用複用能力,C++11 在作跨平臺併發和網絡應用編程方面,徹底可替代傳統的 C/C++98,讓曾經的黑暗年代往前邁出一大步。可是在作 WEB、數據庫和數據分析等企業應用開發方面,C++11 的庫仍是很是地單薄。

二、工具鏈

C/C++/Java 的工具鏈,就不用詳細敘述了,從編輯器、代碼瀏覽跳轉、調試、代碼文檔自動生成、複雜度度量、findbug、內存排查、性能監控等已經很是鑑權,華爲的 CI 環境也提供該了良好支持,就不詳細敘述了。

重點審視 Go 語言,開發環境一般會選擇 Eclipse 或者 LiteIDE,選擇 Eclipse,麻煩就許多,因爲 Great wall 的緣由,不能直接獲取插件:Go 工程須要 GoEclipse、代碼跳轉須要 gocode、代碼調試須要裝 gdb,這些都單獨下載下來,健全點還須要安裝 guru 和 godef,有些須要作編譯,安裝 Eclipse 的 Go 的健全環境,看我的狀況,差很少要 0.5~2 天就能工做了,因此推薦 LiteIDE,它的包裏基本都有,裝上差很少也能用了。可是這些環境只能簡單用,開發工做中會遇到許多重要體驗問題,以下:

  • 編輯閱讀重要體驗欠缺

代碼瀏覽:沒有代碼的對象、函數、變量的全局瀏覽和查找功能,只能一個個文件地打開進去看,這對於大型工程,文件多,文件大,習慣了 Eclipse、source insight 和 .net,沒有瀏覽,會抓狂;代碼搜索和跳轉:不能打印名字,函數類接口等可以自動羅列出來,而先後跳轉功能基本上也不能用,對於大型工程又是個重大致驗丟失; 其它重要體驗:無重構工具、無代碼自動生成工具、編譯錯誤不能隨見隨得……

  • 代碼調試重要體驗欠缺

Windows的調試依賴 gdb,gdb 在 windows 環境不大可靠,因此不要指望它在 windows 環境可以如期工做良好,調試就最好到 linux 環境下,或者寫 print 打印到控制檯,習慣 Windows 環境滋養的,恐怕又要適應下新的非圖形化環境。

  • 動靜態檢測工具欠缺

缺少圈複雜度、codex 套件安全檢查(能夠直接調用 C/C++ 的代碼)、內存檢查(可直接使用指針和調用 C 代碼)。

小結

基本能用,可是一些提升效率的重要體驗喪失,目前階段若是給 Java/C++ 的開發環境打 5 分,Go 的環境,目前只能給 2 分,且 Go 一年差很少 2 個大版本,對開發環境也是個重要的挑戰(Java/C++ 甚至用 5 年甚至 10 年前的環境),公司要作的工做還很是多,且要管控其版本快速迭代帶來的切換衝擊。Google 公司在還未成熟就早早開源的目的之一就是指望業界可以提供更多工具,而工具基本都是開源世界貢獻,而 Android 基於 Java 開發,因此 Google 能直接拿來用,而 Go 做爲一門全新語言,在開發環境方面,Go 目前還未及格。

三、語言流行度和開源項目分析

說到語言,必然會想到 TIOBE、PYPL 和 GitHub 的排名,咱們看看它們的數據:

  • TIOBE 數據

語言的熱度必然得看權威的 TIOBE 世界語言排名, 2016 年 6 月最新數據排行榜:

新語言 Go 的最新排名是 48 位,與 Java 的熱度差距是 100 倍。2 年前的 2014 年 7 月,Go 語言排名 30 位,指數是 0.222%,2015 年 7 月 Go 未排入前 50,2016 年最近 5 月排名分別是:50+、3八、4八、44 和 42。

近三十年語言熱度排行榜:

  •  PYPL 的最新數據

  • GITHUB 的數據

開源社區,挑選最具表明的 github 上的開源語言排名:

點評

主流編程語言始終具備強大的生命力,Java、C、C++、C#、Python、JavaScript、PHP 從近十年數據看,都未離開過前十名,其它語言扮演的是在某些狀況下的一種可選角色,注意不是替代這些主流語言,由於目前還未見它們衰落的跡象。

Java 近十年始終是王者;C/C++ 地位也始終穩固,在嵌入式、系統級編程方面始終佔據統治地位,在動態語言方面;Python 的簡潔和生態讓它佔據着膠水語言的角色,固然也有用它來寫不那麼苛求性能的服務端程序;而網站,PHP 和 JS 就不用多說了,70% 的網站依然是用 PHP 寫的。

Go 2009 年正式版本離發佈還有兩年就掀起了一陣子熱潮,正如 Go 語言的之父所說,創造了另一種角色,在 Python/Ruby 須要性能時的一種可選角色;而相對於 Java,它創造了更輕量級更高效率的一種角色,爲撬動史前巨獸 Java 提供了敲門磚,可是語言、標準庫和工具鏈的成熟度牽扯到關鍵的生產力,這方面它還未準備,而在性能方面,做爲新語言,它的調度器也未準備好,還有諸多性能陷阱,看另一篇文章單獨論述。

四、行業應用

對於 Java、C、C++,前面已有說明,在生產力方面,Java 已經無所不包的航空母艦了,而在苛求性能方面,C/C++ 依然佔據着牢固的地位。對於 Go,的確已經證實了它在須要性能時是 Python 與 Ruby 這些腳本語言的一個選項,而這些動態語言腳本基本應用在管理域:環境資源應用的監控和部署等,也有些把它們拿來作服務端開發,而在苛求性能時,這些語言的確就不擅長了;在 Java/C/C++ 所擅長的領域,成功的應用太多太多,Go 在某些場景下,好比數據分析或 HTTP 應用方面,它是一種可選的角色,而在通用和複雜應用業務域,不管語言、生態和成熟度,都未準備好。Go 要作的工做還不少,還須要更多地迭代。

其它業界主流語言簡要

Python/JavaScript/C# 近十年,也是最流行的語言之一,與 Java/C/C++/PHP 語言同樣在各自領域獨領風騷,而這些語言在部門也或多或少有應用,但因爲非業務模塊,重視度沒那麼高,其實頁面、工具和管理域,涉及到重要體驗問題,仍是須要引發足夠重視,不然積累的代碼多了,可維護性和體驗都會帶來愈來愈大的負擔。

一、Shell/Python

歷史遺產及其慣性,安裝、部署、升級和監視管理任務等方面,基本還在使用 c shell 或 b shell 腳本,shell 的語法深晦,可讀性極差,同時編輯調試環境都是最原始的,開發和維護效率基本都是最低的,而這些非業務部件,平時都是三無論的,積累的代碼也很多,要專人熟悉 shell 的維護。而 Python 在處理字符串、容器和環境方面,是本文所列的語言中,最簡潔生產力最高的語言。

建議做業域的腳本儘可能用 Python,在管理域,膠水語言的名號無出其右,而 Python 基本也是排行榜前五的語言。

二、JavaScript/Typescript

JavaScript 能夠說是最流行的網頁腳本語言了,但它的設計有兩個一直被詬病的缺陷,一是太簡單;二是弱類型,語法錯誤到運行時纔會發現,應該沒人沒遇到過網頁不知爲啥跳出一個警告框的狀況吧。當 JS 代碼超過萬行時,它的簡單語法和弱類型會給維護人員帶來巨大的負擔,我的只寫過幾百行的 JS 頁面,對弱類型基本沒法忍受,之前也下載過新浪這樣的複雜門戶網站看 JS 代碼,說實話,深刻不下去,直接放棄。Typescript 出現,恰好是爲了解決 JavaScript 這兩個設計缺陷。

對於 Typescript,或許習慣 JavaScript 會拒絕它的面向對象等加強表達力的語言特性,以爲是讓簡單變複雜。但另一個特性,也就是免費爲 JavaScript 增長編譯時的類型檢查,相信沒有人會拒絕這樣的特性,就跟寫文章指出錯誤的作法。因此寫 JS 頁面的,仍是切換到 TS 這個超集。

三、C#

C# 在華爲就更小衆了,但它也是最流行的語言之一,而真真能挑戰 Java 地位就是 C#,惋惜微軟把它禁錮在 windows 系統,也限制了世界最頂尖的語言和編譯器專家丹麥人 Anders Hejlsberg 的影響力,C# 目前正在逐步走向開源,同時它依附於目前最強大的集成環境 .net 也在走向開源。

(稿源:華爲開發者社區

http://www.oschina.net/news/78737/go-java-c

相關文章
相關標籤/搜索