持續發燒,聊聊Dart語言的靜態編譯,能挑戰Go不?
前言
前兩天寫了幾篇文章,談了談Dart
做後端開發的優勢,比如:
《Dart開發服務端,我是不是發燒(騷)了?》
《持續發燒,試試Dart語言的非同步操作,效率提升500%》
《持續發燒,聊聊Dart語言的併發處理,能挑戰Go不?》
如果沒有看過的同學,可以先看一下。
今天,我們再來談談 Dart
的另外一大優勢,那就是靜態編譯。估計 php
和 python
直接認輸, java
和 go
冷眼旁觀?
提前預告,內容略幹,請自帶礦泉水。
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
更適合開發後端?
這個問題,以後再說。