'哪種編程語言好?大神為你分析 Go、Java、C、C++ 等主流編程語言'

"
"
哪種編程語言好?大神為你分析 Go、Java、C、C++ 等主流編程語言

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

把這些寫出來,期望得到大家的指正與反饋,讓整個分析更客觀,性能方面,著重對 Go 做深入剖析參考。內容很多,期望不會讓你望而卻步。

語言整體概要

1、Go

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

這也是為啥 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 的主張更多考慮的是最小化程序員的工作量。

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

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

小結

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

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

2、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 的最新技術,同時在重用方面一定要拿捏好尺度,這會對人員技能提出更高要求,否則及其容易寫出資源佔用和運行時效率讓人感到恐懼的應用。

3、C、C++98、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,所以老老實實做好它最擅長的領域。

Java、Python、GO語言學習資料獲取方式:轉發+私信【資料】免費領取

"
哪種編程語言好?大神為你分析 Go、Java、C、C++ 等主流編程語言

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

把這些寫出來,期望得到大家的指正與反饋,讓整個分析更客觀,性能方面,著重對 Go 做深入剖析參考。內容很多,期望不會讓你望而卻步。

語言整體概要

1、Go

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

這也是為啥 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 的主張更多考慮的是最小化程序員的工作量。

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

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

小結

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

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

2、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 的最新技術,同時在重用方面一定要拿捏好尺度,這會對人員技能提出更高要求,否則及其容易寫出資源佔用和運行時效率讓人感到恐懼的應用。

3、C、C++98、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,所以老老實實做好它最擅長的領域。

Java、Python、GO語言學習資料獲取方式:轉發+私信【資料】免費領取

哪種編程語言好?大神為你分析 Go、Java、C、C++ 等主流編程語言
"

相關推薦

推薦中...