一项改变游戏规则的技术 - Flutter( 三 )
为什么Futter采用Dart语言
在了解Dart之前 , 我们先来认识2个概念:AOT , JIT 。
- AOT: Ahead-of-Time
- JIT: Just-in-Time
思考一下 , 在日常开发native app的时候 , 我们希望代码修改可以以最快的速度被看到 , 而不用每一次都需要经历编译 , 打包 , 安装 。 相应地 , 当我们在使用一个native app的时候 , 我希望它能很快响应我的操作 , 比如滑动的时候 , 页面很流畅;动画也会不会卡顿 。
为了满足以上2种需求 , 我们希望拥有一种结合了JIT和AOT的技术 。 事实上 , Dart正是如此 。
在我们开发的时候(debug mode)的时候 , Dart采用JIT的模式 , 我们前面提到的Hot Reload也正是依赖于此 。 Hot Reload的工作原理是通过把修改后的源代码文件塞给Dart的虚拟机(VM) , 等虚拟机根据最新的属性和方法更新类文件之后 , Flutter会自动重新构建组件树(widget tree) , 从而你可以迅速地看到你修改的结果 。
在打包的时候(release mode)的时候 , Dart采用AOT模式 。 AOT模式的好处是使得用户可以在很短的时间内启动App , 在使用App的时候 , 也会很流畅 , 因为所有的东西都已经被编译好了 。
Dart的线程
如果你了解Java , C++ , 或者Swift等 , 你知道这些支持多线程并发的语言 , 采用的是一种叫做抢占式调度(Preemptive scheduling)的机制 。 抢占式调度 , 即操作系统给每一个进程都分配一定的CPU占用时间 , 当进程A的时间已经花完 , 这时候就该轮到进程B来占用CPU了 。 但是 , 当不同的进程或者线程使用了同一个资源(比如同一段内存)就会造成资源竞争(Race condition) 。
资源竞争可以造成严重的后果 , 比如让你的App崩溃掉 , 或者造成数据的丢失 。 经典地解决资源竞争的办法是加锁 , 但是加锁本身又能带来别的问题 , 比如死锁和资源饥饿 。
本文插图
Preemptive Scheduling
Dart则采用了另外一种思路 。 线程到了Dart里面叫做isolate 。 不同的isolate之间是不共享内存的 , 也是独立做垃圾回收的 。
我们的一个Dart程序执行在一个isolate里面 。 在一个isolate里面 , 所有的事件都是通过eventLoop的方式来进行异步处理 。
相应地 , Dart提供futures,async, await来处理异步请求 。 这使得我们在渲染UI的同时 , 可以进行一个HTTP的请求或者读取文件之类的的操作 , 但是不会造成页面的卡顿 。
Dart统一了UI编写
Dart不仅是从语言特性层面为Flutter的性能起到至关重要的作用 , 在对开发效率的提高上也是十分终于的 。 前面我们已经提到了Hot Reload功能以来与Dart的JIT编译模式 , 除此之外Dart统一的UI组件编写方式 , 也对我们日常的开发效率起到了非常大作用 。 我们先来看一段使用Dart编写一个Flutter组件的示例:
本文插图
dart-widget
Dart编写一个组件的方式 , 和iOS , Android , Web端的方式都不一样 。
传统的Web端开发 , 是把一个组件所需要的HTML , CSS ,JavaScript分开到不同的模块里面 。 假如你需要改动css , 你得先跳到css所有的领域(可能是另外一个单独的css文件 , 或者假如你使用vue , 那么就是在这个.vue文件的style模块) 。 然而 , 在Dart里面 , 一个组件的dom , 样式 , 事件处理都是作为一个组件的属性存在 , 他们都是在一个地方 , 既不会分开到不同的文件 , 也不会分开到不同的模块 。
推荐阅读
- 极客微视数码说TB 12预热期!没有充电器和屏幕高刷?粉丝:只求这一点改变,iPhone
- 贪玩_小潘潘|郎导亲承暂不改变退休计划,当下做好训练,只担心一事
- 大漠军武|美国打算购买俄罗斯装备?一个关键信号传来!或将改变世界局势
- 六六途游|我国迎难而上,再度开创一项超级工程,全球竞标24个国家相继退出
- 7月5日|等差数列:5,9,13的下一项是?蚂蚁庄园7月5日答案及解析
- 兵戎要志|其实就是流星空对空导弹,印即将获得“改变南亚天空平衡”的武器
- 我国|中国推出一项禁令,直接令15个国家损失百亿,纷纷请求收回决定
- 我国|直接令15个国家损失百亿,纷纷请求收回决定,中国推出一项禁令
- 江苏以创新驱动发展,用创新改变生活,靠创新引领未来——创新提升小康成色
- |张雨绮傻白甜性格出圈,穿衣也彻底改变,一袭蕾丝裙少女感爆棚
