Flutter使用Dart语言开发。本篇整体介绍一下Dart语言。
上一篇 Android Studio使用Google Flutter完整教程 中SDK和插件以及环境变量的配置都很详细了。
如下截图是Dart语言SDK下载地址。对于Android开发,我们仅用到Flutter SDK。Web和服务端开发都是从此处下载SDK。
与上一篇提到 Flutter官网下载的Flutter SDK是一样的。。可简单了解一下……本文只介绍与 Flutter相关。
本文---深入理解Google Flutter编程之Dart语言--配图1
Dart 帮助开发者高效构建面向 浏览器 的 高性能 应用。
以桌面和移动浏览器为目标,Dart 应用能够在 Dart 虚拟机中运行或者被编译为 JavaScript 运行。
Dart VM 比 Chrome 使用的 JavaScript V8 引擎要快很多。。
本文不会介绍 Dart 语法细节、Dart VM、dart2js库等,因为这些和Flutter无关。
使用 Flutter 构建过 App 的人一定有一个困惑,就是 Flutter 编译出的产物到底是什么玩意。有时候分为几个文件,有时候是一个动态库。其实 Flutter 的编译模式有两种。
编程语言要达到可运行的目的需要经过编译,一般地来说,编译模式分为两类:JIT 和 AOT。
Flutter 使用 Dart 作为编程语言,自然其编译模式也脱离不了 Dart 的干系。首先我们需要了解一下 Dart 所支持的编译模式。
Flutter 完全采用了 Dart,按道理来说编译模式一致才是,但是事实并不是这样。由于 Android 和 iOS平台的生态差异,Flutter 也衍生出了非常丰富的编译模式。
可以看出来,Flutter 将 Dart 的编译模式复杂化了,多了不少概念,要一下叙述清楚是比较困难的,所以我们着重从 Flutter 应用开发的各个阶段来解读。
在开发阶段,我们需要 Flutter 的 Hot Reload 和 Hot Restart 功能,方便 UI 快速成型。同时,框架层也需要比较高的性能来进行视图渲染展现。因此开发模式下,Flutter 使用了 Kernel Snapshot 模式编译。
在生产阶段,应用需要的是非常快的速度,所以 Android 和 iOS target 毫无意外地都选择了 AOT 打包。不过由于平台特性不同,打包模式也是天壤之别。
Flutter 是一种高性能的、可跨平台的、动态化的应用开发方案。
在 iOS 和 Android 平台上,动态化完全可由 Kernel Snapshot 打包实现,并且产物是一致通用的。不过目前通用打包工具进行了阉割,只能生成 debug 产物。。如果不需要动态化,同样可以打包出拥有更高执行性能的二进制库文件使用。这个特性目前就已经支持。。
首先我们看看为什么Flutter会选择Dart作为开发语言,下面是官方给出的理由:
Flutter在四个主要维度进行了评估,并考虑了框架作者、开发人员和最终用户的需求等因素。我们发现不同的语言在不同的层面符合一部分需求,但Dart在所有评估维度上得分都很高,并且符合我们的所有要求和标准。
Dart运行时和编译器支持Flutter的两个关键特性的组合:基于JIT的快速开发周期:允许使用类型的语言进行形状更改和有状态的热重载;以及AOT编译器,可生成高效的ARM代码,可以快速启动并拥有可预测的生产部署性能。
此外,我们有机会与Dart社区密切合作,Dart社区正在积极投入资源改进Dart在Flutter中的使用。例如,当我们采用Dart时,该语言没有提供生成原生二进制文件的工具链(这对于实现可预测的高性能是很有帮助的),但是现在实现了,因为Dart团队为Flutter构建了它。同样,Dart VM之前已经针对吞吐量进行了优化,但团队现在正在优化VM的延迟时间,这对于Flutter的工作负载更为重要。
Dart在以下主要标准上得到高分:
- 开发人员的效率。Flutter的主要价值主张之一是通过让开发人员使用相同的代码库为iOS和Android创建应用程序,从而节省了工程资源。使用高效的语言可以进一步加速开发周期,并使Flutter更具吸引力。这对我们的framework团队和开发人员都非常重要。大部分Flutter功能都是用Dart实现,因此我们需要在10万行代码时能保持高效的而不会牺牲framework和widget的可读性。
- 面向对象。虽然我们可以使用非面向对象的语言,但这意味着要重新解决几个难题。另外,绝大多数开发人员都具有面向对象开发的经验,因此更容易学习如何使用Flutter进行开发。
- 可预测,高性能。借助Flutter,我们希望使开发人员能够快速创建流畅的用户体验。为了实现这一点,我们需要能够在每个动画帧中运行大量的代码。这意味着我们需要一种既能提供高性能又能提供可预测性能的语言,而不会出现会导致丢帧的周期性暂停。
- 快速内存分配。Flutter框架使用函数式流,它很大程度上依赖于底层的内存分配器,从而有效地处理小的、短期的内存分配会非常重要,所以在缺乏此功能的语言中Flutter无法有效地工作。
总结:主要的信息就是Dart在Flutter中没有VM,可以直接通过AOT编译器编译成本地代码,并且内存管理比较适合Flutter 。
首先 Dart和Java,在VM层面,Dart VM在内存回收和吞吐量都进行了优化,Dart在Flutter中已经可以将gc做到10ms以内,而语法层面,Dart要比java更有表现力,最重要的是Dart对函数式编程支持要远强于java(目前只停留在lamda表达式),但是Dart对比Java不足的是生态(第三库和开发者的数量)。
JavaScript的弱类型一直被抓短,所以typeScript、coffeescript甚至是facebook的flow才占有了部分市场。目前最强大的动态化最好的脚本语言就是javascript,支持动态扩展属性、创建函数等,用起来超爽。但是你可能听过另一个声音,javascript的强大的动态化是把双刃剑,毕竟有些人总是对自己写的代码不放心,他们期望有一套静态类型检查系统来帮助自己减少错误,而Dart就有静态类型检查(Dart2.0后加入了动态类型检查,这在最新版的flutter中已经启用了),并且可以通过dart2js将dart代码转成js代码,在这个层面来说,Dart和typeScript、coffeescript是差不多的,所以单独来看,Dart 并不比typeScript、coffeescript有什么明显优势,但综合起来看,Dart 既能进行服务端脚本、APP开发、web开发,这就有优势了。
Flutter能够运行大多数不会直接或间接导入dart:mirrors 或 dart:html的dart代码。Flutter中Dart 代码会通过AOT编译器编译成本地代码,没有vm,并且Dart 团队专门针对Flutter进行了优化。
Dart目前第三方库还是较少,并且有质量不高,即使是Dart SDK,里面也有很多bug,dart-sdk github现在打开的issue一直维持在5000左右。但值得庆幸的是,目前Dart更新迭代快了很多,这是受flutter和Fuchsia的带动。
至于开发者,目前大多数dart使用者是Flutter用户,用 Dart 写服务端脚本的应该非常少,毕竟现在在Dart 社区没有一个比较著名或经过时间验证的web server框架。从stackoverflow上Dart 相关的问题来看,用Dart开发js的开发者也有一些。
开源项目:Flutter开发的CodeWars 客户端:https://github.com/ice1000/code_wars_android
虽然Dart生态目前还不完善,但可喜的是增速很快,我觉得Dart是否成功目前主要看Flutter 和 Fuchsia是否能成功。
Flutter在没有发布第一个正式版的情况下,Github上star将近23K,热度相当高(当然不能和vue等前端web框架相比,都要上100k了,两者开发者群体规模不同,开源时间不同)。 从Flutter自身来看,开发的应用程序性能确实流畅很多,比Weex、RN、Cordova 有明显的性能提升。
随着Google Fuchsia OS的发布,Dart及Flutter 成为一等公民,将来具有Fuchsia OS的设备,Dart 都会成为主要的开发语言。
Fuchsia系统 ,基于谷歌在 Android 和 Chrome 操作系统上的经验开发。为什么Google想在如今的环境中再创建一个全新的操作系统?答案很简单:物联网。有数以千计的物联网设备开始融入我们的日常生活:亚马逊的 Alexa ,特斯拉的自动驾驶汽车,智能温度控制设备,甚至是家用智能锁。
Fuchsia 基于 microkernel 微内核,小巧但功能强大。它最初由 Android 和 ChromeOS 所依赖的 Linux 提供支持,但谷歌现在正抛弃 Linux 并创建了一个能够在通用设备上运行的微内核操作系统 —— 从嵌入式和物联网设备到智能手机、平板电脑和个人电脑。他们的计划是在未来五年内在数十亿的物联网设备中安装 Fuchsia 。秘密武器是 Fuchsia 的用户界面和应用程序,都是用 Flutter 编写的。Flutter 不仅可以简化应用开发,而且被用于开发移动和物联网设备的未来操作系统。 Flutter 将极大地改善未来几年内部开发和初创公司的前景。
Flutter 和 Fuchsia ,这两个简单的词汇将成为推动手机和物联网下一代革命的燃料。它们是可以让这些设备改变你的日常生活的技术。“我应该选择什么样的开发语言,以及下一个新兴技术是什么”?嗯,答案就是 Flutter 和 Fuchsia 。预计2019年,你会在任何地方看到这两个词。
Flutter 是谷歌全新的开发平台,允许开发者用一种简单的语言为苹果的 iPhone / iPad iOS 平台和谷歌的 Android 手机/平板电脑编写App。此前Google已有多次其他类似的尝试并取得一定成功,但谷歌最终用 Flutter 解决了移动端开发难题。
Flutter 很容易学习,你甚至可以在没有编码经验的情况下自学。对于新手程序员来说,可能存在学习曲线,但任何有一点经验的人都会在两个月内上手,而不是两年。这就是我为什么说现在开始学习是企业和创业公司真正的机会。Flutter 在学习和使用上的便利性,将让你有机会在快节奏的技术领域中走在前列。
Flutter 和 Fuchsia 将是每个技术人员都绕不开的技术体系。Flutter 已经能开发所有业务类型的App,App 是移动互联网的主角,Fuchsia 是物联网的核心,你又如何能绕过它呢??
本文---深入理解Google Flutter编程之Dart语言--配图3