深入理解Google Flutter编程之Dart语言

Flutter使用Dart语言开发。本篇整体介绍一下Dart语言。


上一篇 Android Studio使用Google Flutter完整教程 中SDK和插件以及环境变量的配置都很详细了。

如下截图是Dart语言SDK下载地址。对于Android开发,我们仅用到Flutter SDK。Web和服务端开发都是从此处下载SDK。

与上一篇提到 Flutter官网下载的Flutter SDK是一样的。。可简单了解一下……本文只介绍与 Flutter相关。

本文---深入理解Google Flutter编程之Dart语言--配图1

 


Flutter Fuchsia 和 Dart 的关系

  1. Fuchsia是Google的新操作系统。媲美iOS操作系统的流畅性及稳定性。
  2. Flutter 是 Fuchsia 的开发框架,支持导出 Android 、 iOS 、 Fuchsia 三个平台的安装包。
  3. Dart 是为以上两者服务的官方编程语言。

Dart 特性的简单介绍:

Dart 帮助开发者高效构建面向 ***浏览器  ***的 **高性能 **应用。

以桌面和移动浏览器为目标,Dart 应用能够在 Dart 虚拟机中运行或者被编译为 JavaScript 运行。

Dart VM 比 Chrome 使用的 JavaScript V8 引擎要快很多。。


本文不会介绍 Dart 语法细节、Dart VM、dart2js库等,因为这些和Flutter无关。

使用 Flutter 构建过 App 的人一定有一个困惑,就是 Flutter 编译出的产物到底是什么玩意。有时候分为几个文件,有时候是一个动态库。其实 Flutter 的编译模式有两种。

编程语言要达到可运行的目的需要经过编译,一般地来说,编译模式分为两类:JIT 和 AOT。

Dart的编译模式

Flutter 使用 Dart 作为编程语言,自然其编译模式也脱离不了 Dart 的干系。首先我们需要了解一下 Dart 所支持的编译模式。

  • Script:最普通的 JIT 模式,在 PC 命令行调用 Dart VM 执行 Dart 源代码文件即是这种模式;
  • Script Snapshot:JIT 模式,和上一个不同的是,这里载入的是已经 token 化的 Dart 源代码,提前执行了上一步的 

lexer 步骤;

  • Application Snapshot:JIT 模式,这种模式来源于 Dart VM 直接载入源码后 dump 出数据。Dart VM 

通过这种数据启动会更快。不过值得一提的是这种模式是区分架构的,在 x64 上生成的数据不可以给 arm 使用;

  • AOT:AOT模式,直接将 Dart 源码编译出 .S 文件,然后通过汇编器生成对应架构的代码。

本文---深入理解Google Flutter编程之Dart语言--配图2

Flutter的编译模式

Flutter 完全采用了 Dart,按道理来说编译模式一致才是,但是事实并不是这样。由于 Android 和 iOS平台的生态差异,Flutter 也衍生出了非常丰富的编译模式。

  • Script:同 Dart Script 模式一致,虽然 Flutter 支持,但暂未看到使用,毕竟影响启动速度;
  • Script Snapshot:同 Dart Script Snapshot 一致,同样支持但未使用,Flutter 

有大量的视图渲染逻辑,纯 JIT 模式影响执行速度;

  • Kernel Snapshot:Dart 的 

bytecode模式,与 Application Snapshot 不同,bytecode 
模式是不区分架构的。Kernel Snapshot 在 Flutter 项目内也叫  Core Snapshot。bytecode模式可以归类为 AOT 编译;

  • Core JIT:Dart 的一种二进制模式,将指令代码和 heap 数据打包成文件,然后在 VM 和 isolate 

启动时载入,直接标记内存可执行,可以说这是一种 AOT 模式。Core JIT 也被叫做  AOTBlob;

  • AOT Assembly: 即 Dart 的 AOT 模式。直接生成汇编源代码文件,由各平台自行汇编。

可以看出来,Flutter 将 Dart 的编译模式复杂化了,多了不少概念,要一下叙述清楚是比较困难的,所以我们着重从 Flutter 应用开发的各个阶段来解读。


**在开发阶段,我们需要 Flutter 的 Hot Reload 和 Hot Restart 功能,方便 UI 快速成型。同时,框架层也需要比较高的性能来进行视图渲染展现。因此开发模式下,Flutter 使用了 ** Kernel Snapshot


模式编译。

在生产阶段,应用需要的是非常快的速度,所以 Android 和 iOS target 毫无意外地都选择了 AOT 打包。不过由于平台特性不同,打包模式也是天壤之别。


Flutter 是一种高性能的、可跨平台的、动态化的应用开发方案。

在 iOS 和 Android 平台上,动态化完全可由 **Kernel Snapshot **打包实现,并且产物是一致通用的。不过目前通用打包工具进行了阉割,只能生成 debug 产物。。如果不需要动态化,同样可以打包出拥有更高执行性能的二进制库文件使用。这个特性目前就已经支持。。


Dart语言特点

首先我们看看为什么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

首先 Dart和Java,在VM层面,Dart VM在内存回收和吞吐量都进行了优化,Dart在Flutter中已经可以将gc做到10ms以内,而语法层面,Dart要比java更有表现力,最重要的是Dart对函数式编程支持要远强于java(目前只停留在lamda表达式),但是Dart对比Java不足的是生态(第三库和开发者的数量)

Dart 对比 JavaScript

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

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 都会成为主要的开发语言。

过去10年一直由手机主导,下一个十年将是物联网(IoT)设备主导。

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

***熬夜写教程不容易,

如果你欣赏我的代码,
可以赞赏我几块钱买个新键盘。***

代码交流 2021