Node.js 和 Java 的史詩(shī)級(jí)對(duì)決,誰(shuí)才是開(kāi)發(fā)者的“真愛(ài)”?(node.js vs java)
本文最初發(fā)布于 Peter Wayner 博客,經(jīng)原作者授權(quán)由 InfoQ 中文站翻譯并分享。
在計(jì)算歷史上,1995 年是一段瘋狂的歲月。首先 Java 出現(xiàn)了,隨后 JavaScript 也出現(xiàn)了。Java 和 JavaScript 的名字看起來(lái)像是一對(duì)雙胞胎,但實(shí)際上它們差別巨大,Java 是被編寫(xiě)和靜態(tài)定型的,而 JavaScript 則是被解釋和動(dòng)態(tài)定型的。但這僅僅是這兩個(gè)完全不同的語(yǔ)言的技術(shù)差別的一個(gè)開(kāi)始,Node.js 的出現(xiàn)使得兩種語(yǔ)言經(jīng)歷了兩條完全不同的發(fā)展軌跡。
如果你比較早的接觸了 IT 技術(shù),那么你或許記得 Java 曾經(jīng)風(fēng)靡一時(shí),每個(gè)人都將其視為一項(xiàng)革命,認(rèn)為它將完全替代計(jì)算。但事實(shí)證明,這一預(yù)測(cè)只有一部分是正確的,Java 統(tǒng)治了安卓手機(jī)、企業(yè)計(jì)算和一些嵌入式設(shè)備,如藍(lán)光光碟。但它從來(lái)沒(méi)有統(tǒng)治過(guò)桌面或?yàn)g覽器。人們?cè)鴩L試出售過(guò)小應(yīng)用程序和 Java 工具的強(qiáng)大,但是表現(xiàn)平平。
同時(shí),之前被程序員們錯(cuò)認(rèn)為是 Java“雙胞胎”的 JavaScript,如今也能獨(dú)當(dāng)一面了。在 HTML 和 web 推出 Borg 的幾年間,JavaScript 一直緊隨其后,AJAX 的出現(xiàn)使得 JavaScript 突然之間擁有了力量,打破了之前的局面。
隨后 Node.js 誕生了,大大提高了開(kāi)發(fā)速度。JavaScript 不僅在服務(wù)器上比大多數(shù)人預(yù)期的要快,甚至與 Java 或者其它工具相比,速度也要快。JavaScript 能夠更加穩(wěn)定地處理小的、快速的和無(wú)休止的數(shù)據(jù)請(qǐng)求,因此,當(dāng)網(wǎng)頁(yè)變得更加動(dòng)態(tài)時(shí),Node.js 就變得更加常用了。
雖然這在 20 年前可能是無(wú)法想象的,但是現(xiàn)在 Java 和 JavaScript 正在爭(zhēng)奪編程領(lǐng)域的“統(tǒng)治權(quán)”,它們一個(gè)強(qiáng)調(diào)以堅(jiān)固的工程和架構(gòu)為深層基礎(chǔ),另一個(gè)強(qiáng)調(diào)簡(jiǎn)潔和普遍性。到底是老式的編譯器驅(qū)動(dòng)的 Java 會(huì)立于不敗之地,還是在 Node.js 幫助下的 JavaScript 將所向披靡呢?
Java 獲勝之處:堅(jiān)如磐石的基礎(chǔ)
看到這個(gè)小標(biāo)題,可能有些開(kāi)發(fā)者會(huì)有質(zhì)疑。當(dāng)然,我們不否認(rèn) Java 還存在一些小 Bug,但是相對(duì)而言,Java 已經(jīng)算是很“堅(jiān)固”的了,Node.js 想要讓我擁有這樣的信心,還需要許多年。
事實(shí)上,要寫(xiě)出與 Sun/Oracle 在測(cè)試 Java 虛擬機(jī)時(shí)所寫(xiě)數(shù)量相同的回歸測(cè)試,JavaScript 開(kāi)發(fā)者或許要花上幾十年。當(dāng)你啟動(dòng) JVM 時(shí),你將獲得來(lái)自一個(gè)質(zhì)量可靠的管理者的 20 年經(jīng)驗(yàn),而這個(gè)管理者一直決心要統(tǒng)治企業(yè)服務(wù)器領(lǐng)域。
不過(guò),JavaScript 也在迅速迎頭趕上。當(dāng) Web 的大部分依賴于 JavaScript 執(zhí)行引擎時(shí),開(kāi)發(fā)者的時(shí)間大部分花在了打磨邊邊角角上面。然而,所有的創(chuàng)新都有一個(gè)缺點(diǎn),那就是新的功能可能擴(kuò)散太快,以至于開(kāi)發(fā)者們來(lái)不及吸收這些功能。一些老派的開(kāi)發(fā)者經(jīng)常會(huì)對(duì)充斥著最新 ECMAScript 句法的增強(qiáng)特性感到困惑。另外,這些新代碼可能還會(huì)導(dǎo)致某些舊版瀏覽器崩潰。
創(chuàng)新性的預(yù)處理器,如 CoffeeScript 和 JSX 等,源源不斷地出現(xiàn),對(duì)于需要這些功能的開(kāi)發(fā)者來(lái)說(shuō)是件好事,但是對(duì)于不需要的開(kāi)發(fā)者來(lái)說(shuō)增加了難度。
盡管 Java 也在不斷推出新的功能和選項(xiàng),但總體而言,它是一個(gè)穩(wěn)定的平臺(tái),它給那些需要開(kāi)發(fā)更長(zhǎng)久的東西的開(kāi)發(fā)者帶來(lái)了便利。
Node.js 獲勝之處:普遍性
多虧了 Node.js,JavaScript 在服務(wù)器以及瀏覽器領(lǐng)域找到了一席之地。你給服務(wù)器寫(xiě)的代碼很可能在瀏覽器上也能運(yùn)行。很明顯,比起在 Java 和 JavaScript 中分別寫(xiě)代碼,直接使用 JavaScript 更簡(jiǎn)單。
如果你決定要把 Java 中的服務(wù)器業(yè)務(wù)邏輯遷移到瀏覽器中,或者老板執(zhí)意要你把給瀏覽器寫(xiě)的邏輯遷移到服務(wù)器上。在這兩種情況下,Node.js 和 JavaScript 都能讓代碼遷移變得更簡(jiǎn)單。
不僅如此,Node.js 的領(lǐng)導(dǎo)地位似乎還在擴(kuò)大,例如比較復(fù)雜的 Web 框架,類似 React,是要把代碼運(yùn)行在服務(wù)器還是客戶端上呢?另外,還有可能出現(xiàn)這種情況,代碼前一天是運(yùn)行在客戶端上的,但是后一天可能就運(yùn)行在服務(wù)器上。某些智能的邏輯將在運(yùn)行時(shí)根據(jù)負(fù)載、閑置 RAM 容量和其它因素來(lái)決定究竟代碼運(yùn)行在什么上面。有些框架會(huì)把 JavaScript 作為一條查詢,輸入到數(shù)據(jù)庫(kù),并在那里執(zhí)行。你的代碼可能在任何地方運(yùn)行,所以,你很難了解究竟是在什么地方,因?yàn)榇a根本不會(huì)返回任何東西。但是也無(wú)需擔(dān)心,因?yàn)槟悴恍枰紤]太多細(xì)節(jié)。
Java 獲勝之處:更好的集成開(kāi)發(fā)環(huán)境 (IDE)
Java 開(kāi)發(fā)者擁有三大 IDE,Eclipse、NetBeans 和 IntelliJ,這三個(gè) IDE 是與調(diào)試程序、反編譯器和服務(wù)器良好地集成的頂尖工具。每個(gè)工具都經(jīng)過(guò)了數(shù)年的開(kāi)發(fā),擁有忠實(shí)的用戶、堅(jiān)固的生態(tài)系統(tǒng)和數(shù)不盡的插件。
大多數(shù) Node.js 開(kāi)發(fā)者會(huì)將文字輸入命令行,再編碼到他們最喜愛(ài)的文本編輯器中。誠(chéng)然,市面上最好的一些文本編輯器,像 Atom,都擁有琳瑯滿目且?guī)缀鯚o(wú)所不能的插件,但如果和 Eclipse 進(jìn)行比較,Node.js 給人的感覺(jué)要更老式一些。在不久的將來(lái),Atari 操縱桿將代替我們的鼠標(biāo)。
另外,有些 Node.js 開(kāi)發(fā)者會(huì)使用 Eclipse 或 Visual Studio。開(kāi)發(fā)者對(duì) Node.js 突然激增的興趣可能會(huì)有新工具誕生,例如IBM 的 Node-RED 給我們提供了一些極具吸引力的方法,但是這些工具還遠(yuǎn)未達(dá)到像 Eclipse 或 IntelliJ 那樣的完整度和統(tǒng)治地位。
但奇怪的是,開(kāi)發(fā)者好像并沒(méi)有使用這些工具。命令行本該在 35 年前 Mac 到來(lái)時(shí)就消失,但卻沒(méi)人把這個(gè)消息告訴 Node.js 的開(kāi)發(fā)者們。但是選擇一直都在那里。例如,WebStorm 就是一個(gè)可靠的由 JetBrains 開(kāi)發(fā)的商業(yè)化工具,它集成了許多命令行構(gòu)建工具。
當(dāng)然,如果你正在尋找一款能夠編輯和調(diào)整代碼的集成開(kāi)發(fā)環(huán)境,那么現(xiàn)在支持 Node.js 的新工具已經(jīng)足夠使用了。但如果你希望集成開(kāi)發(fā)環(huán)境能夠讓你一邊操作正在運(yùn)行的源代碼,一邊編輯代碼,那么 Java 的工具顯然會(huì)更強(qiáng)大一些。
Node.js 獲勝之處:數(shù)據(jù)庫(kù)查詢
一些較新的數(shù)據(jù)庫(kù),如 CouchDB 和 MongoDB 的查詢是由 JavaScript 編寫(xiě)的。將 Node.js 和數(shù)據(jù)庫(kù)調(diào)用合并不需要任何換擋,也不需要記住任何句法差異。
而許多 Java 開(kāi)發(fā)者都在使用 SQL。即使是在他們使用 Java DB——前身是 Derby (一種由 Java 編寫(xiě)的數(shù)據(jù)庫(kù))時(shí),他們的查詢也是用 SQL 寫(xiě)的。你可能會(huì)以為他們會(huì)簡(jiǎn)單地調(diào)用 Java 方法,但其實(shí)沒(méi)有,開(kāi)發(fā)者必須要用 SQL 寫(xiě)數(shù)據(jù)庫(kù)代碼,然后再用 Derby 解析 SQL。 雖然 SQL 是很好的語(yǔ)言,但是它與 Java 完全不同,許多開(kāi)發(fā)團(tuán)隊(duì)需要有不同的人來(lái)分別寫(xiě) SQL 和 Java。
更糟糕的是,許多 Java 程序員使用復(fù)雜的庫(kù)和模式來(lái)將 SQL 查詢數(shù)據(jù)轉(zhuǎn)換成 Java 對(duì)象,目的是讓自己能夠?qū)⑦@些東西重新導(dǎo)入到模板中。這個(gè)過(guò)程非常瘋狂,而且非常浪費(fèi)。
Java 獲勝之處:類型
許多入門(mén)級(jí)的編程課程都使用 Java,因?yàn)樵S多程序員都喜歡靜態(tài)類型編碼,靜態(tài)類型編碼很簡(jiǎn)潔而且安全。在編譯器找出了一些明顯的 bug 后,代碼看起來(lái)更加嚴(yán)謹(jǐn)了。
不過(guò),JavaScript 也在追趕,一些開(kāi)發(fā)者已經(jīng)轉(zhuǎn)到 TypeScript。TypeScript 是一個(gè)靜態(tài)類型的 JavaScript 超集,首先會(huì)應(yīng)用所有的類型檢查手段,然后剔除掉運(yùn)行在瀏覽器上的 JavaScript 堆棧中的一些東西。
對(duì)于喜歡類型的開(kāi)發(fā)者來(lái)說(shuō),TypeScript 足以讓你喜歡上 JavaScript。當(dāng)然,你可以把 JavaScript 這種模仿視為是對(duì) Java 最真誠(chéng)的恭維,并且繼續(xù)使用 Java,因?yàn)?Java 從一開(kāi)始就是使用靜態(tài)類型的。
Node.js 獲勝之處:語(yǔ)法靈活性
JavaScript 曾經(jīng)是一個(gè)簡(jiǎn)單的語(yǔ)言,用于彈出警示框和雙重檢查輸入表。后來(lái),開(kāi)發(fā)者社區(qū)創(chuàng)造了 JavaScript 的許多不同版本,它們能夠被轉(zhuǎn)編譯為瀏覽器可用的東西。例如,CoffeeScript 提供了一些不同的句法,旨在使標(biāo)點(diǎn)符號(hào)更加清晰。React/Vue 群體將 HTML 和 JavaScript 混合。此外,還有針對(duì)類型愛(ài)好者的 TypeScript 和針對(duì)功能語(yǔ)言信徒的 LiveScript。
而在 Java 中,你會(huì)發(fā)現(xiàn)有很多創(chuàng)新,但這些創(chuàng)新由于某些原因,并未用預(yù)處理器進(jìn)行表達(dá)。還有一些語(yǔ)言如 Kotlin、Scala 和 Clojure,為了 JVM 專門(mén)變成了字節(jié)代碼,但不知為何,它們可以說(shuō)是完全獨(dú)立的語(yǔ)言。對(duì)于喜歡嘗試不同的代碼編寫(xiě)方式或標(biāo)點(diǎn)符號(hào)的 JavaScript 程序員來(lái)說(shuō),所有的預(yù)處理器均使他們的生活變得更加有趣了。
Java 獲勝之處:簡(jiǎn)單的構(gòu)建流程
復(fù)雜的構(gòu)建工具如 Ant 和 Maven 使 Java 編程發(fā)生了革命。但還是有一個(gè)問(wèn)題,開(kāi)發(fā)者需要將說(shuō)明用 XML 寫(xiě)出來(lái),而 XML 并不是一個(gè)支持編程邏輯的數(shù)據(jù)格式。
當(dāng)然,使用嵌套標(biāo)簽來(lái)表達(dá)分支相對(duì)而言比較簡(jiǎn)單,但是僅僅是為了構(gòu)建,就要從 Java 切換到 XML,有些令人討厭。有了 JavaScript 后,你就不需要再切換。
之前,Node.js 的構(gòu)建很簡(jiǎn)單,只需要編輯代碼,點(diǎn)擊“運(yùn)行”就可以了。但是隨著 Node.js 開(kāi)發(fā)者不斷改進(jìn)流程,添加了一些預(yù)處理器來(lái)抓取你最喜歡的 JavaScript 方言,并將這種方言轉(zhuǎn)換成可以運(yùn)行的東西。然后,Node 包管理器需要找到正確的庫(kù),因?yàn)橛袝r(shí)可能會(huì)找不到,所以需要花時(shí)間尋找某個(gè)工件正確的版本號(hào),而這個(gè)工件必須在單獨(dú)的步驟中自行構(gòu)建。而且,如果你在工件庫(kù)中引入了一些錯(cuò)誤,那么,這個(gè)版本號(hào)便無(wú)效了,需要重新做。
Java 也有與 Node.js 方法類似的復(fù)雜的構(gòu)建過(guò)程,但給人的感覺(jué)不會(huì)比 Node.js 更復(fù)雜,從某種意義上說(shuō),Maven 和 Ant 貌似已經(jīng)成為了 Java 基礎(chǔ)的一部分,許多粗糙的邊角已經(jīng)被去除了,因此構(gòu)建的工作成功率更高了。
如果非要對(duì)它們的構(gòu)建難度進(jìn)行衡量的話,它們可能不分伯仲,但如果從 JavaScript 快速增加的復(fù)雜度的角度來(lái)看,Java 在這方面獲勝了。
Node.js 獲勝之處:JSON
當(dāng)數(shù)據(jù)庫(kù)給出答案時(shí),Java 需要花費(fèi)大量時(shí)間把結(jié)果變成 Java 對(duì)象。開(kāi)發(fā)者會(huì)就 POJO 映射、Hibernate 和其它工具爭(zhēng)辯上好幾個(gè)小時(shí)。配置這些東西耗費(fèi)數(shù)小時(shí)甚至數(shù)天時(shí)間。最終,在所有的轉(zhuǎn)換之后,Java 代碼獲得了 Java 對(duì)象。而來(lái)到配置階段時(shí),Java 使用的仍然是 XML,并且提供了 2 個(gè)主要的解析器,這給開(kāi)發(fā)者帶來(lái)了更多的煩惱。
如今,許多 Web 服務(wù)和數(shù)據(jù)庫(kù)都以JSON的形式返回?cái)?shù)據(jù),JSON 是 JavaScript 天然的一部分。JSON 現(xiàn)在非常常見(jiàn)和有用,以至于許多 Java 開(kāi)發(fā)者都在使用這種格式,而且還有一些非常好的 JSON 解析器可以作為 Java 庫(kù)被使用。相比之下,JSON 本身就是 JavaScript 基礎(chǔ)的一部分,不需要庫(kù),直接使用就可以了。
Java 獲勝之處:遠(yuǎn)程調(diào)試
Java 擁有許多非常棒的監(jiān)控機(jī)器集群的工具。JVM 有深層的鉤子和精細(xì)的剖析工具來(lái)幫助我們識(shí)別瓶頸和故障。Java 企業(yè)堆棧上運(yùn)行著全世界最復(fù)雜的服務(wù)器,而使用這些服務(wù)器的公司對(duì)遙測(cè)的要求非常之高,所有這些監(jiān)控和調(diào)試工具都較為成熟,并且可以立即部署它們。
Node.js 獲勝之處:桌面
也許有人在使用 Java 小程序,但我仍然保留了一些可以點(diǎn)擊運(yùn)行的 Java JAR 文件??傮w來(lái)說(shuō),桌面領(lǐng)域大體上是不用 Java 的。另一方面,隨著瀏覽器取代了桌面的大部分角色,JavaScript 的作用也越來(lái)越大。當(dāng)微軟重寫(xiě)了 Office 并使其能夠在瀏覽器上運(yùn)行時(shí),一切就注定了。如果你還想了解更多,那么市面上還有許多有趣的選擇,比如Electron,它能夠抓取你的 Web 代碼,然后轉(zhuǎn)換成獨(dú)立的桌面 app。
Java 獲勝之處:手持設(shè)備
安卓 app 大多都是用 Java 寫(xiě)的,而且 90% 的新手機(jī)都運(yùn)行著各種版本的安卓系統(tǒng)。很多人根本就不使用桌面了,因?yàn)槭謾C(jī)已經(jīng)可以做任何事情了。
許多開(kāi)發(fā)者都在編寫(xiě) Node.js Web 應(yīng)用,這些應(yīng)用主要用在 iPhone 和安卓手機(jī)上的移動(dòng)瀏覽器上。如果這些應(yīng)用寫(xiě)得比較好,性能通常會(huì)比較好。但 Java 正以另外的一種方式入侵。最新的 Chromebook 將支持安卓應(yīng)用,從而給 Java 開(kāi)發(fā)者進(jìn)入 Chromebook 用戶的桌面開(kāi)辟了道路。那么 Java 是否仍有機(jī)會(huì)征服桌面呢?
Node.js 獲勝之處:庫(kù)
Java 提供了大量的庫(kù),而且這些庫(kù)做得都非常好,文本索引工具如 Lucene 和計(jì)算機(jī)視覺(jué)工具包如 OpenCV 都是非常好的開(kāi)源項(xiàng)目,它們都將成為其它重大項(xiàng)目的基石。JavaScript 程序員也在追趕,創(chuàng)造出了很多了不起的項(xiàng)目。
在某些領(lǐng)域,Java 就是一個(gè)遠(yuǎn)程的存儲(chǔ)器,市場(chǎng)上可能有無(wú)數(shù)不同的 Web 框架,所以 Java 不能在這個(gè)新興市場(chǎng)中參與競(jìng)爭(zhēng)。
Java 獲勝之處:堅(jiān)固的工程
雖然這點(diǎn)很難量化,但是因?yàn)?Java 的數(shù)據(jù)基礎(chǔ)非常強(qiáng)大,許多重大的科學(xué)工作中使用的許多復(fù)雜的程序包均是用 Java 寫(xiě)的。Sun 公司花了大量的時(shí)間來(lái)獲取工具類的詳情。市場(chǎng)上有 BigIntegers、精巧的 IO 例程和復(fù)雜的日期代碼,它們均實(shí)現(xiàn)了格里高里和羅馬儒略日歷。
JavaScript 適合簡(jiǎn)單的任務(wù),但是其內(nèi)部有很多令人混淆的地方。舉一個(gè)簡(jiǎn)單的例子,JavaScript 針對(duì)沒(méi)有答案的函數(shù)會(huì)生成三種不同的答案,分別是:undefined、NaN 和 null。那么,哪一個(gè)是正確的呢?其實(shí)每個(gè)答案都有各自的作用,其中一個(gè)便是驅(qū)使程序員保持代碼統(tǒng)一。JavaScript 更怪異的方面是雖然它在簡(jiǎn)單的表格工作很少出問(wèn)題,但對(duì)于復(fù)雜的數(shù)學(xué)和定型工作而言,JavaScript 并不是一個(gè)好選擇。
Node.js 獲勝之處:速度
Node.js 的速度一直很受開(kāi)發(fā)者的歡迎,數(shù)據(jù)輸入和答案輸出的速度如同閃電。Node.js 不需要單獨(dú)設(shè)置線程,也沒(méi)有上鎖等令人頭疼的問(wèn)題,也沒(méi)有拖慢速度的額外開(kāi)銷,只需要寫(xiě)一些簡(jiǎn)單的代碼,Node.js 就會(huì)快速地采取正確的步驟。
Node.js 的回調(diào)模型已經(jīng)改變了其編程方式,使程序員避免同時(shí)操作多個(gè)任務(wù)。JavaScript 引擎能夠確定何時(shí)運(yùn)行什么代碼。因此,程序員可以編寫(xiě)更短和事件驅(qū)動(dòng)的代碼,并且關(guān)注重要的邏輯。
但是 Node.js 也存在一些問(wèn)題,Node.js 代碼要盡可能的簡(jiǎn)單一點(diǎn)且工作正常,因?yàn)槿绻i死了,整個(gè)服務(wù)器都可能鎖死。操作系統(tǒng)開(kāi)發(fā)者努力創(chuàng)建了許多安全網(wǎng)來(lái)抵抗編程錯(cuò)誤,但 Node.js 會(huì)讓這些安全網(wǎng)失效。
此外,當(dāng)程序員將回調(diào)函數(shù)如俄羅斯套娃一層又一層不斷地嵌套時(shí),還會(huì)出現(xiàn)一個(gè)代碼復(fù)雜性的問(wèn)題。一個(gè)回調(diào)還好,但一系列的回調(diào)令人抓狂,好消息是 Promise 模型很容易讀。但你需要記住,在執(zhí)行代碼行期間,許多事情都可能發(fā)生。
Java 獲勝之處:線程
代碼速度快雖然好,但更重要的是代碼要準(zhǔn)確,而使用 Java 可以享受到一些額外功能:
Java 的 Web 服務(wù)器是多線程的。創(chuàng)建多個(gè)線程可能要花費(fèi)時(shí)間和存儲(chǔ),但這是值得的。因?yàn)?,如果一個(gè)線程鎖死了,其它的還可以繼續(xù)用。如果一個(gè)線程需要很久的計(jì)算時(shí)間,那么其它線程可以分擔(dān)。更重要的是,代碼一直在掌管之下,并且能夠進(jìn)行調(diào)整。
如果某一個(gè) Node.js 請(qǐng)求運(yùn)行速度過(guò)慢,其它請(qǐng)求的速度也會(huì)降下來(lái)。Node.js 只有 1 個(gè)線程,因此只有它準(zhǔn)備好了,事件才能被處理?;蛟S它看起來(lái)超級(jí)快,但是本質(zhì)上它的架構(gòu)就如同春節(jié)的時(shí)候,郵局只開(kāi)一個(gè)辦理窗口一樣,即它不能同時(shí)處理多個(gè)請(qǐng)求。
人們花了幾十年構(gòu)建智能的操作系統(tǒng),能夠同時(shí)處理許多不同進(jìn)程的操作系統(tǒng)。那為什么還要回到那個(gè)電腦只能處理單線程的年代呢?的確,處理多個(gè)線程意味著要做更多的工作,但是多線程更強(qiáng)大,不是嗎?
Node.js 獲勝之處:勢(shì)頭
看見(jiàn)硅谷的開(kāi)發(fā)者總是積極獻(xiàn)身于最新和最具顛覆性的東西,但有時(shí)清理掉遺毒也很重要。Java 有新的 IO 例程,但是它也有一些舊的代碼,例如許多小程序和 util 類會(huì)阻擋你前進(jìn)的道路。Node.js 在 Git 庫(kù)中也留下了很多垃圾,但是由于 Node.js 出現(xiàn)的比 Java 晚幾十年,且 Node.js 開(kāi)發(fā)者還在研發(fā)許多針對(duì) Web 堆棧軟件的增強(qiáng)功能,所以,Node.js 動(dòng)力十足。
兩方不分伯仲之處:Java 和 Node.js 之間的交叉編譯
服務(wù)器到底是用 Java 還是 Node.js 的辯論可能還會(huì)持續(xù)很多年,但與其它辯論不同的是,這場(chǎng)辯論可能會(huì)是雙贏的局面。Java 可以交叉編譯到 JavaScript 中去,谷歌就經(jīng)常在 Google Web Toolkit 中這么做,而且谷歌最受歡迎的網(wǎng)站也運(yùn)行著 Java 代碼,這些代碼就是從 Java 翻譯為 JavaScript 的。
當(dāng)然,反過(guò)來(lái)也是如此。JavaScript 引擎如Rhino和 Nashorn同樣在 Java 應(yīng)用里面運(yùn)行 JavaScript,然后你可以鏈接到這些應(yīng)用。如果還不滿足的話,你還可以鏈接到谷歌的V8 引擎。
所有的 Java 和 JavaScript 代碼都可以和諧地彼此鏈接,因此,你不需要在兩者之間選擇。
作者簡(jiǎn)介:Peter Wayner 是 InfoWorld 的特約編輯,并且是 16 本涉及不同主題的書(shū)的作者,包括《開(kāi)源軟件(統(tǒng)統(tǒng)免費(fèi))》,《自動(dòng)化汽車(未來(lái)出行)》,《隱私增強(qiáng)計(jì)算(透明數(shù)據(jù)庫(kù))》,《數(shù)字交易(數(shù)字現(xiàn)金)》,《和隱寫(xiě)術(shù)(密碼學(xué)的消失)》。他的書(shū)定期發(fā)布在 InfoWorld 上,并且他還為許多大小型軟件項(xiàng)目提供咨詢。他關(guān)于機(jī)器人汽車的《未來(lái)出行》這本書(shū)的第二版已經(jīng)出版。
查看英文原文:Node.js vs. Java: An epic battle for developer mindshare
推薦閱讀
開(kāi)發(fā)人員應(yīng)該了解的五款 Julia IDE
推薦閱讀點(diǎn)擊了解更多