本文最初發(fā)布于 Peter Wayner 博客,經(jīng)原作者授權(quán)由 InfoQ 中文站翻譯并分享。
在計(jì)算歷史上,1995 年是一段瘋狂的歲月。首先 Java 出現(xiàn)了,隨后 JavaScript 也出現(xiàn)了。Java 和 JavaScript 的名字看起來(lái)像是一對(duì)雙胞胎,但實(shí)際上它們差別巨大,Java 是被編寫和靜態(tài)定型的,而 JavaScript 則是被解釋和動(dòng)態(tài)定型的。但這僅僅是這兩個(gè)完全不同的語(yǔ)言的技術(shù)差別的一個(gè)開始,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)沒有統(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 誕生了,大大提高了開發(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)題,可能有些開發(fā)者會(huì)有質(zhì)疑。當(dāng)然,我們不否認(rèn) Java 還存在一些小 Bug,但是相對(duì)而言,Java 已經(jīng)算是很“堅(jiān)固”的了,Node.js 想要讓我擁有這樣的信心,還需要許多年。
事實(shí)上,要寫出與 Sun/Oracle 在測(cè)試 Java 虛擬機(jī)時(shí)所寫數(shù)量相同的回歸測(cè)試,JavaScript 開發(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í),開發(fā)者的時(shí)間大部分花在了打磨邊邊角角上面。然而,所有的創(chuàng)新都有一個(gè)缺點(diǎn),那就是新的功能可能擴(kuò)散太快,以至于開發(fā)者們來(lái)不及吸收這些功能。一些老派的開發(fā)者經(jīng)常會(huì)對(duì)充斥著最新 ECMAScript 句法的增強(qiáng)特性感到困惑。另外,這些新代碼可能還會(huì)導(dǎo)致某些舊版瀏覽器崩潰。
創(chuàng)新性的預(yù)處理器,如 CoffeeScript 和 JSX 等,源源不斷地出現(xiàn),對(duì)于需要這些功能的開發(fā)者來(lái)說(shuō)是件好事,但是對(duì)于不需要的開發(fā)者來(lái)說(shuō)增加了難度。
盡管 Java 也在不斷推出新的功能和選項(xiàng),但總體而言,它是一個(gè)穩(wěn)定的平臺(tái),它給那些需要開發(fā)更長(zhǎng)久的東西的開發(fā)者帶來(lái)了便利。
Node.js 獲勝之處:普遍性多虧了 Node.js,JavaScript 在服務(wù)器以及瀏覽器領(lǐng)域找到了一席之地。你給服務(wù)器寫的代碼很可能在瀏覽器上也能運(yùn)行。很明顯,比起在 Java 和 JavaScript 中分別寫代碼,直接使用 JavaScript 更簡(jiǎn)單。
如果你決定要把 Java 中的服務(wù)器業(yè)務(wù)邏輯遷移到瀏覽器中,或者老板執(zhí)意要你把給瀏覽器寫的邏輯遷移到服務(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 獲勝之處:更好的集成開發(fā)環(huán)境 (IDE)Java 開發(fā)者擁有三大 IDE,Eclipse、NetBeans 和 IntelliJ,這三個(gè) IDE 是與調(diào)試程序、反編譯器和服務(wù)器良好地集成的頂尖工具。每個(gè)工具都經(jīng)過(guò)了數(shù)年的開發(fā),擁有忠實(shí)的用戶、堅(jiān)固的生態(tài)系統(tǒng)和數(shù)不盡的插件。
大多數(shù) Node.js 開發(fā)者會(huì)將文字輸入命令行,再編碼到他們最喜愛的文本編輯器中。誠(chéng)然,市面上最好的一些文本編輯器,像 Atom,都擁有琳瑯滿目且?guī)缀鯚o(wú)所不能的插件,但如果和 Eclipse 進(jìn)行比較,Node.js 給人的感覺要更老式一些。在不久的將來(lái),Atari 操縱桿將代替我們的鼠標(biāo)。
另外,有些 Node.js 開發(fā)者會(huì)使用 Eclipse 或 Visual Studio。開發(fā)者對(duì) Node.js 突然激增的興趣可能會(huì)有新工具誕生,例如IBM 的 Node-RED 給我們提供了一些極具吸引力的方法,但是這些工具還遠(yuǎn)未達(dá)到像 Eclipse 或 IntelliJ 那樣的完整度和統(tǒng)治地位。
但奇怪的是,開發(fā)者好像并沒有使用這些工具。命令行本該在 35 年前 Mac 到來(lái)時(shí)就消失,但卻沒人把這個(gè)消息告訴 Node.js 的開發(fā)者們。但是選擇一直都在那里。例如,WebStorm 就是一個(gè)可靠的由 JetBrains 開發(fā)的商業(yè)化工具,它集成了許多命令行構(gòu)建工具。
當(dāng)然,如果你正在尋找一款能夠編輯和調(diào)整代碼的集成開發(fā)環(huán)境,那么現(xiàn)在支持 Node.js 的新工具已經(jīng)足夠使用了。但如果你希望集成開發(fā)環(huán)境能夠讓你一邊操作正在運(yùn)行的源代碼,一邊編輯代碼,那么 Java 的工具顯然會(huì)更強(qiáng)大一些。
Node.js 獲勝之處:數(shù)據(jù)庫(kù)查詢一些較新的數(shù)據(jù)庫(kù),如 CouchDB 和 MongoDB 的查詢是由 JavaScript 編寫的。將 Node.js 和數(shù)據(jù)庫(kù)調(diào)用合并不需要任何換擋,也不需要記住任何句法差異。
而許多 Java 開發(fā)者都在使用 SQL。即使是在他們使用 Java DB——前身是 Derby (一種由 Java 編寫的數(shù)據(jù)庫(kù))時(shí),他們的查詢也是用 SQL 寫的。你可能會(huì)以為他們會(huì)簡(jiǎn)單地調(diào)用 Java 方法,但其實(shí)沒有,開發(fā)者必須要用 SQL 寫數(shù)據(jù)庫(kù)代碼,然后再用 Derby 解析 SQL。 雖然 SQL 是很好的語(yǔ)言,但是它與 Java 完全不同,許多開發(fā)團(tuán)隊(duì)需要有不同的人來(lái)分別寫 SQL 和 Java。
更糟糕的是,許多 Java 程序員使用復(fù)雜的庫(kù)和模式來(lái)將 SQL 查詢數(shù)據(jù)轉(zhuǎn)換成 Java 對(duì)象,目的是讓自己能夠?qū)⑦@些東西重新導(dǎo)入到模板中。這個(gè)過(guò)程非常瘋狂,而且非常浪費(fèi)。
Java 獲勝之處:類型許多入門級(jí)的編程課程都使用 Java,因?yàn)樵S多程序員都喜歡靜態(tài)類型編碼,靜態(tài)類型編碼很簡(jiǎn)潔而且安全。在編譯器找出了一些明顯的 bug 后,代碼看起來(lái)更加嚴(yán)謹(jǐn)了。
不過(guò),JavaScript 也在追趕,一些開發(fā)者已經(jīng)轉(zhuǎn)到 TypeScript。TypeScript 是一個(gè)靜態(tài)類型的 JavaScript 超集,首先會(huì)應(yīng)用所有的類型檢查手段,然后剔除掉運(yùn)行在瀏覽器上的 JavaScript 堆棧中的一些東西。
對(duì)于喜歡類型的開發(fā)者來(lái)說(shuō),TypeScript 足以讓你喜歡上 JavaScript。當(dāng)然,你可以把 JavaScript 這種模仿視為是對(duì) Java 最真誠(chéng)的恭維,并且繼續(xù)使用 Java,因?yàn)?Java 從一開始就是使用靜態(tài)類型的。
Node.js 獲勝之處:語(yǔ)法靈活性JavaScript 曾經(jīng)是一個(gè)簡(jiǎn)單的語(yǔ)言,用于彈出警示框和雙重檢查輸入表。后來(lái),開發(fā)者社區(qū)創(chuàng)造了 JavaScript 的許多不同版本,它們能夠被轉(zhuǎn)編譯為瀏覽器可用的東西。例如,CoffeeScript 提供了一些不同的句法,旨在使標(biāo)點(diǎn)符號(hào)更加清晰。React/Vue 群體將 HTML 和 JavaScript 混合。此外,還有針對(duì)類型愛好者的 TypeScript 和針對(duì)功能語(yǔ)言信徒的 LiveScript。
而在 Java 中,你會(huì)發(fā)現(xiàn)有很多創(chuàng)新,但這些創(chuàng)新由于某些原因,并未用預(yù)處理器進(jìn)行表達(dá)。還有一些語(yǔ)言如 Kotlin、Scala 和 Clojure,為了 JVM 專門變成了字節(jié)代碼,但不知為何,它們可以說(shuō)是完全獨(dú)立的語(yǔ)言。對(duì)于喜歡嘗試不同的代碼編寫方式或標(biāo)點(diǎn)符號(hào)的 JavaScript 程序員來(lái)說(shuō),所有的預(yù)處理器均使他們的生活變得更加有趣了。
Java 獲勝之處:簡(jiǎn)單的構(gòu)建流程
復(fù)雜的構(gòu)建工具如 Ant 和 Maven 使 Java 編程發(fā)生了革命。但還是有一個(gè)問題,開發(fā)者需要將說(shuō)明用 XML 寫出來(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 開發(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ò)程,但給人的感覺不會(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ì)象。開發(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è)主要的解析器,這給開發(fā)者帶來(lái)了更多的煩惱。
如今,許多 Web 服務(wù)和數(shù)據(jù)庫(kù)都以JSON的形式返回?cái)?shù)據(jù),JSON 是 JavaScript 天然的一部分。JSON 現(xiàn)在非常常見和有用,以至于許多 Java 開發(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 文件。總體來(lái)說(shuō),桌面領(lǐng)域大體上是不用 Java 的。另一方面,隨著瀏覽器取代了桌面的大部分角色,JavaScript 的作用也越來(lái)越大。當(dāng)微軟重寫了 Office 并使其能夠在瀏覽器上運(yùn)行時(shí),一切就注定了。如果你還想了解更多,那么市面上還有許多有趣的選擇,比如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ī)上的移動(dòng)瀏覽器上。如果這些應(yīng)用寫得比較好,性能通常會(huì)比較好。但 Java 正以另外的一種方式入侵。最新的 Chromebook 將支持安卓應(yīng)用,從而給 Java 開發(fā)者進(jìn)入 Chromebook 用戶的桌面開辟了道路。那么 Java 是否仍有機(jī)會(huì)征服桌面呢?
Node.js 獲勝之處:庫(kù)Java 提供了大量的庫(kù),而且這些庫(kù)做得都非常好,文本索引工具如 Lucene 和計(jì)算機(jī)視覺工具包如 OpenCV 都是非常好的開源項(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 寫的。Sun 公司花了大量的時(shí)間來(lái)獲取工具類的詳情。市場(chǎng)上有 BigIntegers、精巧的 IO 例程和復(fù)雜的日期代碼,它們均實(shí)現(xiàn)了格里高里和羅馬儒略日歷。
JavaScript 適合簡(jiǎn)單的任務(wù),但是其內(nèi)部有很多令人混淆的地方。舉一個(gè)簡(jiǎn)單的例子,JavaScript 針對(duì)沒有答案的函數(shù)會(huì)生成三種不同的答案,分別是:undefined、NaN 和 null。那么,哪一個(gè)是正確的呢?其實(shí)每個(gè)答案都有各自的作用,其中一個(gè)便是驅(qū)使程序員保持代碼統(tǒng)一。JavaScript 更怪異的方面是雖然它在簡(jiǎn)單的表格工作很少出問題,但對(duì)于復(fù)雜的數(shù)學(xué)和定型工作而言,JavaScript 并不是一個(gè)好選擇。
Node.js 獲勝之處:速度Node.js 的速度一直很受開發(fā)者的歡迎,數(shù)據(jù)輸入和答案輸出的速度如同閃電。Node.js 不需要單獨(dú)設(shè)置線程,也沒有上鎖等令人頭疼的問題,也沒有拖慢速度的額外開銷,只需要寫一些簡(jiǎn)單的代碼,Node.js 就會(huì)快速地采取正確的步驟。
Node.js 的回調(diào)模型已經(jīng)改變了其編程方式,使程序員避免同時(shí)操作多個(gè)任務(wù)。JavaScript 引擎能夠確定何時(shí)運(yùn)行什么代碼。因此,程序員可以編寫更短和事件驅(qū)動(dòng)的代碼,并且關(guān)注重要的邏輯。
但是 Node.js 也存在一些問題,Node.js 代碼要盡可能的簡(jiǎn)單一點(diǎn)且工作正常,因?yàn)槿绻i死了,整個(gè)服務(wù)器都可能鎖死。操作系統(tǒng)開發(fā)者努力創(chuàng)建了許多安全網(wǎng)來(lái)抵抗編程錯(cuò)誤,但 Node.js 會(huì)讓這些安全網(wǎng)失效。
此外,當(dāng)程序員將回調(diào)函數(shù)如俄羅斯套娃一層又一層不斷地嵌套時(shí),還會(huì)出現(xiàn)一個(gè)代碼復(fù)雜性的問題。一個(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í)候,郵局只開一個(gè)辦理窗口一樣,即它不能同時(shí)處理多個(gè)請(qǐng)求。
人們花了幾十年構(gòu)建智能的操作系統(tǒng),能夠同時(shí)處理許多不同進(jìn)程的操作系統(tǒng)。那為什么還要回到那個(gè)電腦只能處理單線程的年代呢?的確,處理多個(gè)線程意味著要做更多的工作,但是多線程更強(qiáng)大,不是嗎?
Node.js 獲勝之處:勢(shì)頭看見硅谷的開發(fā)者總是積極獻(xiàn)身于最新和最具顛覆性的東西,但有時(shí)清理掉遺毒也很重要。Java 有新的 IO 例程,但是它也有一些舊的代碼,例如許多小程序和 util 類會(huì)阻擋你前進(jìn)的道路。Node.js 在 Git 庫(kù)中也留下了很多垃圾,但是由于 Node.js 出現(xiàn)的比 Java 晚幾十年,且 Node.js 開發(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 本涉及不同主題的書的作者,包括《開源軟件(統(tǒng)統(tǒng)免費(fèi))》,《自動(dòng)化汽車(未來(lái)出行)》,《隱私增強(qiáng)計(jì)算(透明數(shù)據(jù)庫(kù))》,《數(shù)字交易(數(shù)字現(xiàn)金)》,《和隱寫術(shù)(密碼學(xué)的消失)》。他的書定期發(fā)布在 InfoWorld 上,并且他還為許多大小型軟件項(xiàng)目提供咨詢。他關(guān)于機(jī)器人汽車的《未來(lái)出行》這本書的第二版已經(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)系站長(zhǎng)刪除。
轉(zhuǎn)載請(qǐng)注明出處http://macbookprostickers.com/xintu/504.html