1. 程式人生 > 其它 >持續發燒,聊聊Dart語言的靜態編譯,能挑戰Go不?

持續發燒,聊聊Dart語言的靜態編譯,能挑戰Go不?

前言

前兩天寫了幾篇文章,談了談Dart做後端開發的優勢,比如:

《Dart開發服務端,我是不是發燒(騷)了?》

《持續發燒,試試Dart語言的非同步操作,效率提升500%》

《持續發燒,聊聊Dart語言的併發處理,能挑戰Go不?》

如果沒有看過的同學,可以先看一下。

今天,我們再來談談 Dart 的另外一大優勢,那就是靜態編譯。估計 phppython 直接認輸, javago 冷眼旁觀?

提前預告,內容略幹,請自帶礦泉水。

Dart 語言支援哪些編譯方式

目前主流的開發語言,一般來說要麼支援 JIT 模式,要麼支援 AOT 模式,要麼兩種都支援。

照顧小白, 稍稍解釋下名詞

JIT

即是 Just-In-Time, 實時編譯,簡稱 解釋型,簡單的說就是程式碼執行後,邊編譯程式碼邊執行程式碼,優點便於開發除錯,缺點是執行效率不太行

AOT 即是 Ahead-Of-Time, 預先編譯,簡稱 編譯型, 簡單說是程式碼執行前就編譯程式碼,優點是執行效率高點,但是開發除錯不友好

主流的後端語言,從 實際使用 上來說:

php, python 都是 解釋型, 實際開發的時候,程式碼寫的非常爽,但總是被抱怨效能低

java, go 都是 編譯型, 總是被抱怨編譯一次,出門打個架都還沒結束,我說的是 java

面對這樣的情況,機智的同學看出來了,那開發的時候使用 JIT模式, 執行的時候使用 AOT

模式不就好了嗎,開發除錯也方便了,執行效率也高了?

不錯不錯,小夥子你頗具慧根,你是對的,Dart 也是這樣做的。

如何編譯 Dart 編寫的程式

當你使用 Dart 編寫好應用程式後,可以使用 dart compile 命令來編譯成最終檔案

比如使用如下命令直接編譯成 exe 檔案

dart compile exe bin/main.dart

將得到 main.exe 檔案,該檔案可以在 win 平臺直接執行, 但是它不能在 linux 下執行

那能不能編譯成通用的,各平臺都通用的檔案呢? 當然可以。

執行如下命令

dart compile kernel bin/main.dart

將得到 main.dill

檔案,它是個二進位制檔案,可以在所有平臺,所有CPU架構使用。

熟悉 go 的同學一臉茫然,抄我的?

當然,你也可以執行下面的命令,將其編譯成 aot 檔案

dart compile aot-snapshot bin/main.dart

它有一個不好的地方,win平臺編譯的aot檔案,不能在linux下使用。

同理, linux 下編譯的不能在win下使用。

當然,它最好的地方是效能最好,所以也是最推薦使用的。

還有哪些需要補充的嗎

有的。

Dart 的官方文件中,關於編譯的頁面,有特別提醒

https://dart.dev/tools/dart-compile

就是這個頁面,其中有這樣的描述,請一定要注意:

The exe and aot-snapshot subcommands have some known limitations:
...
No support for dart:mirrors and dart:developer
...

意思是說,exe, aot 兩種模式下,有一些侷限性,比如:

不支援 dart:mirrors 反射
不支援 dart:developer 開發者工具

有一些同學可能天天都是寫基本的增刪改查,估計不知道 反射 有什麼用。

實際上用處非常大,包括 java 領域裡 SpringBoot 框架, PHP 領域裡的 Laravel 框架,在實際執行的時候,都需要使用到 反射 功能,來獲取執行的類的屬性資訊,方法資訊,以完成一些自動化處理。

然而, Dart 禁用了 反射,這就給框架編寫帶來了非常大的不便。

當然,Dart 給出的理由是,禁用 反射, 一是這個庫還不穩定,二是可以提高效能。

嗯嗯,我信了。

總結

Dart 的編譯方式還算主流,充分考慮了易用和效能,沒有硬傷,不像PHP在這方面受人詬病,為後端開發鋪平了道路。

加上文章開頭提高的其他兩大特性,非同步併發,所以我在公司主力推薦使用 Dart

有同學該說了,好好的 Java 為什麼不用, Dart 還能比 Java 更適合開發後端?

這個問題,以後再說。