客官,Dart了解一下

前言

Dart 是一个为全平台构建快速应用的客户端优化的编程语言。--- Dart官方

Dart一开始定位和js一样是作为浏览器端的脚本语言。但是由于js在浏览器端以及因为node.js的出现,成为了全栈的开发语言,因此Dart在浏览器端并没有太多的展现机会,徒叹奈何。

但是Google内部孵化的移动开发框架Flutter以及操作系统Fuchsia中,Dart都是作为官方指定开发语言而展露头角。

JIT与AOT

JIT(Just In Time,即时编译),在开发中使用,可以动态下发和执行代码,开发测试效率高,但是运行速度和执行性能会因为运行时即时编译受到影响。比较有代表性的语言如JavaScript、Python等脚本语言。

AOT(Ahead of Time,运行前编译),代码在执行前可生成直接执行的二进制代码,运行速度快,性能表现优秀,但是每次执行前都需要提前编译,开发测试效率低。代表性的语言是C/C++。

Dart作为后起之秀,重复借鉴了其他语言的优秀部分,同时支持了JIT和AOT。

因此Flutter在开发工程中使用JIT编译,缩短开发周期,其热重载功能正是基于此特性;而在打包发布时采用AOT,提高了执行性能。所以Dart具有运行速度快、执行性能好的特点。

健全的空安全

像很多强类型的语言如Java等,变量必须被声明和赋值后才可以使用,可以防止出现null等异常情况。

Dart 语言已支持健全的空安全机制!

当您选择使用空安全时,代码中的类型将默认是非空的,意味着 除非您声明它们可空,它们的值都不能为空。有了空安全,原本处于您的 运行时 的空值引用错误将变为 编辑时 的分析错误。

Dart 的空安全支持基于以下三条核心原则:

  • 默认不可空。除非您将变量显式声明为可空,否则它一定是非空的类型。我们在研究后发现,非空是目前的 API 中最常见的选择,所以选择了非空作为默认值。

  • 渐进迁移。您可以自由地选择何时进行迁移,多少代码会进行迁移。您可以使用混合模式的空安全,在一个项目中同时使用空安全和非空安全的代码。我们也提供了帮助您进行迁移的工具。

  • 完全可靠。Dart 的空安全是非常可靠的,意味着编译期间包含了很多优化。如果类型系统推断出某个变量不为空,那么它 永远 不为空。当您将整个项目和其依赖完全迁移至空安全后,您会享有健全性带来的所有优势——更少的 BUG、更小的二进制文件以及更快的执行速度。

单线程

没错,Dart是单线程模型。很多高级语言,比如Java, C++以及Objective-C等都是支持并发线程,也就是多线程的,也就是采用抢占式方式切换线程,如果涉及到共享资源, 更新线程间抢占后就可能导致数据不同步的问题。

多线程解决此类问题就是加锁保护资源, 但又可能带来性能损耗,严重的可能导致死锁问题。

而Dart采用单线程模式就不是导致资源竞争和状态同步问题。

Dart中没有线程,只有lsolate(隔离区)。lsolate之间不会共享内存,就像单独运行在不同进程中的worker, 通过事件循环(Event Looper)在事件队列(Event Queue)上传递消息通信。

异步支持

Dart 代码库中有大量返回 Future 或 Stream 对象的函数,这些函数都是 异步 的,它们会在耗时操作(比如I/O)执行完毕前直接返回而不会等待耗时操作执行完毕。

async 和 await 关键字用于实现异步编程,并且让你的代码看起来就像是同步的一样。

内存分配及垃圾回收

Dart VM的内存分配策略简单, 创建对象是只需要在堆上移动指针,内存增长始终是线性的, 省去了查找可用内存的过程。

与JVM内存模型不同的是,dart中每个isolate都有自己的内存空间,其各自的GC不会影响到其他isolate的。所以我们可以通过把部分占用内存空间较大且生命周期较短的对象放在其他isolate中,这样即使另外一个isolate GC了,并不会对我们显示UI的isolate造成影响。

Dart的垃圾回收也是采用了多生代算法,分为新生代和老年代。

新生代中都是生命周期较短,经常需要创建回收的对象, 在进行内存回收时采用的是“半空间”机制,触发回收时,通过(可达性分析算法)判断是否需要回收,将前半空间中“活跃”对象拷贝到备用空间, 然后整体释放当前空间内存。

老年代都是生命周期相对较长,多次回收依旧活跃的对象,老年代采用标记整理的方法来回收对象。

整个回收过程中,Dart只需要操作少量的活跃对象,没有引用大量“死亡”对象则被忽略,这样的回收机制很适合Flutter框架中大量Widget销毁重建的场景。

总结

Dart是一个年轻且十分优秀的后起之秀,集合诸多优秀语言的优点,再有Google的Flutter和Fuchsia的加持推动,相信相关生态建设会更加迅速,也将进一步推动Flutter在全平台的发展。

相关文档:Dart中文文档



--- End --- 

欢迎关注和投稿


本文分享自微信公众号 - 君伟说(wayne90214)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章