# Dart可以做哪些事
# 引言
学习任何一门语言都是有成本的,编程语言这么多,你选择哪一门呢?经常有人开玩笑说,小孩子才做选择,成年人都要。
可惜这句话在编程之路上水土不服,如果都去学肯定不现实。科班出身的程序员,在大学里几乎都学过C、C++、Java这三门语言,我知道很多人学完就还给学校了,当你最终走上职场之后,主要还是深入学习、使用一,两门语言。学校学习的语言未必是你工作中使用的语言,但是这段学习经历为你开启编程之路奠定了基础。今后无论你是从事后端开发,还是用Java开发Android程序,用Objective-C 开发iOS程序,或则用JavaScript开发网页,小程序等等。你的启蒙老师大概率都是C语言,应该还有很多人记得“谭浩强”老师吧😎。
那么学习Dart之前,我们确实也应该问一下自己:
Dart可以做哪些事情?
这问题的背后不单是了解Dart的语言背景,更多的是进一步确定Dart值不值得你投入精力去学习。对你的职业生涯有无益处。
# Dart发展历史
Dart并不是什么新鲜事物,早在Flutter流行起来前,Dart就已然存在了。
根据维基百科显示,2011年10月Dart (opens new window)诞生,到如今(2020年)已经有9年历史了。Dart 1.0于2013 (opens new window)年正式发布,而Java老大哥在1996年就发布了JDK 1.0。所以相对传统编程语言来说Dart,毫无疑问是一门年轻的语言。
到今天(2020),Dart的最新稳定版本是v2.10 (opens new window)
目前Dart正处于快速发展当中,和其他语言的节奏不太一样,一年能发好几个正式版,下面是Dart创以来的一些重要发行版本情况。
版本 | 时间 | 备注 |
---|---|---|
Dart | 2011 | 语言初创 |
Dart 1.0 | 2013 | 第一个正式版 |
Dart 2.0 | 2018 | Sound Type System (opens new window) |
Dart 2.6 | 2019 | 支持编译机器码 dart2native |
Dart 2.7 | 2019 | 支持扩展函数 extension (opens new window) |
Dart 2.10 | 2020 | 当前稳定版本 |
Dart 2.12 Beta | 2020 | 空安全预览版 null safty beta (opens new window) |
Dart向下兼容性不算特别稳定,根本版本号的命名大也可以感知一二,1到2是基本不兼容,需要单独迁移。2.6和2.7都是比较重要的版本,引入的新的语法特性和编译工具。 目前还处于Beta状态的v2.12是空安全的预览版,支持空安全需要循序渐进,上游依赖库迁移后,项目方可迁移。
当然还有一些版本没列出来,感兴趣的读者可以去官网,查阅版本变更记录:Dart language evolution (opens new window)
# Dart适用范围
相信来到这儿的开发者,基本都是因为Flutter。对移动开发者来说,Dart最重要的一点就是,他是Flutter开发的官方语言。所以Flutter涉及的范围都是Dart的适用范围。这包括
- Flutter:移动端开发Android、iOS
- Flutter Web:前端网页开发Web
- Flutter Desktop:PC桌面端开发
抛开Flutter,就是纯Dart的空间了:
- Dart Web 传统前后台端开发,更推荐Flutter Web
- Dart Server 后端开发
- Dart CLI 命令行工具
得益于dart2native,dart除了可以开发cli命令行工具,还可以生成平台可执行的二进制文件。
# Dart语言
前面提到过Dart的向下兼容性。Dart语言上手比较简单,他有点像Java,和Swift,JavaScript也有点相似。虽然和Golang都是出自Google公司,但是学习成本确实不一样,在Golang中一个变量声明就得你适应好一会。
下面这段代码,出自https://dart.dev/#try-dart (opens new window), 大家可以自己体会下,你要你看得懂C,读这段代码就没有难度😁
// A function declaration.
int timesTwo(int x) {
return x * 2;
}
// Arrow syntax is shorthand for `{ return expr; }`.
int timesFour(int x) => timesTwo(timesTwo(x));
// Functions are objects.
int runTwice(int x, int Function(int) f) {
for (var i = 0; i < 2; i++) {
x = f(x);
}
return x;
}
main() {
print("4 times two is ${timesTwo(4)}");
print("4 times four is ${timesFour(4)}");
print("2 x 2 x 2 is ${runTwice(2, timesTwo)}");
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Dart编译产物特别多,其中有一个经常被提到的就是snapshot,这个产物形式有点类似于Java里面的class,Android里面的dex。
那为什么说是形式上呢?
snapshot是dart的Kernel产物,DartVM可以直接识别,它将所有dart源码编译后全部整合在一个文件中。但是他却并不是跨版本兼容的,无论向上还是向下,都是不兼容的。如果尝试用不同的dart运行时去执行,会出现类似下面的异常提示:
Can't load Kernel binary: Invalid kernel binary format version.
一般情况下我们不会将快照持久化使用,主要适用于本地编译提速的,在cli中可以经常看到。当快照失效后应该重新生成。所以说Snapchat只是形式上与class,dex相似,但是本身作用确是不同的。
# 小结
小结一下,Dart作为全平台制霸的Flutter开发语言,是开发Flutter应用必备的语言基础。同时他也可以开发后端程序,命令行工具。 所以只要你对者三者之一感兴趣,就值得学习Dart。