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