Dart
Dart 是一种强类型、跨平台的客户端开发语言。具有专门为客户端优化、高生产力、快速高效、可移植(兼容ARM/x86)、易学的OO编程风格和原生支持响应式编程(Stream & Future)等优秀特性。Dart主要由Google负责开发和维护,在 2011年10启动项目 ,2017年9月发布第一个2.0-dev版本。
Dart本身提供了三种运行方式:
-
使用Dart2js编译成JavaScript代码,运行在常规浏览器中( Dart Web )。
-
使用DartVM直接在命令行中运行Dart代码( DartVM )。
-
AOT方式编译成机器码,例如Flutter App框架( Flutter )。
Flutter在筛选了20多种语言后,最终选择Dart作为开发语言主要有几个原因:
-
健全的类型系统,同时支持静态类型检查和运行时类型检查。
-
代码体积优化(Tree Shaking),编译时只保留运行时需要调用的代码(不允许反射这样的隐式引用),所以庞大的Widgets库不会造成发布体积过大。
-
丰富的底层库,Dart自身提供了非常多的库。
-
多生代无锁垃圾回收器,专门为UI框架中常见的大量Widgets对象创建和销毁优化。
-
跨平台,iOS和Android共用一套代码。
-
JIT & AOT运行模式,支持开发时的快速迭代和正式发布后最大程度发挥硬件性能。
在Dart中,有一些重要的基本概念需要了解:
-
所有变量的值都是对象,也就是类的实例。甚至数字、函数和null也都是对象,都继承自 Object 类。
-
虽然Dart是强类型语言,但是显式变量类型声明是可选的,Dart支持类型推断。如果不想使用类型推断,可以用dynamic 类型。
-
Dart支持泛型,List表示包含int类型的列表,List则表示包含任意类型的列表。
-
Dart支持顶层(top-level)函数和类成员函数,也支持嵌套函数和本地函数。
-
Dart支持顶层变量和类成员变量。
-
Dart没有public、protected和private这些关键字,使用下划线“_”开头的变量或者函数,表示只在库内可见。参考 库和可见性 。
DartVM的内存分配策略非常简单,创建对象时只需要在现有堆上移动指针,内存增长始终是线形的,省去了查找可用内存段的过程:
Dart中类似线程的概念叫做Isolate,每个Isolate之间是无法共享内存的,所以这种分配策略可以让Dart实现无锁的快速分配。
Dart的垃圾回收也采用了多生代算法,新生代在回收内存时采用了“半空间”算法,触发垃圾回收时Dart会将当前半空间中的“活跃”对象拷贝到备用空间,然后整体释放当前空间的所有内存:
整个过程中Dart只需要操作少量的“活跃”对象,大量的没有引用的“死亡”对象则被忽略,这种算法也非常适合Flutter框架中大量Widget重建的场景。