# 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)}");
}
1
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.
1

一般情况下我们不会将快照持久化使用,主要适用于本地编译提速的,在cli中可以经常看到。当快照失效后应该重新生成。所以说Snapchat只是形式上与class,dex相似,但是本身作用确是不同的。

# 小结

小结一下,Dart作为全平台制霸的Flutter开发语言,是开发Flutter应用必备的语言基础。同时他也可以开发后端程序,命令行工具。 所以只要你对者三者之一感兴趣,就值得学习Dart。

# 参考资料