前言
前两天写了几篇文章,谈了谈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
更适合开发后端?
这个问题,以后再说。