近日,Node.js 創始人 Ryan Dahl 在社群以“JavaScript Containers”為題發文談論了自己對 Javascript 容器的看法 —— Javascript 是通用指令碼語言的“未來”,而 Javascript 容器則是簡化伺服器抽象的“先驅”踐行者。
眾所周知,大多數伺服器程式都執行的是 Linux 系統,它們由一個檔案系統、一些可執行檔案、一些共享庫組成,它們可能與 systemd 或 nsswitch 等系統軟體介面。
但由於伺服器軟體通常依賴於許多系統資源和配置,因此在過去部署它一直是一項挑戰。而 Linux 容器的出現,就很好的解決了這個問題。特別是 Docker 進一步讓 Linux 容器的使用得到普及後,作業系統級的虛擬化為分發伺服器軟體提供了極好的機制,每個容器映像都是一個無依賴性的隨時可以執行的軟體包。
Ryan Dahl 表示,儘管是在更高的抽象級別上,但 browser JavaScript 中也依舊能找到類似的封閉環境。直到 2018年,Cloudflare 的 Zack Bloom 推出了 Workers 服務,這才“促使我們思考 JavaScript 本身能否能提供一種新型的自給自足的伺服器容器” —— “我們越能消除不必要的抽象,就越能接近‘The Network Is the Computer’的概念。
JavaScript 是通用指令碼語言的“未來”
Ryan Dahl 認為,技術很難預測,但 World Wide Web (全球資訊網、廣域網)肯定會在 10 年後出現。隨著越來越多的人類基礎設施通過網路應用連線在一起,10 年後 HTTP、HTML、CSS、JavaScript 這些構成網路的標準肯定也會出現。因此,“我相信 JavaScript 將會繼續得到開發和改進”。
我們知道,網路是人類資訊的基本媒介,指令碼語言則像是驅動網路發展的“基石”,這其中,JavaScript 不同於其他程式語言,因為它與這個基礎設施緊密相連。
指令碼語言對於解決許多伺服器端問題很有意義,它允許更快、更便宜地編寫業務邏輯,但大多數正在編寫的程式碼不受計算的限制,而是受生產力的限制 —— 編寫速度和開發人員的金錢成本。
指令碼語言(Python、Ruby、Lua、Shell、Perl、Smalltalk、JavaScript)非常相似,在語法和 API 方面存在差異,但幾乎沒有其他可以與之對比的地方。這一點,相信每一位在 Rust 或 C 中工作過的人都能理解指令碼語言的感受。
Ryan Dahl 總結稱,指令碼語言很有用,但它們幾乎都是一樣的,其中 “JavaScript 的使用要廣泛得多,而且是未來的證明。因此,將 JavaScript視為通用指令碼語言是有道理的”。
伺服器軟體高階別容器:JavaScript 沙箱
Javascript 中的沙箱並非傳統意義上的沙箱,它是一種語法上的 hack 寫法,指 Javascript 中處理模組依賴關係的閉包。
JavaScript 沙箱本身這個“容器”並非為了解決 Linux 容器所針對的問題,它的出現是其簡單化的結果 —— 最小化了 web 服務業務邏輯的樣板檔案,它與瀏覽器共享概念,並減少程式設計師需要知道的概念(如在編寫web服務時,很可能任何 systemd 配置都只是不必要的樣板)。
提起 JavaScript browser API,相信每個網路開發者都知道,因為 JavaScript 容器抽象是在相同的 browser API 上構建的,所以開發者需要的經驗總量減少了,這恰恰是 Javascript 的通用性降低了其複雜性。
在這個新伺服器抽象層中,JavaScript 取代了 Shell,且比 Bash/Zsh 更適合編寫指令碼。JavaScript 沙箱可以呼叫 Wasm,而非像 Shell 那樣呼叫 Linux 可執行檔案。
綜述
不可否認,JavaScript 是通用的指令碼語言,也正是由於 JavaScript 的普遍性,一種新的類似容器的抽象正在出現 —— JavaScript 容器,它簡化了伺服器。
JavaScript 容器的出現並非意味著 Linux 容器正在“消亡”,這種抽象層次總是有用的。特別是對於編寫的許多“業務邏輯”的開發者來說,當你建立一個網站的時候,或許大多數“web服務”可以通過使用 JavaScript 容器而不是 Linux 容器來簡化。
目前,為了試圖從根本上簡化伺服器抽象,為了進一步探索這些想法,JavaScript 容器或許就是一種“先驅”踐行者。你是否也這麼覺得呢?歡迎在評論區留言互動。