摘要:再往后來(lái),也就是這種以事件循環(huán)常駐內(nèi)存為特點(diǎn)的后端平臺(tái),姑且能算是第四代后端平臺(tái)。
前不久回答了一個(gè)關(guān)于后端語(yǔ)言選型的問(wèn)題,寫(xiě)的回答也讓筆者有了很多感觸,因此在這里談?wù)撓伦约簩?duì)后端語(yǔ)言選型的心得體會(huì),姑且算是拋磚引玉,希望大家能分享各自的心得。
后端語(yǔ)言發(fā)展歷史Web 后端語(yǔ)言的興起是從靜態(tài)網(wǎng)頁(yè)向動(dòng)態(tài)網(wǎng)頁(yè)的發(fā)展所產(chǎn)生的,最早的動(dòng)態(tài)頁(yè)面技術(shù)就是 CGI 技術(shù),將客戶端的輸入交給 CGI 程序,然后將 CGI 程序的輸出返回給客戶端。早期的 CGI 程序只要是任何有標(biāo)準(zhǔn)輸入輸出的語(yǔ)言都可以編寫(xiě),這也就是第一代后端平臺(tái)。
后來(lái)為了簡(jiǎn)化 CGI 程序的修改編譯發(fā)布的流程,就有了腳本語(yǔ)言實(shí)現(xiàn) CGI 應(yīng)用。也就是 Perl 這樣的語(yǔ)言。也就是第二代后端平臺(tái)。雖然 Perl 作為腳本語(yǔ)言解決了開(kāi)發(fā)效率的問(wèn)題,但是它同樣需要在程序代碼中摻雜 HTML 語(yǔ)言,為了解決這個(gè)問(wèn)題,就有了 PHP 這樣的將 HTML 和 程序代碼混雜,并且能快速開(kāi)發(fā)的語(yǔ)言。同時(shí),Java EE 的標(biāo)準(zhǔn)也提出了 JSP 這樣的解決方案,也就是第三代后端平臺(tái),從此,現(xiàn)代的后端開(kāi)發(fā)基本就形成了。再往后來(lái),也就是 Node.js Go Swoole 這種以事件循環(huán)、常駐內(nèi)存為特點(diǎn)的后端平臺(tái),姑且能算是第四代后端平臺(tái)。而目前來(lái)說(shuō),第三代和第四代開(kāi)發(fā)平臺(tái)是并存的。
語(yǔ)言優(yōu)缺點(diǎn) C/C++C 語(yǔ)言雖然是非常貼近操作系統(tǒng)的語(yǔ)言,能和操作系統(tǒng) API 很好的交互,但是 C 語(yǔ)言并沒(méi)有現(xiàn)代化工程開(kāi)發(fā)所需要的面向?qū)ο蠊δ?,?dāng)然也缺乏泛型之類的功能,如果以 CGI 的形式開(kāi)發(fā),那么缺點(diǎn)非常明顯,這也是第二代后端平臺(tái)興起的原因。
C++ 具有現(xiàn)代化工程開(kāi)發(fā)所需要的各種功能,但是它同樣有缺點(diǎn):
缺乏字符串處理,Web 開(kāi)發(fā)最主要的就是字符串的處理,所有的一切幾乎都要和字符串打交道,但是 C++ 最差的就是字符串處理,只有 std::string 這個(gè)標(biāo)準(zhǔn)庫(kù)提供的字符串類。用過(guò)的基本都知道,這是所有語(yǔ)言中最差的字符串類,缺乏方便的 UTF-8 支持,缺乏正則表達(dá)式匹配,幾乎什么都缺。
缺乏 Web 標(biāo)準(zhǔn)的支持,我這里說(shuō)的標(biāo)準(zhǔn)是指語(yǔ)言層面上對(duì) HTTP 協(xié)議的支持。Web 是基于 HTTP 協(xié)議和 TCP 協(xié)議產(chǎn)生的,TCP 協(xié)議控制了如何傳輸,HTTP 協(xié)議定義了瀏覽器和服務(wù)端如何通信。而 C++ 極度缺乏這方面的支持,如果需要做非 CGI 開(kāi)發(fā),只能自己手工處理 Socket 通信。
缺乏 HTTP 框架和業(yè)務(wù)代碼之間的交互標(biāo)準(zhǔn),框架就算完成了 HTTP 通信部分,也沒(méi)有一個(gè)標(biāo)準(zhǔn)規(guī)定框架如何和業(yè)務(wù)代碼交互。不過(guò),實(shí)際上 C++ 框架是實(shí)現(xiàn)自己的交互流程。但是缺乏規(guī)范則是框架稀少的原因。
這三點(diǎn)主要的缺點(diǎn)非常明顯的,所以社區(qū)都沒(méi)興趣給寫(xiě)基于 C++ 的 Web 框架,就算有也是小打小鬧。
JavaJava 的效率相對(duì)于 C/C++ 這種手動(dòng)管理內(nèi)存的語(yǔ)言來(lái)說(shuō)是低的,哪怕使用了引用計(jì)數(shù),C/C++ 也能把 Java 甩出 N 條街。但是 Java 相對(duì)于其他腳本語(yǔ)言來(lái)說(shuō)優(yōu)勢(shì)非常明顯
強(qiáng)類型、編譯型語(yǔ)言,這點(diǎn)就使得 Java 在效率遠(yuǎn)超動(dòng)態(tài)類型語(yǔ)言,而且在編譯時(shí)就能發(fā)現(xiàn) bug,不需要等到運(yùn)行時(shí)再去調(diào)試,現(xiàn)在的很多 IDE 也能做靜態(tài)語(yǔ)言分析,不需要編譯就能發(fā)現(xiàn)語(yǔ)法錯(cuò)誤,這就能提升效率。
Java SE 規(guī)范,這就讓 Java 能像 C/C++ 一樣貼近操作系統(tǒng),自由處理網(wǎng)絡(luò)相關(guān)、IO 相關(guān)的內(nèi)容,功能很強(qiáng)大。
Java EE 規(guī)范,完善的規(guī)范使得 Java 后端發(fā)展有了很好的規(guī)范基礎(chǔ),統(tǒng)一的環(huán)境。規(guī)范讓框架和業(yè)務(wù)代碼有了交互的標(biāo)準(zhǔn)(Servlet 脫胎于 Applet,結(jié)果 Applet 沒(méi)什么卵用,反而 Servlet 得到了極大的發(fā)展)。
Java 有著最完善的生態(tài)鏈,無(wú)論是框架還是編譯工具鏈,模塊系統(tǒng)做的非常棒,現(xiàn)代工程所需的各種設(shè)計(jì)模式都有著很好的實(shí)踐。除了 Java 以外,JVM 上面還有著更多的語(yǔ)言可以選擇。
當(dāng)然,Java 本身也有很多缺點(diǎn):
編譯型語(yǔ)言開(kāi)發(fā)效率慢
想要上手開(kāi)發(fā)業(yè)務(wù)容易,但是想要真正懂得 Servlet 和框架如何運(yùn)行就難了。
語(yǔ)言本身也存在著很多缺點(diǎn),比如將 C 那里繼承過(guò)來(lái)的類型又重新封裝了一次,一些新穎的技術(shù)沒(méi)能第一時(shí)間引入,比如 Lambda 這樣的到了 1.8 才引入,甚至有人說(shuō)說(shuō),Java 什么都好,除了語(yǔ)言本身。但是它至少比市面上其他語(yǔ)言更能接受。
本身的規(guī)范和不夠靈活也導(dǎo)致了代碼本身很難優(yōu)化,好的代碼和差的代碼在一套規(guī)則的束縛下實(shí)際上性能并沒(méi)有多少差距,更多的優(yōu)化被交給了 JVM
PHPPHP 作為一門腳本語(yǔ)言,本身運(yùn)行效率確實(shí)不是很高,但是在 PHP7 平臺(tái)上,已經(jīng)算是腳本語(yǔ)言中比較高的了,而且在現(xiàn)有的硬件平臺(tái)上,PHP 本身的效率基本不會(huì)成為瓶頸。它作為一門腳本語(yǔ)言也有著很多優(yōu)勢(shì):
天生的模板語(yǔ)言,不需要學(xué)習(xí)其他的模板語(yǔ)言,提升了開(kāi)發(fā)效率,也提升了運(yùn)行效率。(比如 CodeIgniter,就大部分框架來(lái)說(shuō),使用 PHP 作為模板語(yǔ)言能提升效率,但是像 Laravel 這種能對(duì)模板編譯緩存的另算)
上手容易,生態(tài)鏈也很不錯(cuò),LAMP、LNMP 這樣部署的技術(shù)可以說(shuō)是爛大街了,基本沒(méi)有學(xué)習(xí)成本
缺點(diǎn):
解釋型語(yǔ)言,不能常駐內(nèi)存,巨大的缺陷。
缺乏好用的包管理和命名空間,也缺乏好用的模塊系統(tǒng)(Composer 另說(shuō))
Node.jsNode.js 作為目前比較火熱的語(yǔ)言,確實(shí)有它的獨(dú)到之處,這里先列舉它的優(yōu)點(diǎn):
事件循環(huán) + 異步 IO,這讓它在高并發(fā)的情況下能大顯身手。
JavaScript 易上手,有著活躍的社區(qū)和很多的第三方庫(kù)
常駐內(nèi)存簡(jiǎn)直不要太好
可用的模塊系統(tǒng)
天生跟 Docker 有緣
前端使用 JavaScript,學(xué)習(xí) Node.js 能做到全棧開(kāi)發(fā)
缺點(diǎn):
也是 JavaScript,JavaScript 是基于原型的語(yǔ)言,從嚴(yán)格上來(lái)說(shuō)并沒(méi)有真正面向?qū)ο螅@樣也讓 JavaScript 在編寫(xiě)業(yè)務(wù)代碼的時(shí)候極為困難。
混亂的語(yǔ)言規(guī)范,現(xiàn)在并行著 ES5、ES6、ES7,需要 Babel 這樣的工具幫忙
在服務(wù)端上只存在 CommonJS 模塊系統(tǒng),但是在規(guī)范上來(lái)說(shuō)則有很多,準(zhǔn)確來(lái)說(shuō)這并不是一個(gè)很大的問(wèn)題,可以忽略
ES5 愚蠢的回調(diào)產(chǎn)生的回調(diào)地獄,但是 ES6 解決了這個(gè)問(wèn)題,準(zhǔn)確來(lái)說(shuō)也不是什么大問(wèn)題。
SwooleSwoole 跟 Node.js 很相似,相比 Node.js 它在語(yǔ)言層面上比 JavaScript 更加規(guī)范好用。但是它存在兩個(gè)缺點(diǎn):
文檔!文檔!文檔!重要的事情說(shuō)三遍。
單純的 Swoole 擴(kuò)展基本不能用,必須依賴 Swoole 框架,所以。。。文檔!文檔!文檔!問(wèn)題還是文檔
總結(jié)筆者認(rèn)為,所有語(yǔ)言實(shí)際上都有著它獨(dú)到的地方,而關(guān)鍵就在于對(duì)其認(rèn)清楚,擇優(yōu)而為,選擇正確的工具才是應(yīng)有的行為。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/21834.html
摘要:再往后來(lái),也就是這種以事件循環(huán)常駐內(nèi)存為特點(diǎn)的后端平臺(tái),姑且能算是第四代后端平臺(tái)。 前不久回答了一個(gè)關(guān)于后端語(yǔ)言選型的問(wèn)題,寫(xiě)的回答也讓筆者有了很多感觸,因此在這里談?wù)撓伦约簩?duì)后端語(yǔ)言選型的心得體會(huì),姑且算是拋磚引玉,希望大家能分享各自的心得。 后端語(yǔ)言發(fā)展歷史 Web 后端語(yǔ)言的興起是從靜態(tài)網(wǎng)頁(yè)向動(dòng)態(tài)網(wǎng)頁(yè)的發(fā)展所產(chǎn)生的,最早的動(dòng)態(tài)頁(yè)面技術(shù)就是 CGI 技術(shù),將客戶端的輸入交給 CGI...
摘要:創(chuàng)業(yè)公司或新項(xiàng)目如何做技術(shù)選型一個(gè)創(chuàng)業(yè)公司或者新項(xiàng)目如何做技術(shù)選型個(gè)人認(rèn)為一定要記住這個(gè)根本新項(xiàng)目最先要解決的就是原型核心業(yè)務(wù)落地驗(yàn)證商業(yè)模式。開(kāi)源的最新的穩(wěn)定的根據(jù)業(yè)務(wù)選定技術(shù)棧之后,盡量擁抱開(kāi)源的東西。 創(chuàng)業(yè)公司或新項(xiàng)目如何做技術(shù)選型 一個(gè)創(chuàng)業(yè)公司或者新項(xiàng)目如何做技術(shù)選型?個(gè)人認(rèn)為一定要記住這個(gè)根本:新項(xiàng)目最先要解決的就是原型核心業(yè)務(wù)落地驗(yàn)證商業(yè)模式。具體實(shí)踐中,應(yīng)當(dāng)遵循以下原則和...
摘要:前端日?qǐng)?bào)精選了解中的全局對(duì)象和全局作用域張?chǎng)涡聆慰臻g鑫生活子進(jìn)程你應(yīng)該知道的一切直出內(nèi)存泄露問(wèn)題的追查實(shí)踐我他喵的到底要怎樣才能在生產(chǎn)環(huán)境中用上模塊化騰訊前端大會(huì)大咖說(shuō)大咖干貨,不再錯(cuò)過(guò)發(fā)布發(fā)布中文翻譯在使用進(jìn)行本地開(kāi)發(fā)代碼 2017-07-07 前端日?qǐng)?bào) 精選 了解JS中的全局對(duì)象window.self和全局作用域self ? 張?chǎng)涡?鑫空間-鑫生活Node.js 子進(jìn)程:你應(yīng)該知道...
摘要:原文淺談云計(jì)算的形態(tài)這幾年云計(jì)算概念炒的很火熱,不僅是很多的云計(jì)算相關(guān)的創(chuàng)業(yè)公司如雨后春筍般冒出來(lái),大佬們也紛紛加入戰(zhàn)場(chǎng)。本文結(jié)合自己的理解對(duì)目前市面上的云計(jì)算形式,談一談看法。推送還能為移動(dòng)客戶端提供消息推送的能力。 原文:淺談云計(jì)算的形態(tài) 這幾年云計(jì)算概念炒的很火熱,不僅是很多的云計(jì)算相關(guān)的創(chuàng)業(yè)公司如雨后春筍般冒出來(lái),大佬們也紛紛加入戰(zhàn)場(chǎng)。IaaS、PaaS、SaaS、BaaS多...
摘要:前端模板的出現(xiàn)使得前后端分離成為可能??偨Y(jié)本文簡(jiǎn)單介紹了模板引擎在前后端的使用,下文我們回到,重點(diǎn)分析下的使用方式以及源碼原理。樓主對(duì)于模板引擎的認(rèn)識(shí)比較淺顯,有不正之處希望指出感謝 前言 這篇文章本來(lái)不打算寫(xiě)的,實(shí)話說(shuō)樓主對(duì)前端模板的認(rèn)識(shí)還處在非常初級(jí)的階段,但是為了整個(gè) 源碼解讀系列 的完整性,在深入 Underscore _.template 方法源碼后,覺(jué)得還是有必要記下此文,...
閱讀 771·2021-11-11 16:54
閱讀 3097·2021-09-26 09:55
閱讀 2041·2021-09-07 10:20
閱讀 1230·2019-08-30 10:58
閱讀 1073·2019-08-28 18:04
閱讀 724·2019-08-26 13:57
閱讀 3624·2019-08-26 13:45
閱讀 1184·2019-08-26 11:42