dart  javascript  

Jun 4, 2017 • Michael Chen

筆者在某個偶然的機會接觸到 Dart 語言,並用 Dart 實際撰寫一些網頁程式;透過一些使用經驗,筆者覺得 Dart 是一個本質良好的程式語言,甚至, JavaScript 的理想狀態應該就是 Dart。為什麼筆者會如此論述呢?因為 Dart 有著數種優良的特性:

  • 在語法上,Dart 吸收了 JavaScript、Java 和 C# 的優點。JavaScript 中常見的函數式程式 (functional programming) 特性,在 Dart 中都可以使用。但是,Dart 不使用 JavaScript 為人詬病的原型物件 (prototype-based object) 系統,而採用 Java 所用的類別物件 (class-based object) 系統,另外又加上一些 C# 自 Java 改良的部分。但 Dart 不會像 Java 或 C# 般,強制加入物件導向的語法,開發者可自行選擇所習慣的模式 (paradigm)。使用 Dart 撰寫程式,感覺愉悅而有生産力。
  • Dart 內建現代程式語言應有的工具鏈 (toolchain),除了基本的直譯器以外,還包括套件管理程式、程式碼重排工具、語法檢查器、IDE 外掛、測試程式、流程自動化 (透過 Grinder) 等,開發者不需費心在建置環境上,可以專注在開發軟體本身。對比於 JavaScript,開發者時常得耗費心力在工具鏈上,像是流程自動化就有 Grunt 和 Gulp 兩種,模組管理工具則有 Browserify、Bower、CommonJS、RequireJS、SystemJS 等數種,測試程式有 Mocha、Jasmine 等。網路上的教學也相當混雜,使得學習相對不易。
  • Dart 可以轉換成高效率的 JavaScript 程式碼。雖然 Dart 原先是要取代 JavaScript,但這個決定兹事體大,而且網頁技術是兵家必爭之地,讓某家商業公司主導未來的網頁技術,相信各方都不會樂見這個結果。所幸,Dart 可以轉換成 JavaScript,保留和網頁技術接軌的一線生機。使用 Dart 撰寫網頁前端程式,大概就是取代原先 jQuery 的角色,由於 Dart 體質良好,IDE 支援也相當豐富,用 Dart 寫大抵上經驗還算良好。
  • Dart 自帶一個高效率的虛擬機器 (virtual machine)。由於 Dart 的開發者就是原先 Node.js 的 V8 引擎的開發者,有這些相關的經驗,使得 Dart 虛擬機器效能良好,甚至比 Node.js 虛擬機器還要更快。這也意味著,Dart 可以像 JavaScript 般,使用單一語言進行全端 (end to end) 開發。

然而,Dart 除了 Google 大量採用外,其能見度相對不高。在筆者撰寫這篇文章的時間 (2017 年六月),在 TIOBE 的排名約在 21 至 30 名之間,在 PYPL 和 RedMonk 都沒有上前 20 名。筆者實際使用 Dart 撰寫全端網頁程式,在這個過程中,發現一些 Dart 相關議題:

  • 程式設計者的慣性:雖然 Dart 設計良好,但程式設計者往往傾向使用現有的工具解決問題。尤其 Dart 主打網頁前端,而 JavaScript 在網頁前端的地位已不可動搖。在數年來,數個試圖取代 JavaScript 的技術都沒有成功,像是 VBScript、ActiveX、Silverlight、Flash 等。目前 Dart 以 JavaScript 轉譯器的姿態試圖進入前端,但使用 JavaScript 轉譯器會使開發過程變複雜,因程式設計者無法追踨原始碼所在位置,只能透過錯誤訊息來猜測。使用過多語言開發程式對日後的維護也是另外一種壓力。
  • Dart 的定位不佳:Google 先後發布 Polymer 和 Angular 兩個 Dart 前端方案,但在後端卻沒有足夠實用的函式庫或框架。由 Google 所發布的官方教程 (tutorial) 來觀察,撰寫 Dart 後端程式就像是撰寫 Node.js 程式卻不使用 expressjs 或 Sails.js 等,現在網頁框架滿天飛,這種相對低階的開發方式不會受到青睬。而 Dart 前端程式的教學會很詭異,把前端當成單獨的套件來發布,但很少開發者會只寫前端而不搭配某個後端程式。Go (Golang) 網頁程式不需額外的框架,僅需標準函式庫加上 Gorilla 等輕量級套件即可。以 Google 的能力,幫 Dart 加強後端程式的支援應該不會太難。
  • 學習資源過少:這是雞和蛋的議題,總是要先有一批早期使用者撰寫教學文件或書籍,再吸引更多使用者投入,以形成一個程式語言生態圈正向的循環,但 Dart 在這個議題上尚待突破。第一步總是最困難的,但 Go (Golang) 在不到十年的時間,從一個全新的專案到 TIOBE 2016 最佳語言,代表這並不是不可能。Dart 現在已經有網頁前端 (Angular Dart) 和行動端 (Flutter) 的方案,若持續推廣前述專案,再補強網頁後端,Dart 就可以一舉成為網頁全端和行動兩大熱門領域的解決方案。
  • 社群套件過少:這和前述的議題相似,要先有一批先行者撰寫常用的基礎元件,再吸引更多開發者使用 Dart 開發應用程式,透過正向循環,使得 Dart 社群更加茁壯。但是 Dart 在這方面尚待努力。以 MySQL 橋接套件來說,目前的套件相當老舊,而且竟然是以 GPL 發行,對商業應用來說,GPL 套件通常是能不用就不用。目前 Dart 的模板語言 (template language) 僅有 Mustache,而這個語言比起其他語言來說算是比較陽春。另外,Dart 竟然沒有官方的 JWT (JSON Web Token) 套件,而社群套件又相對陳舊。投入 Dart 一陣子就會發現 Dart 其實還有一些努力的空間。

前述的議題都和 Dart 的年紀有關。對於新興語言來說,這些類似的議題都需要一一去克服。但和 Dart 年紀相仿且領域重疊的 TypeScript 出現後,Dart 的生存空間某種程度受到擠壓。可以觀察以下的 Google Trend:

其實 TypeScript 也有一些自己的議題,筆者有機會會再另行撰文。不過,TypeScript 的應用領域比 Dart 來得窄,而其工具鏈也不若 Dart 來得方便,其實 Dart 仍然是有機會突圍。Dart 的本質良好,但某些因素使得 Dart 的普及度仍待加強。對於願意花時間自行撰寫一些套件的開發者來說,Dart 仍然是可以考慮的選項。