Dart 语言的特点
- 它设计之初是为了解决javascript语言本质上无法解决的问题,后来javascript生命力顽强,dart被设计为flutter移动端开发语言
- Dart支持两种编译方式,AOT提前编译和JIT运行时即时编译,AOT可以生成被直接执行的二进制代码,运行速度快,执行性能良好,但因为每次都要提前编译,开发效率低.JIT即时编译,在开发周期中使用,可以动态下发和执行代码,开发测试效率高,但运行速度和执行性能受到即时编译的影响不是很高.比如c C++ 都用的是AOT编译.而python javascript脚本语言都用的是JIT编译.Dart结合了他们两者的优点,在开发周期中使用JIT,比如它的热重载功能,而在发布期使用的是AOT,这样就避免了RN在跨平台javascript和iOS,android之间建立低效的方法调用映射关系.所以Dart具有运行速度快,执行性能好的特点. oc语言也是一种AOT,提前编译成机器码
- Dart的内存分配比较简单,创建对象的时候,只需要在堆上移动指针,内存增长始终是线性的,省去了查找可用内存的过程.Dart的垃圾回收机制采用了多生代算法,新生代采用了“半空间”机制,触发垃圾回收的时候,新生代会将当前半空间上的活跃对象复制到备用空间,然后整体释放当前半空间的所有内存.回收过程中,Dart只需要操作活跃对象,没有引用的大量死亡对象则被忽略.这样的回收机制很适合Dart中Widget大量销毁重建的场景.
- 支持并发执行线程的高级语言,比如oc,大多以抢占式的方式切换线程,即每隔线程都会被分配固定的时间片来执行,超过时间片后,线程的上下文将被抢占后切换.如果这时正在更新线程间的共享资源,抢占后就会导致数据不同步的问题.虽然可以通过线程锁来解决,但是线程锁也要消耗一定的性能,还容易造成死锁的情况出现.而Dart是单线程模式.它天然不存在资源竞争和状态同步的问题.Dart中并没有线程,它采用的是隔离区的方式,隔离区之间不会共享内存,就像几个运行在不同进程中的worker.通过事件循环在事件队列间传递消息.
- C++ 与 Java 的做法是,提供函数的重载,即提供同名但参数不同的函数。但 Dart 认为重载会导致混乱,因此从设计之初就不支持重载,而是提供了可选命名参数和可选参数。给参数增加{},以 paramName: value 的方式指定调用参数,也就是可选命名参数;给参数增加[],则意味着这些参数是可以忽略的,也就是可选参数。
- 其实,除了继承和接口实现之外,Dart 还提供了另一种机制来实现类的复用,即“混入”(Mixin)
- flutter的视图渲染由三部分构成,widget和element和randerObject.widget是不可变的,分为statelessWidget和StatefulWidget.前者渲染不需要状态变化的静态视图,比如弹出框.后者渲染需要状态变化的视图,比如checkbox和image和视图根据网络请求数据返回而改变.element是widget一个实例化对象,充当桥梁的作用.element主要处理widget上需要改变的元素,然后调用randerObject,然后randerObject调用skia去执行渲染.