當(dāng)今時(shí)代編程語言非常多分歇,每種語言都有各自適用的范圍维哈,但是我們應(yīng)該如何選擇呢脖捻?今天我將從云計(jì)算的角度來討論下編程語言的選擇。
本文主要對(duì)比golang和Java
云時(shí)代下對(duì)于編程語言的要求
在云計(jì)算邮绿、容器化相當(dāng)火爆的今天,我認(rèn)為對(duì)于編程語言的要求有如下幾點(diǎn):
- 應(yīng)用資源占用下攀例,包括鏡像大小斯碌、CPU利用率、內(nèi)存利用率肛度。
- 應(yīng)用啟動(dòng)速度要快傻唾。在serverless場(chǎng)景下要求更加嚴(yán)格
- 語言的運(yùn)行速度或者優(yōu)化要非常高效
- 開發(fā)效率要高,當(dāng)前軟件工程師成本是非常高的
從語言運(yùn)行機(jī)制角度
這里說的語言的運(yùn)行機(jī)制主要是討論語言是解釋型(interpreter)還是編譯型(compiler)承耿。當(dāng)然解釋型和編譯型之間也是比較模糊的冠骄。
解釋型(一般流程):source code -> lexer(詞法分析)-> parser(解析) -> evaluate(解釋執(zhí)行)
編譯型:source code -> 編譯為機(jī)器碼 -> 執(zhí)行
當(dāng)然有些interpreter的實(shí)現(xiàn)還包括IR(中間表示),比如Java會(huì)將源碼先翻譯為字節(jié)碼加袋,然后在JVM中執(zhí)行凛辣。并且在JVM中還會(huì)將某些熱點(diǎn)代碼采用JIT機(jī)制編譯為機(jī)器碼來帶來效率的提升。
interpreter VS compiler
- 一般來說相對(duì)于編譯型的語言职烧,解釋型語言運(yùn)行效率會(huì)低一些扁誓。因?yàn)榫幾g器會(huì)做相當(dāng)多的優(yōu)化,并且執(zhí)行的是二進(jìn)制代碼蚀之。
- 解釋型的語言在跨平臺(tái)下會(huì)有更好的表現(xiàn)蝗敢,由于存在解釋器(例如:JVM),代碼只需要翻譯為字節(jié)碼即可足删,跟底層操作系統(tǒng)無關(guān)寿谴。但是編譯型語言需要將代碼編譯為特定運(yùn)行環(huán)境下的二進(jìn)制代碼,所以跨平臺(tái)會(huì)比較困難失受。但是在當(dāng)前容器化的時(shí)代讶泰,已經(jīng)屏蔽了底層運(yùn)行環(huán)境,所以解釋型語言的這個(gè)優(yōu)勢(shì)也消失了拂到。
結(jié)論:從語言的運(yùn)行機(jī)制角度考慮痪署,我認(rèn)為編譯型語言在云計(jì)算時(shí)代勝出。
從資源占用角度
golang運(yùn)行時(shí)不需要類似虛擬機(jī)的組件兄旬,而Java必須運(yùn)行在JVM中狼犯。而一個(gè)JVM就占用了不少資源。
同時(shí)golang寫出來的程序鏡像大小相對(duì)于Java也會(huì)小很多。
在CPU利用率辜王、內(nèi)存利用率上劈狐,golang表現(xiàn)也更加優(yōu)秀。
結(jié)論:golang勝出
從開發(fā)效率角度
- golang語法簡(jiǎn)單呐馆,學(xué)習(xí)成本低
- golang開發(fā)相對(duì)于java開發(fā)效率高(個(gè)人經(jīng)驗(yàn)體會(huì))
- golang并發(fā)思想更加容易理解肥缔,并且簡(jiǎn)單易用
- golang內(nèi)置gofmt等工具,能夠保證團(tuán)隊(duì)內(nèi)代碼的一致性(這一點(diǎn)在團(tuán)隊(duì)中是比較重要的)
結(jié)論:golang在當(dāng)前云計(jì)算時(shí)代會(huì)更加合適汹来,并且golang相對(duì)于Java會(huì)發(fā)展越來越好续膳。
PS:Rust最近幾年發(fā)展也非常快收班。相對(duì)于golang坟岔,Rust運(yùn)行效率更低,并且沒有GC摔桦。但是Rust上手成本較高社付,如果Rust團(tuán)隊(duì)能夠解決這個(gè)問題,那么Rust后續(xù)發(fā)展也會(huì)更加順利邻耕。