淺談后端語言優缺點


淺談后端語言優缺點

兄弟連教育在前不久,回答了一個關於后端語言選型的問題,那么后端語言都有哪些,存在什么樣的優缺點?因此兄弟連與大家分享一下心得。

 

 

語言優缺點

C/C++

C 語言雖然是非常貼近操作系統的語言,能和操作系統 API 很好的交互,但是 C 語言並沒有現代化工程開發所需要的面向對象功能,當然也缺乏泛型之類的功能,如果以 CGI 的形式開發,那么缺點非常明顯,這也是第二代后端平台興起的原因。

 

C++ 具有現代化工程開發所需要的各種功能,但是它同樣有缺點:

 

缺乏字符串處理,Web 開發最主要的就是字符串的處理,所有的一切幾乎都要和字符串打交道,但是 C++ 最差的就是字符串處理,只有 std::string 這個標准庫提供的字符串類。用過的基本都知道,這是所有語言中最差的字符串類,缺乏方便的 UTF-8 支持,缺乏正則表達式匹配,幾乎什么都缺。

缺乏 Web 標准的支持,我這里說的標准是指語言層面上對 HTTP 協議的支持。Web 是基於 HTTP 協議和 TCP 協議產生的,TCP 協議控制了如何傳輸,HTTP 協議定義了瀏覽器和服務端如何通信。而 C++ 極度缺乏這方面的支持,如果需要做非 CGI 開發,只能自己手工處理 Socket 通信。

缺乏 HTTP 框架和業務代碼之間的交互標准,框架就算完成了 HTTP 通信部分,也沒有一個標准規定框架如何和業務代碼交互。不過,實際上 C++ 框架是實現自己的交互流程。但是缺乏規范則是框架稀少的原因。

這三點主要的缺點非常明顯的,所以社區都沒興趣給寫基於 C++ Web 框架,就算有也是小打小鬧。

 

Java

Java 的效率相對於 C/C++ 這種手動管理內存的語言來說是低的,哪怕使用了引用計數,C/C++ 也能把 Java 甩出 N 條街。但是 Java 相對於其他腳本語言來說優勢非常明顯

 

強類型、編譯型語言,這點就使得 Java 在效率遠超動態類型語言,而且在編譯時就能發現 bug,不需要等到運行時再去調試,現在的很多 IDE 也能做靜態語言分析,不需要編譯就能發現語法錯誤,這就能提升效率。

Java SE 規范,這就讓 Java 能像 C/C++ 一樣貼近操作系統,自由處理網絡相關、IO 相關的內容,功能很強大。

Java EE 規范,完善的規范使得 Java 后端發展有了很好的規范基礎,統一的環境。規范讓框架和業務代碼有了交互的標准(Servlet 脫胎於 Applet,結果 Applet 沒什么卵用,反而 Servlet 得到了極大的發展)。

Java 有着最完善的生態鏈,無論是框架還是編譯工具鏈,模塊系統做的非常棒,現代工程所需的各種設計模式都有着很好的實踐。除了 Java 以外,JVM 上面還有着更多的語言可以選擇。

當然,Java 本身也有很多缺點:

 

編譯型語言開發效率慢

想要上手開發業務容易,但是想要真正懂得 Servlet 和框架如何運行就難了。

語言本身也存在着很多缺點,比如將 C 那里繼承過來的類型又重新封裝了一次,一些新穎的技術沒能第一時間引入,比如 Lambda 這樣的到了 1.8 才引入,甚至有人說說,Java 什么都好,除了語言本身。但是它至少比市面上其他語言更能接受。

本身的規范和不夠靈活也導致了代碼本身很難優化,好的代碼和差的代碼在一套規則的束縛下實際上性能並沒有多少差距,更多的優化被交給了 JVM

 

PHP

PHP 作為一門腳本語言,本身運行效率確實不是很高,但是在 PHP7 平台上,PHP培訓已經算是腳本語言中比較高的了,而且在現有的硬件平台上,PHP 本身的效率基本不會成為瓶頸。它作為一門腳本語言也有着很多優勢:

 

天生的模板語言,不需要學習其他的模板語言,提升了開發效率,也提升了運行效率。(比如 CodeIgniter,就大部分框架來說,使用 PHP 作為模板語言能提升效率,但是像 Laravel 這種能對模板編譯緩存的另算)

上手容易,生態鏈也很不錯,LAMPLNMP 這樣部署的技術可以說是爛大街了,基本沒有學習成本

缺點:

 

解釋型語言,不能常駐內存,巨大的缺陷。

缺乏好用的包管理和命名空間,也缺乏好用的模塊系統(Composer 另說)

 

Node.js

Node.js 作為目前比較火熱的語言,確實有它的獨到之處,這里先列舉它的優點:

 

事件循環 + 異步 IO,這讓它在高並發的情況下能大顯身手。

JavaScript 易上手,有着活躍的社區和很多的第三方庫

常駐內存簡直不要太好

可用的模塊系統

天生跟 Docker 有緣

前端使用 JavaScript,學習 Node.js 能做到全棧開發

缺點:

 

也是 JavaScriptJavaScript 是基於原型的語言,從嚴格上來說並沒有真正面向對象,這樣也讓 JavaScript 在編寫業務代碼的時候極為困難。

混亂的語言規范,現在並行着 ES5ES6ES7,需要 Babel 這樣的工具幫忙

在服務端上只存在 CommonJS 模塊系統,但是在規范上來說則有很多,准確來說這並不是一個很大的問題,可以忽略

ES5 愚蠢的回調產生的回調地獄,但是 ES6 解決了這個問題,准確來說也不是什么大問題。

 

Swoole

Swoole Node.js 很相似,相比 Node.js 它在語言層面上比 JavaScript 更加規范好用。但是它存在兩個缺點:

 

文檔!文檔!文檔!重要的事情說三遍。

單純的 Swoole 擴展基本不能用,必須依賴 Swoole 框架,所以。。。文檔!文檔!文檔!問題還是文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM