本文目錄一覽:
- 1、java,python,go可以同時學嗎
- 2、2022 年將成為主導的頂級編程語言
- 3、【golang詳解】go語言GMP(GPM)原理和調度
- 4、golang 和Python 那個好
- 5、golang VS python性能誰更強???
- 6、寫小程序,什麼語言跨平台兼容和性能較好?golang
java,python,go可以同時學嗎
每種語言都有自己的側重點,如果可以的話建議題主還是分開學,循序漸進,如果學習同時學習三種語言,容易記混不說,反而容易導致學習進度停滯不前。
知了姐就來跟大家詳細說說java,python,go三種語言之間的區別,僅供題主參考~
01 Python
難度:★
歡迎度:★★★★☆
創始於:1991年
**學完之後可以幹什麼:**web開發、應用開發、大數據、數據挖掘、科學計算、機器學習、人工智能、運維、自然語言處理等等等。
Python的優點:
• 易於學習:就像論壇里有些人說的,做了幾年Java或者是C++的,幾天就可以寫Python了。但是這個不是什麼壞事,入門來說,從簡入難,或者從難入簡,都是很好的選擇。
• 庫:庫都是免費的,並且有很多庫和函數把編程變得相對容易很多。
• 物聯網:Python也許是會成為物聯網當中最受歡迎的語言,我們都知道樹莓派這樣的新平台都是基於Python開發的。
Python的缺點:
速度:開發速度是快,比如java100行代碼python20行就搞定了。但是作為解釋型的語言來說,比編譯型語言的速度慢很多。
• 移動端:Python在移動計算方面是弱的,很少有智能機的應用是Python開發的
• 設計:python是動態型的語言,需要更多的測試以及錯誤僅僅是在運行的時候展示的。
02 JAVA
難度:★ ★ ★
歡迎度:★ ★ ★ ★ ★
創始於:1995年
Java可以做什麼:**安卓和IOS的應用開發、視頻遊戲開發、桌面GUI、軟件開發等等;
Java是老牌語言,但是由於市場上相關開發人才較多,競爭激烈,薪資趨於平穩。
Java的優點:
• Java開發人員需求量大:這個是根據統計得出的。JAVA在很多語言當中,是需求量最大的;
• 進化語言:首先C++是基於C語言優化的,Java是被優化過來的。而且在這人平台是增加了很多的功能,lambda等功能
• 安卓應用開發:谷歌的安卓移動平台是世界第一的移動平台,編寫安卓應用開發者使用的主要語言是Java;
Java的缺點:
• 使用大量的內存:Java和C++相比使用更多的內存所以佔用的內存就更大
• 學習曲線:這邊指的是Java雖然不是最簡單的入門語言,但是也不是最難
• 啟動時間慢:用java寫過安卓的應用的人應該都知道。同樣的代碼在模擬器中啟動是非常緩慢的事情。
03 GO語言
難度:★
歡迎度:★★★★☆
創始於:2007年
go語言的難度,相對來說,GO語言不難的。
可是GO語言的學習資料相對其他的語言來說很少,所以學習起來沒有其他的語言那麼便利;
很多人說GO語言在國內更火,按照數據來說,是的。因為中國人多,基數大。其實GO在國外更火。對於現在來說,GO實際上也已經站穩腳跟了。不管是Google自帶光環也好,實際應用也好。go算是找到了屬於自己的空間。
golang相對其他語言來說,招聘職位還是較少。
GO語言的優點:
• 編譯時間快:GO語言編寫最大的微服務的時間大概需要6秒,相對Java和C++獃滯的編譯速度來說,GO語言快速編譯是主要的效率優勢。
• 並發性和通道:GO語言的logo大家可以了解一下,它就是致力於事情簡單化,也就是快。其實並沒有引入很多的新的概念。就是打造一門簡單的語言,使用起來很快。在goroutine上運行一個函數最小的樣板代碼,我們只需要使用關鍵詞go添加函數調用:
• 生態系統也是很強大的:面向Redis、RabbitMQ、Template等等很多穩定的庫。有很強大的工具支持。
GO語言的缺點:
• 缺少框架:GO是沒有一個主要的框架。但是很多人認為不應該從框架的使用開始。也可以從社區的討論了解一下這個問題。
• 錯誤處理:在錯誤處理方式,很容易丟失錯誤發生範圍,所以在編程過程中很難向用戶提供出有意義的錯誤信息。
• 軟件包管理:在默認的情況下,沒有辦法制定特定版本的依賴庫,也沒有辦法創建可以複寫的builds。
前期,咱們可以熟練掌握一門語言先找到合適的工作,拿到滿意的薪水,穩定之後咱們逐漸就可以學習更多的語言,豐富技能~
2022 年將成為主導的頂級編程語言
編程語言是程序員(開發人員)用來與計算機進行通信的計算機語言。它是用任何特定語言(C、C++、Java、Python)編寫的一組指令,用於執行特定任務。編程語言主要用於開發桌面應用程序、網站和移動應用程序。以下是 2022 年最流行的頂級語言。
Python
Python 是由 Guido van Rossum 於 1980 年代後期在荷蘭構建的。Python 最初是作為 Java 在行業中的競爭對手而構建的,後來逐漸流行起來。目前,Python 在研究人員和開發人員社區中都非常受歡迎。Python 在 IEEE Spectrum 的語言排名中名列前茅,得分為滿分 100。此外,Python 也很受尊重,支持率高達 44.1%。
Python 幾乎適用於任何事物。Django 和 Flask 可用於 Web 開發,而 Jupyter 和 Spyder 等科學工具則用於分析和研究目的。如果您喜歡自動化,Selenium 可以幫助您!該語言的靈活性使 Python 幾乎可以在任何地方使用。到目前為止,這些是 Python 中比較流行的產品。Python 的巨大支持基礎(僅次於 JavaScript)產生了大量使用該語言的包、框架,甚至是成熟的開源軟件。
總的來說,Python 可能對數據科學和機器學習有最大的支持。雖然還有其他語言(如 R 和 MATLAB)提供競爭,但 Python 是數據科學領域的嚴格統治者。機器學習中使用的大多數框架和庫都僅用 Python 編寫,如果想要學習機器學習(或一般的數據科學),它可能是最好的語言。
JavaScript
JavaScript 在這一點上幾乎是行業領導者。JavaScript 最初於 1994 年作為 Netscape Navigator(當時最好的瀏覽器之一)的腳本語言而構建,它迅速崛起。直到 2008 年,Google 才在為 Google Chrome 構建 V8 引擎時設計了現代 JavaScript。最初由 Netscape 構建為 Java 的競爭對手,JavaScript 現在在開發領域擁有自己的空間。JavaScript 因其流行而被廣泛認為是“互聯網語言”。JavaScript 在開發者社區中的支持率最高——高達 67.7%。一般來說,JavaScript 適用於任何類型的開發活動,如移動應用程序開發、Web 開發、桌面應用程序開發等。
JavaScript 有各種各樣的庫和框架,可以在開發過程中使用。有用於前端開發的 Angular、Vue 和 React,而 Node.js 是一種用於後端開發的非常靈活的語言。Jest 和 Mocha 是兩個靈活的工具,可幫助設置單元測試以檢查功能是否按預期工作。當然,如果您對其中任何一個都不太滿意,您可以在前端使用普通的 HTML、CSS 和 JavaScript——就這麼簡單!由於來自世界各地開發人員的巨大支持,JavaScript 擁有任何語言都可以誇耀的最多數量的支持包。儘管如此,人們繼續構建越來越多的包,以增加使用該語言的便利性。
Java
Java 由 James Gosling、Mike Sheridan 和 Patrick Naughton 於 1991 年構建為“Oak”語言,是第一種在全球產生重大影響的語言。雖然新的編程語言使用與 C/C++ 相同的格式,但它融入了某些新思想,使其對更多人更具吸引力。Java 運行的原則是“一次編寫,隨處運行”——這意味着具有不同硬件和操作系統配置的系統可以輕鬆運行 Java 程序。
Java 也有各種各樣的庫和框架,它們在底層使用 Java。Java 用於通過 Spring 和 Hibernate 進行應用程序開發。JUnit 幫助我們為 Java 項目設置單元測試。最重要的是,Java 被用於開發原生 Android 應用程序(Android SDK 本身由 Java 開發工具包或 JDK 提供支持)。Java 可能是大多數人在大學或學校的計算機編程入門課程中被介紹的語言。Java 是用於向大眾教授面向對象編程的語言。
Java 在分析和研究領域也備受推崇。Java 唯一的問題是目前該語言的支持包和項目很少。很少有社區參與——這是大多數主流語言都有的。儘管如此,Java 是一種非常容易掌握和學習的語言——這在一定程度上解釋了該語言的吸引力。但是,要掌握某種形式的語言確實需要一些時間。
C++
也許人們在本文中可以期待的最令人震驚的答案之一是 C++。儘管是大多數人用來學習數據結構和算法概念的語言,但該語言本身在實際世界中卻很少使用。C++ 最初由 Bjarne Stroustrup 於 1982 年創建,作為 C 編程語言的擴展,在接下來的幾年中繼續聲名鵲起。
C++ 可用於分析、研究以及 遊戲 內開發。流行的 遊戲 開發引擎——虛幻引擎——使用 C++ 作為腳本語言,用於構建 遊戲 時可以定義的所有功能。C++ 在軟件開發中也有廣泛的用途。介於面向對象方法和面向方法方法之間,C++ 可以靈活地使用它生成的軟件的性質。在 TIOBE 指數中排名第 4 意味着 C++ 至今仍具有吸引力。C++也廣泛用於系統軟件開發,比其他語言更容易理解。在操作系統等敏感領域使用 C++ 的主要原因是 C++ 程序的編譯時間非常短。
C++ 可能擁有所有語言中最大的學習社區。大多數學生會開始他們的算法課程,用 C++ 構建樹、鏈表、堆棧、隊列和許多其他數據結構。當然,只要注意細節,它就很容易上手和學習,也很容易掌握。
Typescript
TypeScript 是 JavaScript 的超集,具有與 JavaScript 幾乎相同的應用程序。TypeScript 可用於 Web 開發、移動應用程序開發、桌面應用程序開發等。在 StackOverflow 的最受歡迎語言列表中,TypeScript 是第二受歡迎的語言,受到 67.1% 的開發人員的喜愛(僅次於 Rust)。
TypeScript 主要是一種用於開發的語言,因此它對科學界沒有太大吸引力。但是,由於 TypeScript 的新功能,可以預期它可能會激發更大程度的研究興趣。該語言的技能上限比 JavaScript 低得多——並且 JavaScript 的許多“難以理解”的行為已在 TypeScript 中得到簡化。換句話說,您將頭撞到牆上的機會略小。
Golang
新語言正在迅速崛起,新的競爭者即將挑戰 JavaScript 和 Python 擁有的寶座。由谷歌(兩者的名字中都有“Go”!)主要是為了推進函數式編程的事業,Golang 在短時間內建立了大量的追隨者。Golang 已經成為 StackOverflow 第五大最適合學習的語言,受到 62.3% 的開發人員的喜愛。
Golang 用於多個領域,用於開發強大的軟件以及用於 Web 和移動應用程序的後端。目前,Golang 甚至支持一些基本的 Web 開發。雖然它仍處於取代 JavaScript 作為網絡語言的階段,但它正在迅速成為支持下一階段網絡的語言。
Golang 比此列表中的其他語言更難學習。此外,Golang 是一種開源語言,每次重大更新都會頻繁更改,因此保持更新是必要的。
Dart
Dart 是工業領域發展最快的語言之一。谷歌在語言領域的貢獻顯着增加,以與微軟的 TypeScript 日益流行的競爭相抗衡。Dart 因其簡單性而受到世界各地程序員的高度喜愛。
Dart 用於多平台應用程序開發。與 JavaScript 一樣,Dart 用於構建任何人都可以使用電子設備運行的軟件。目前 Dart 最著名的用途是 Flutter 框架,Flutter 是一種用於移動應用程序開發的語言。最近的谷歌趨勢表明,Flutter 儘管是一個較新的框架,但比 React Native 更受歡迎,後者是業界已經建立的移動應用程序開發框架。
Dart 比 JavaScript 更容易學習,並且能夠很好地簡化甚至難以理解的案例。隨着市場上的 TypeScript 和 Dart 的出現,程序員在選擇一種他們真正想要學習的語言時會面臨多種選擇。
【golang詳解】go語言GMP(GPM)原理和調度
Goroutine調度是一個很複雜的機制,下面嘗試用簡單的語言描述一下Goroutine調度機制,想要對其有更深入的了解可以去研讀一下源碼。
首先介紹一下GMP什麼意思:
G ———– goroutine: 即Go協程,每個go關鍵字都會創建一個協程。
M ———- thread內核級線程,所有的G都要放在M上才能運行。
P ———– processor處理器,調度G到M上,其維護了一個隊列,存儲了所有需要它來調度的G。
Goroutine 調度器P和 OS 調度器是通過 M 結合起來的,每個 M 都代表了 1 個內核線程,OS 調度器負責把內核線程分配到 CPU 的核上執行
模型圖:
避免頻繁的創建、銷毀線程,而是對線程的復用。
1)work stealing機制
當本線程無可運行的G時,嘗試從其他線程綁定的P偷取G,而不是銷毀線程。
2)hand off機制
當本線程M0因為G0進行系統調用阻塞時,線程釋放綁定的P,把P轉移給其他空閑的線程執行。進而某個空閑的M1獲取P,繼續執行P隊列中剩下的G。而M0由於陷入系統調用而進被阻塞,M1接替M0的工作,只要P不空閑,就可以保證充分利用CPU。M1的來源有可能是M的緩存池,也可能是新建的。當G0系統調用結束後,根據M0是否能獲取到P,將會將G0做不同的處理:
如果有空閑的P,則獲取一個P,繼續執行G0。
如果沒有空閑的P,則將G0放入全局隊列,等待被其他的P調度。然後M0將進入緩存池睡眠。
如下圖
GOMAXPROCS設置P的數量,最多有GOMAXPROCS個線程分布在多個CPU上同時運行
在Go中一個goroutine最多佔用CPU 10ms,防止其他goroutine被餓死。
具體可以去看另一篇文章
【Golang詳解】go語言調度機制 搶佔式調度
當創建一個新的G之後優先加入本地隊列,如果本地隊列滿了,會將本地隊列的G移動到全局隊列裡面,當M執行work stealing從其他P偷不到G時,它可以從全局G隊列獲取G。
協程經歷過程
我們創建一個協程 go func()經歷過程如下圖:
說明:
這裡有兩個存儲G的隊列,一個是局部調度器P的本地隊列、一個是全局G隊列。新創建的G會先保存在P的本地隊列中,如果P的本地隊列已經滿了就會保存在全局的隊列中;處理器本地隊列是一個使用數組構成的環形鏈表,它最多可以存儲 256 個待執行任務。
G只能運行在M中,一個M必須持有一個P,M與P是1:1的關係。M會從P的本地隊列彈出一個可執行狀態的G來執行,如果P的本地隊列為空,就會想其他的MP組合偷取一個可執行的G來執行;
一個M調度G執行的過程是一個循環機制;會一直從本地隊列或全局隊列中獲取G
上面說到P的個數默認等於CPU核數,每個M必須持有一個P才可以執行G,一般情況下M的個數會略大於P的個數,這多出來的M將會在G產生系統調用時發揮作用。類似線程池,Go也提供一個M的池子,需要時從池子中獲取,用完放回池子,不夠用時就再創建一個。
work-stealing調度算法:當M執行完了當前P的本地隊列隊列里的所有G後,P也不會就這麼在那躺屍啥都不幹,它會先嘗試從全局隊列隊列尋找G來執行,如果全局隊列為空,它會隨機挑選另外一個P,從它的隊列里中拿走一半的G到自己的隊列中執行。
如果一切正常,調度器會以上述的那種方式順暢地運行,但這個世界沒這麼美好,總有意外發生,以下分析goroutine在兩種例外情況下的行為。
Go runtime會在下面的goroutine被阻塞的情況下運行另外一個goroutine:
用戶態阻塞/喚醒
當goroutine因為channel操作或者network I/O而阻塞時(實際上golang已經用netpoller實現了goroutine網絡I/O阻塞不會導致M被阻塞,僅阻塞G,這裡僅僅是舉個栗子),對應的G會被放置到某個wait隊列(如channel的waitq),該G的狀態由_Gruning變為_Gwaitting,而M會跳過該G嘗試獲取並執行下一個G,如果此時沒有可運行的G供M運行,那麼M將解綁P,並進入sleep狀態;當阻塞的G被另一端的G2喚醒時(比如channel的可讀/寫通知),G被標記為,嘗試加入G2所在P的runnext(runnext是線程下一個需要執行的 Goroutine。), 然後再是P的本地隊列和全局隊列。
系統調用阻塞
當M執行某一個G時候如果發生了阻塞操作,M會阻塞,如果當前有一些G在執行,調度器會把這個線程M從P中摘除,然後再創建一個新的操作系統的線程(如果有空閑的線程可用就復用空閑線程)來服務於這個P。當M系統調用結束時候,這個G會嘗試獲取一個空閑的P執行,並放入到這個P的本地隊列。如果獲取不到P,那麼這個線程M變成休眠狀態, 加入到空閑線程中,然後這個G會被放入全局隊列中。
隊列輪轉
可見每個P維護着一個包含G的隊列,不考慮G進入系統調用或IO操作的情況下,P周期性的將G調度到M中執行,執行一小段時間,將上下文保存下來,然後將G放到隊列尾部,然後從隊列中重新取出一個G進行調度。
除了每個P維護的G隊列以外,還有一個全局的隊列,每個P會周期性地查看全局隊列中是否有G待運行並將其調度到M中執行,全局隊列中G的來源,主要有從系統調用中恢復的G。之所以P會周期性地查看全局隊列,也是為了防止全局隊列中的G被餓死。
除了每個P維護的G隊列以外,還有一個全局的隊列,每個P會周期性地查看全局隊列中是否有G待運行並將其調度到M中執行,全局隊列中G的來源,主要有從系統調用中恢復的G。之所以P會周期性地查看全局隊列,也是為了防止全局隊列中的G被餓死。
M0
M0是啟動程序後的編號為0的主線程,這個M對應的實例會在全局變量rutime.m0中,不需要在heap上分配,M0負責執行初始化操作和啟動第一個G,在之後M0就和其他的M一樣了
G0
G0是每次啟動一個M都會第一個創建的goroutine,G0僅用於負責調度G,G0不指向任何可執行的函數,每個M都會有一個自己的G0,在調度或系統調用時會使用G0的棧空間,全局變量的G0是M0的G0
一個G由於調度被中斷,此後如何恢復?
中斷的時候將寄存器里的棧信息,保存到自己的G對象裡面。當再次輪到自己執行時,將自己保存的棧信息複製到寄存器裡面,這樣就接着上次之後運行了。
我這裡只是根據自己的理解進行了簡單的介紹,想要詳細了解有關GMP的底層原理可以去看Go調度器 G-P-M 模型的設計者的文檔或直接看源碼
參考: ()
()
golang 和Python 那個好
沒有絕對好的和絕對壞的,而是使用的時候,充分利用他們的優點即可
Go對比Python的優點如下:
一、部署簡單。 Go 編譯生成的是一個靜態可執行文件,除了 glibc 外沒有其他外部依賴。這讓部署變得異常方便:目標機器上只需要一個基礎的系統和必要的管理、監控工具,完全不需要操心應用所需的各種包、庫的依賴關係,大大減輕了維護的負擔。這和 Python 有着巨大的區別。由於歷史的原因, Python 的部署工具生態相當混亂,比如 setuptools, distutils, pip, buildout 的不同適用場合以及兼容性問題。官方 PyPI 源又經常出問題,需要搭建私有鏡像,而維護這個鏡像又要花費不少時間和精力。
二、並發性好。 Goroutine 和 channel 使得編寫高並發的服務端軟件變得相當容易,很多情況下完全不需要考慮鎖機制以及由此帶來的各種問題。單個 Go 應用也能有效的利用多個 CPU 核,並行執行的性能好。這和 Python 也是天壤之比。多線程和多進程的服務端程序編寫起來並不簡單,而且由於全局鎖 GIL 的原因,多線程的 Python 程序並不能有效利用多核,只能用多進程的方式部署;如果用標準庫里的 multiprocessing 包又會對監控和管理造成不少的挑戰(我們用的 supervisor 管理進程,對 fork 支持不好)。部署 Python 應用的時候通常是每個 CPU 核部署一個應用,這會造成不少資源的浪費,比如假設某個 Python 應用啟動後需要佔用 100MB 內存,而服務器有 32 個 CPU 核,那麼留一個核給系統、運行 31 個應用副本就要浪費 3GB 的內存資源。
三、良好的語言設計。從學術的角度講 Go 語言其實非常平庸,不支持許多高級的語言特性;但從工程的角度講, Go 的設計是非常優秀的:規範足夠簡單靈活,有其他語言基礎的程序員都能迅速上手。更重要的是 Go 自帶完善的工具鏈,大大提高了團隊協作的一致性。比如 gofmt 自動排版 Go 代碼,很大程度上杜絕了不同人寫的代碼排版風格不一致的問題。把編輯器配置成在編輯存檔的時候自動運行 gofmt ,這樣在編寫代碼的時候可以隨意擺放位置,存檔的時候自動變成正確排版的代碼。此外還有 gofix, govet 等非常有用的工具。
四、執行性能好。雖然不如 C 和 Java ,但通常比原生 Python 應用還是高一個數量級的,適合編寫一些瓶頸業務。內存佔用也非常省。
golang VS python性能誰更強???
Go語言
Go是Google的Robert Griesemer,Rob Pike及Ken Thompson開發的一種靜態強類型、編譯型語言。Go語言語法與C相近,但功能上有:內存安全、垃圾回收、結構形態及CSP-style並發計算。
Go的語法接近C語言,但對於變量的聲明有所不同。Go支持垃圾回收功能。Go的並行模型是以東尼·霍爾的通信順序進程為基礎,採取類似模型的其他語言包括Occam和Limbo,但它也具有Pi運算的特徵,比如通道傳輸。
Python
Python是一種廣泛使用的具有動態語義的解釋型、面向對象的高級編程語言。
Python是一種面向對象的高級編程語言,具有集成的動態語義,主要用於Web和應用程序開發。它在快速應用程序開發領域極具吸引力,因為它提供動態類型和動態綁定選項。
Python是一種解釋型語言,這意味着用Python編寫的程序不需要事先編譯就可以運行,從而可以輕鬆地測試小段代碼並使用Python編寫的代碼更容易在平台之間移動。
Go語言和Python的區別:
①語法:Python的語法使用縮進來指示代碼塊,Go的語言基於打開和關閉括號。
②範例:Python是一種基於面向對象編程的多範式,命令式和函數式編程語言。它堅持這樣一種觀點,即如果一種語言在某些情境中表現出某種特定的方式,理想情況下它應該在所有情境中都有相似的作用。但是,它又不是純粹的OOP語言,它不支持強封裝,這是OOP的主要原則之一。Go是一種基於並發編程範式的過程編程語言,它與C具有表面相似性,實際上,Go更像是C的更新版本。
③並發:Python沒有提供內置的並發機制,而Go沒有內置的並發機制。
④類型化:Python是動態類型語言,而Go是一種靜態類型語言,它實際上有助於在編譯時捕獲錯誤,這可以進一步減少生產後期的嚴重錯誤。
⑤安全性:Python是一種強類型語言,它是經過編譯的,因此增加了一層安全性。Go具有分配給每個變量的類型,因此,它提供了安全性。但是,如果發生任何錯誤,用戶需要自己運行整個代碼。
⑥管理內存:Go允許程序員在很大程度上管理內存。而Python中的內存管理完全自動化並由Python VM管理;它不允許程序員對內存管理負責。
⑦庫:與Go相比,Python提供的庫數量要大得多。然而,Go仍然是新的,並且還沒有取得很大進展。
⑧速度:Go的速度遠遠超過Python。
寫小程序,什麼語言跨平台兼容和性能較好?golang
我最早使用的語言是Java和Python, 並且一直都對Python充滿好感, 我喜歡這種很樸實和高效率的感覺, 但我卻最後沒有採用Python,原因其實也很簡單, 我就是不喜歡縮進語法, 就跟很多人換工作僅僅是為了屏幕更大一點一樣, 另外就是有了同樣很棒的可選方案, 這就是Ruby, 所以我最終採用了Ruby作為主力編程語言, 同樣也為不能使用Python而有一點小遺憾,畢竟Python的健壯性比Ruby好很多,只不過Ruby也一直在進步, 所以這一點無傷大雅
我們都知道,無論是Python還是Ruby,甚至Java, 都是在解決業務層的問題, 屬於應用型語言, 以解決業務邏輯為主, 但還有一個領域是系統領域,偏網絡層和底層操作,在這一塊我一直在尋找一種優雅的方案, C++被我首先給淘汰掉了, C的開發效率太低, Java倒是比較合適, 就是太臃腫,而且缺少系統編程的基因,畢竟它是企業級開發出身的
最後我選擇了Erlang, 因為它在網絡層方面表現優秀, 同時容錯性和健壯性都很不錯, 它的虛擬機是唯一可以跟JVM媲美的, 而且還有OTP的超重量級武器, 幾乎可以是通殺網絡層應用, 但根據我的總結它有一個硬傷和一個軟肋,這一點後面展開,可以說選擇Erlang是我目前所知道的方案裡面是最優的
直到有一天我了解了Golang, 我知道Golang其實也蠻早的, 大概08年的時候就知道Google在搞一門奇怪的語言, 之後的幾年,一直有不少以老莫為代表的人在嘀咕Golang, 其實我一直沒太關注,我從ROR中吸取的經驗是,成熟度對於商用很重要, 後來基於Golang開發的產品越來越多,讓我不得不去研究一下, 這我才知道, 這就是我夢想中的Python, 效率和性能達到了最佳的平衡,對Go了解越多, 就越不願意用Erlang寫代碼,主要原因:
1、Erlang的硬傷在於代碼的可讀性、表現力, 讓我來舉個小例子, 比如你為你的系統軟件構建一個RESTFUL的接口,我們大致了解一下代碼風格,先不說Erlang, 無論是你c/c++/python/ruby/java 出身, 對Go是不是有種很久違的感覺, 為什麼說是硬傷? 因為對一門語言來說,語法是不大可能會大幅度變更的, 而且不會出現大的變化, 我不知道有沒有人讀過《松本行弘的編程世界》,裡面闡述的道理很明白, 真正好的編程方式是人去主宰計算機而不是計算機主宰人, 我感覺Erlang就有點主宰我的編程思維的感覺(我的視力本身就不好,它還在不斷的扼殺我的眼睛!), 編程首先是門邏輯學,其次是工程學,最後才是數學, 又讓我想起吳軍的《數學之美》所說的, 人工智能上個世紀一直在走彎路, 期望機器的高度圖靈完備, 而忽視人類本身已有的文明,統計歸納的應用
2、Erlang的軟肋在於高質量的庫少,儘管有不少殺手級應用, 同樣Go在這方面也是軟肋, 這一點對於一個不到五年的語言有情可原, 但對於一個20多年的語言是不是有點說不過去, 比如你用json解析庫,很多人都是從mochiweb這個基本不更新的庫中去抽取, 而我認為對於類似json這種東西可以考慮融入到語言標準庫中, 因為未來的商業軟件的api化趨勢越來越明顯,說的難聽點 , 一個倚老賣老一個與時俱進,反正我對Golang的庫一點也不擔心, 目前的成績易經非常棒了, 遠遠優於Ruby/Python的前五年, 可參見已有的高質量的庫列表
3、Erlang不合群, 這主要體現在跟其他語言的交互性上, 當然這也有深層次的原因, Erlang本身有自己的哲學, 如出錯恢復機制, 你融入一個其他語言的東西進去, 這帳就不好算,就好比你硬要讓一個喝咖啡的跟一個吃大蒜的坐在一起, 總之你寫一個Erlang的port遠遠比Go複雜, 甚至比Python/Java還要複雜, 這就造成了Erlang在底層編程上效果不是很好, 沒法利用linux已有的很多優秀成果,我一直認為Erlang的什麼的mysql/pg/oracle驅動都沒有必要存在, Erlang一定是一個self-container應用, 你只要用到了其他東西, 根據木桶理論, 你就不敢號稱9個9,以系統的眼光看問題, 我覺得一個系統的魯棒性不能依賴於某一組件, 這也是為什麼愛立信本身的Erlang應用並不廣泛
4、說說數據類型吧, 我不止聽到1個人說Erlang對字符串的處理不有好, 它把string當做list來處理,其實本質上是該這麼,但,還是那句話, 違背了面向人的哲學, 應該做一些DSL, 比如Golang裡面的 := 就是一個糖衣, 等價於 var xx yyy = zzzz, 大大方便的程序員少敲不少字符, Golang裡面對字符轉可以說基本和python差不多, slice map函數很強大, 支持lambda條件,雖然Erlang的基本類型很少, 但有很多構造, 所謂構造等價於Golang裡面複雜的struct, 也奇怪了,我就是感覺Erlang構造傷眼睛好嗎?可能是各種括號的比對的原因吧, 而且我認為這是不必要的, 顯然Erlang缺少DSL的基因, 當然跟Erlang出身的年代有關, 我不誇張的說, 自打用Erlang以後我的視力又下降了100度左右, 我不是很喜歡lisp所說的符號也是一種語法, 可能這又跟函數式編程有關吧:形式推導遠大於邏輯演繹
5、其實我最不關注的是性能問題, 因為隨着摩爾定律, 單位計算單元的性價比會無限高,但Golang既然提出它的性能逼近C, 那我還是提一下吧, 當然, Erlang也還可以, 雖然比Java慢, 但跟Python一個檔次吧
6、再談談報錯機制, 因為Erlang的的報錯信息太讓人糾結了, 起初以為我不會看出錯信息, 後來也使用了Sasl, 還是不夠直觀,甚至有時要用工具分析crash文件來定位問題,還是跟Erlang的哲學有關, 在Erlang中一切都是並行的, 所以它根本不care是物理哪一行出錯, 只跟Actor綁定, 然後告訴你Actor的ID和出錯代號, 你自己憑經驗去分析吧,這樣做的好處是可以很方便定位出並行中出現的問題,但凡事都是相對的, 在這一點上有點糾枉過正,根據我的經驗, 絕大部分時候我只希望先給我明確的指出哪一行出錯了好嗎? 甚至把順序的backtrace用完整的英文句子打印出來好嗎?至於並行中的錯誤及時在命令式多線程語言中是不常見的,雖然並不是沒有, 但遇到錯誤我再費勁去調試好了, 但並不是所有的邏輯都用並行的思維去定位問題, 我甚至認為, 對於一個系統不完全是並行也不完全是串行,跟好比我們衡量世界不能單純的唯物也不能完全的唯心一樣, 這一點Golang就做了很好的折中, 不需要並行的時候你老老實實的寫串行代碼, 需要並行的時候也有較複雜的機制來應對, 合乎情理
7、再說說招人吧, 以前招過好幾個C出來的人,說實話水平很好, 可以一周就完成一個小組件, libevent用的熟的很,後來我逼人家用Erlang,結果把人家逼走了,至今我還很後悔, 自己的一廂情願強加在別人身上真是太不合適了,但我招純Erlang出來的人,可以說比招objc的人還難, 沒有人,空談技術的優雅性首先就是不靠譜的,再看看郵件列表, Golang的活躍度明顯比Erlang高很多, 基本逼近Ruby,更重要的是, 我根本不擔心Golang的人才,因為只要熟悉Python/C/Ruby/或者C++, 基本可以實現半天入門, 之後就可以噼里啪啦邊搜資料邊幹活了,雖然有足夠的深度,但門檻極其平緩,工程人員也可以復用很多已有的知識。 Erlang在這一點其實跟第一點硬傷有關,大部分人學一周都摸不着頭腦,不是每個人的抽象思維和世界觀都是一樣的好嗎, 所以函數式編程儘管不比命令式語言起步晚,但始終學的人很少,這就是歷史, 對於大部分人, 更希望解決問題,創造價值, 而不是數學來推導去
8、最後我建議, 如果你是玩c/c++的, 現在開始學Golang,是最好的時機, 跟一門靠譜的語言一起成長, 這種感覺非常棒, 你用Erlang折騰1個應用, 用Go恐怕都完成了10個開源項目, 當然,也要結合自己的口味, Golang就是Sublime Text, Erlang就是Emacs
相信自己的判斷,相信自己的邏輯, 贏就是贏,輸就是輸
轉載僅供參考,版權屬於原作者。祝你愉快,滿意請採納哦
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/230195.html