Dart语言概览

前面对Dart语言的基本语法做了简单介绍,本篇文章我们站在一个更高的维度来聊一聊Dart。

在学习一门新技术的时候,千万不要陷入细节里。我们学习一门语言,并不是为了成为语言专家,而是为了解决实际问题。通过几天的学习,在了解了一门语言是如何表达信息和处理信息之后,去实践,去边做边学就OK了。

Dart是什么?

2011年10月,在丹麦召开的GOTO大会上,Google发布了一种新的编程语言——Dart。如同Kotlin和Swift的出现,分别是为了解决Java和Objective-C在编写应用程序的一些实际问题一样,Dart的诞生正是要解决JavaScript存在的、在其语言本质上无法改进的缺陷

JavaScript之父 布兰登 艾克(Brendan Eich)曾在一次采访中说:JavaScript几天就设计出来了。由于设计时间太短,很多细节考虑不完善,导致后来很长一段时间,使用JavaScript开发的程序混乱不堪。出于对JavaScript的不满,Google程序员们决定自己写一个新的语言来换掉它,所以Dart的最初定位也是一种运行在浏览器中的脚本语言

而为了推广Dart,Google甚至将自己的Chrome浏览器内置了Dart VM,可以直接高效地运行Dart代码。而对于普通浏览器来说,Google也提供了一套能够将Dart代码编译成JavaScript的转换工具。这样一来,开发者们就可以毫无顾虑地去使用Dart进行开发了,而不必担心兼容问题。再加上出身名门,Dart在一开始就赢得了部分前端开发者的关注。

但是,JavaScript的生命力似乎比预想的更强大。

原本JavaScript只能在浏览器中运行,但是Node.js的出现让它开始有能力运行在服务端,很快手机应用与桌面应用也成为了JavaScript的宿主容器,一些明星项目比如React、React Native、Vue等框架如雨后春笋般崛起,迅速扩展了它的边界。

于是,JavaScript成为了前后端通吃的全栈语言。就如同Atwood定律描述的:凡是能用JavaScript写出来的系统,最终都会用JavaScript写出来。

JavaScript因为Node.js焕发了第二春,而Dart就没有这么好的运气了。由于缺少顶级项目的使用,Dart始终不温不火。2015年,在听取了大量开发者的反馈之后,Google决定将内置的Dart VM引擎从Chrome中移除,这对Dart发展来说是重大挫折,代理JavaScript就更无从谈起了。

但,Dart也借此机会开始转型:在Google内部孵化了移动开发框架Flutter,弯道超车进入移动开发的领域;而在Google未来的操作系统Fuchsia中,Dart更是被指定为官方的开发语言

Dart的特性

作为移动端开发的后来者,Dart语言可以说是集百家之长,拥有其他优秀编程语言的诸多特性和影子,所以对于其他语言的开发者而言,学习成本无疑是非常低的。接下来我和你分享一下它的核心特性。

JIT与AOT

借助于先进的工具链和编译器,Dart是少数同时支持JIT(Just In Time,即时编译)和AOT(Ahead Of Time,运行前编译)的语言之一。那么什么是JIT和AOT呢?

语言在运行之前通常都需要编译,JIT和AOT则是最常见的两种编译模式。

  • JIT在运行时即时编译,可以动态下发和执行代码,开发测试效率高,但是运行速度和执行性能会因为运行时即时编译受到影响
  • AOT即提前编译,可以生成被直接执行的二进制代码,运行速度快,执行性能高,但是每次执行前都需要重新编译,开发测试效率低

总结来讲,在开发期使用JIT编译,可以提高开发测试效率、缩短产品的开发周期。Flutter最受欢迎的功能之一热重载,正是基于此特性。而在发布期使用AOT,就不需要像React Native那样在跨平台JavaScript代码和原生Android、iOS代码之间建立低效的方法调用映射关系。所以,Dart相对JS具有运行速度快、执行性能好的特点。

那么,如何区分一门语言究竟是JIT还是AOT呢?通常而言,看代码在执行前是否需要编译即可。如果需要,一般属于AOT;如果不需要,属于JIT。

AOT的代表是C/C++,其代码在执行前都必须编译成机器码;JIT则包含了JavaScript、Python等几乎所有的脚本语言。

内存分配与垃圾回收

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

在Dart中,并发是通过Isolate实现的。Isolate是类似于线程,但是不共享内存、独立运行的worker。这样的机制,就可以让Dart实现无锁的快速分配。

Dart的垃圾回收,则是采用了多生代算法。新生代在回收内存时采用“半空间”机制,触发垃圾回收时,Dart会将当前“半空间”中的“活跃”对象拷贝至备用空间,然后整体释放当前空间的所有内容。回收过程中,Dart只需要操作少量的“活跃”对象,没有引用的大量“死亡对象”则被忽略,这样的回收机制很适合Flutter框架中大量Widget销毁重建的场景。

单线程模型

支持并发执行线程的高级语言(比如,C++、Java、Objective-C),大都以抢占式的方式切换线程,即:每个线程都会被分配一个固定的时间片来执行,超过了时间片之后线程上下文将被抢占后切换。如果这时正在更新线程间的共享资源,抢占后就可能导致数据不同步的问题。

解决这一问题的典型方法是,使用锁来保护共享资源,但是锁本身又可能会带来性能损耗等更严重的问题。

这时,Dart是单线程模型的优势就体现出来了,因为它天然不存在资源竞争和状态同步的问题。这就意味着,一旦某个函数开始执行,就将执行到这个函数结束,而不会被其他Dart代码打断

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

无需单独的声明式布局语言

在Flutter中,界面布局直接通过Dart编码来定义。

Dart声明式编程布局易于阅读和可视化,使得flutter并不需要类似JSX或XML的声明式布局语言所有的布局都使用同一种格式也使得Flutter很容易提供高级工具使布局更简单。

开发过程中也不需要可视化界面构建器,因为热重载可以让我们立即在手机上看到运行效果。

Dart的未来

一种编程语言,并不是说搞定了引擎和开发者接口就完成了,而是必须在这个语言得以立足的库、框架、应用程序等“生态”都成熟起来之后,其价值才会真正体现。而要走到这一步,通常需要花上数年时间。

目前,基于Dart语言的第三方库还很少,并且质量一般。不过值得庆幸的是,由于Flutter和Fuchsia的推送,Dart SDK更新迭代的速度快了很多,开发者的热情也急剧增长,Dart的生态增速很快。

我觉得,Dart是否能够成功,目前来看主要取决于Flutter和Fuchsia是否能够成功。而Flutter是构建Fuchsia的UI开发框架,因此这个问题也就变成了Fuchsia是否能够成功

截止2019年7月9号,Flutter正式版发布也就半年多的时间,目前在GitHub上的star数是69.5K,而React Native 是78.8K,可见Flutter的热度之高。

Google在遭受与Oracle的Java侵权案后,痛定思痛下决心要发展自己的语言生态系统:Dart凭借Flutter和Fuchsia的生态主攻前端和移动端,而服务端,则有借助于Docker的火热势头增长迅猛的Go语言。

所以说,Google的布局不仅全面,应用和影响也非常广泛,前后端均有杀手级作品用来构建语言生态。相信随着Google新系统Fuchsia的发布,Flutter和Dart会以更迅猛的速度释放他们的力量,而Google统一前后端开发技能栈的愿望也在一定程度上得以实现。

总结

Dart是一门现代语言,集合了各种语言的优秀特点。如果你不了解Dart也无需担心,只要你有过其他编程语言,尤其是Java、或者Objective-C编程经验的话,可以很容易的在dart身上找到他们的影子,以极低的成本快速上手。

本文分享自微信公众号 - iOS小生活(iOSHappyLife)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏GA小站

流量渠道追踪全解析

其实这个就是UTM,UTM的全称是Urchin Tracking Module/Urchin Tracking Manager,通过向网址中添加广告系列参数,可...

23420
来自专栏量子位

苹果外包爆料:你手机里的Siri,听到了嘿嘿嘿的声音

据《卫报》得到的苹果外包公司员工爆料,这些包含Siri被误唤醒时的内容,都将被一一记录分析。

9110
来自专栏量子位

防患高通效仿华为,苹果10亿美元收购英特尔手机基带业务!打造5G备胎,加强自主可控

有人说这是苹果自研基带之心不死,也能当作苹果为5G种下备胎计划,或者会是苹果加强关键供应链自主可控的重要一步。

9410
来自专栏Python绿色通道

[数据分析]小白也可以用数据分析选购心仪的手机

9月13日发布的iPhone Xs算是手机界的大新闻了,新款iPhone的价格也再度刷新了手机定价的记录。看完发布会,相信很多人的心情是这样的

7910
来自专栏程序源代码

《传奇世界》基于cocos2d开源手游

基于cocos2d游戏引擎开发lua脚本编写的经典游戏《传奇世界》手游版,支持android、ios、windows等不同平台,职业设定(战士、法师、道士), ...

86930
来自专栏大话swift

golang实践之Excel操作

工作中我们经常会用到Excel表格,甚至很多软件都有导出Excel的功能,今天就根据自己的需要使用go来帮忙生成Excel。其实这个需要在几个月以前就有了,只是...

51030
来自专栏程序员成长指北

web前端面试中10个关于css高频面试题,你都会吗?

BFC(Block Formatting Context),块级格式化上下文,是一个独立的渲染区域,让处于 BFC 内部的元素与外部的元素相互隔离,使内外元素的...

32020
来自专栏Flutter笔记

Flutter | 求求你们了,切换 Widget 的时候加上动画吧

那如何在 Flutter 当中切换 Widget 的时候加上特效?完成这样的效果?

50750
来自专栏大话swift

promise版本的golang

之前我们分析了swift版本的PromiseKit,最近也在琢磨能否移植到咱大golang上来,找了好久也没有相对应的粒子。于是经过一次失败的尝试之后这周末花了...

13820
来自专栏游戏开发那些事

【Unity游戏开发】不接SDK也能在游戏内拉起加QQ群操作?

  一般在游戏进行对外测试的时候都会有一个玩家QQ群,方便玩家反馈问题、交流游戏心得等。那么为了增加玩家加QQ群的欲望,可能会在游戏里面设计一个小功能,点击一下...

9120

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励