为什么 Flutter 选择 Dart 而非 JavaScript?

发表时间: 2023-05-26 05:19

家好,很高兴又见面了,我是"高级前端‬进阶‬",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!

高级前端‬进阶

今天给大家带来的主题是“为何 Flutter 青睐 Dart 而不是宇宙最强的 JavaScript?”,同时对 Dart 和 JavaScript 做了一个简单的对比。话不多说,直接开始进入正题。

1.JavaScript 和 Dart 介绍

什么是 JavaScript

JavaScript 是一个具有一流功能的轻量级、解释型和即时编译型编程语言。 尽管它是作为 Web 网页脚本语言而广为人知,但许多非浏览器环境,如 Node.js、Deno、Bun 等也在使用它。甚至在传统服务器领域也有它的身影,例如:njs v0.7.12 扩展了 nginx 功能的 JavaScript/ECMAscript 语言的子集等。

技术上看,JavaScript 是一种基于原型的多范式动态语言,支持面向对象、命令式和声明式风格。

不管你喜不喜欢,JavaScript 目前已经无处不在,与日常开发息息相关。 但是,JavaScript 在其早期并没有引起这么大的关注,自从它与 node.js 一起进入服务器端后,它已经成长为在多个领域占据主导地位的巨头,无论是 Web 端还是手机端、IoT,甚至 AI。

随着各种 Web 前端框架,如: React.js、Angular 、Vue、Solidjs 等的兴起,JavaScript 不可否认已经处于其高光时刻,格外耀眼。伴随着 Facebook React Native 的推出,JavaScript 在混合移动应用程序(PHA)开发场景也是风光无限。同时,近年来随着众多主流浏览器对 WebAssembly 的支持加速,与 JavaScript 双剑合璧更是在众多语言中独占鳌头,实力不容小觑。

什么是 Dart

介绍了 JavaScript,让我们一起回到本文的主角,即 Dart 这门编程语言本身,顺便看看为何 Flutter 选择了 Dart 而不是宇宙最强的 JavaScript。

Dart 是一种客户端优化的编程语言,适用于多个平台上的快速应用程序。 Dart 由 Google 开发,用于构建移动、桌面、后端和 Web 应用程序。同时,Dart 是一种面向对象、用户定义和垃圾回收的语言,使用 C 风格的语法,可以选择性地转换编译成 JavaScript。目前 Dart (和 Flutter 一样)是完全开源的( BSD-3-Clause license),也符合 ECMA 标准。

Dart 在 2011 年初作为 JavaScript 的直接替代品出现,也爆发出了巨大的潜力。 尽管 Dart 是由谷歌开发的,但在当时并没法引起巨大的轰动,甚至可以说是籍籍无名。 直到 Flutter 的出现,Dart 很快成为混合移动开发应用程序的首选,知名度也是声名鹊起。

随着 2023 年 Dart 3 的发布,这个号称迄今为止最大的 Dart 版本,包含了三个主要改进:

  • 完成了 100% 健全的空安全
  • 添加了记录、模式和类修饰符的新语言特性
  • 通过 Wasm 编译扩大了对网络原生代码的平台支持

至此,Dart 可以说是完成了一次全新的蜕变。目前 Dart 项目在 Github 上开源,有超过 9.1k 的 star、1.4k 的 fork、代码贡献者 500+,是一个值得长期关注的跨端开源项目。

2. Dart 的特性

根据 Dart 官方描述,Dart 目前适用于在任何平台上快速构建应用程序的客户端优化语言,具有以下特点:

  • 针对 UI 的大量优化:使用专门围绕用户界面创建需求的编程语言进行开发
  • 高效迭代:迭代地进行更改,使用热加载在正在运行的应用程序中立即查看执行结果
  • 快速:为移动、桌面和后端编译为 ARM 和 x64 机器代码,或者编译为 JavaScript 用于 Web。

Dart 灵活的编译器技术允许开发者以不同的方式运行 Dart 代码,一切只取决于目标平台和目标。

  • Dart Native:对于针对移动、桌面、服务器等设备的程序,Dart Native 包括一个带有 JIT(Just-in-Time)编译的 Dart VM 和一个用于生成机器码的 AOT(Ahead-of-Time)编译器
  • Dart Web:对于面向 Web 程序的场景,Dart Web 包括开发时编译器 (dartdevc) 和生产时编译器 (dart2js)

Dart在不同平台上的实现架构

3.JavaScript 与 Dart 比较

JavaScript 和 Dart 都是跨平台移动应用程序开发的绝佳选择,两者在 React Native 和 Flutter 大战中已经被无数开发者证明。 与 JavaScript 相比,Dart 是相当新的开发语言,但它具有一些非常优秀的特性和来自 Google 的强大支持。

Dart vs. JS

接下来由我带着大家从几个维度对 JavaScript 与 Dart 进行下简单比较,让大家更好的了解这两门语言。

简单易学

JavaScript 的学习曲线非常平缓,在网上有很多学习资源和常见问题的解决方案可供使用。 而且市场对 JavaScript 的需求量很大,比如:大量的前端框架、就业岗位,目前 JavaScript 俨然已经成为最受欢迎的现代编程语言。而且有标准委员会的加持(如w3c、T39等等),发展也是非常迅速,各种 JS 提案、浏览器特性纷至沓来。

Dart 虽然也有很好的开发文档,但对大多数新手来说, Dart 语言的特性非常让人困惑。 但是,具有 OOPS 背景的开发人员可以轻松掌握语法,因为 Dart 语法类似于 Java。 然而,由于缺乏社区支持和资源,开发者相比之下很难找到解决 Dart 中问题的方法。

包数量

JavaScript 拥有大量的三方包,并且自 NPM 注册表启动以来一直在快速增长。 目前,NPM 注册中心拥有超过 130 万个开源包并且还在不断的增长过程中,NPM 目前是世界上最大的三方包注册中心。

相比之下,Dart 虽然也越来越受欢迎,开源软件包数量也在稳步上升,但是要与 JavaScript 社区持平还需要很长的时间。

执行速度

JavaScript 是一种解释型语言,很容易达到性能瓶颈,这就是为什么很多非常耗时的操作、计算要通过更加底层的其他语言加持的原因(比如通过 wasm)。而相比之下, Dart 的速度总体上几乎是 JavaScript 的两倍。

图片来自:https://www.thebluediamondgallery.com/handwriting/p/performance.html

Dart 支持同时使用 AOT 和 JIT 进行编译,有助于以多种方式构建应用程序。使用 JIT 编译可以加快开发速度,并且可以在发布过程中使用 AOT 编译以实现更好的优化。这项技术目前已用于 Flutter 应用程序开发。下面是 JIT 和 AOT 的简单说明:

  • 即时 (JIT、Just-in-Time) 编译器:JIT 编译器在程序执行期间运行,即时编译。JIT 编译提供更快的开发周期,但会导致执行速度变慢或不稳定。 同时,JIT 的启动时间较慢,因为当程序开始运行时,JIT 编译器必须先进行分析和编译,然后才能执行代码。
  • (AOT、Ahead-of-Time) 编译器:一般来说,只有静态语言才适合 AOT 编译成本地机器代码,因为机器语言通常需要知道数据类型,而动态语言类型无法提前确定。 因此,动态语言通常被解释或 JIT 编译。AOT 编译的缺点就是拖慢开发周期(从更改程序到能够执行程序以查看更改结果之间的时间)。但 AOT 编译使程序可以可预测地执行,无需在运行时暂停分析和编译,从而执行更快。

类型检查

JavaScript 是一种动态类型语言,使开发人员能够执行任何代码,错误只能在运行时发现。当然,这个问题开发者可以通过使用 Typescript 、jsDoc、Flow 这样的类型系统来有效避免。

Dart 支持与 TypeScript 使用的类型系统等效的类型系统。 由于 Dart 是一种编译型语言,因此可以有效排除编译时错误,防止将错误本身带到线上环境从而给用户带来不好体验。从这点来看,Dart 比 JavaScript 更类型安全。

用法

JavaScript 在 Web 开发领域占据主导地位,并在 React Native 和 Ionic 移动设备以及 Electron、Tauri、Gluon 等的桌面设备中也越来越受欢迎。 同时 ,Node.js 等作为后端解决方案也得到很多开发者的青睐,具有高可扩展性和快速 I/O 支持。

相比之下,Dart 因其移动开发框架 Flutter 而广受欢迎。 在 Web 和桌面平台上,自从用于 Web 的 Hummingbird 和用于开发桌面应用程序的 Flutter for Desktop 的出现以来,它的受欢迎程度也都在逐步增长。

  • Hummingbird:允许 Flutter 应用程序开发人员创建 Web 应用程序,从而使 Flutter 更进一步。Hummingbird 的终极目标是让应用程序创建者有能力编写应用程序一次,并在任何地方运行
  • Flutter for Desktop: 最初是为了开发 Flutter 的 Windows,macOS 和 Linux 嵌入而创建的项目,目前已经成为 Flutter 的一部分。

代码

下面示例展示了 Dart、JavaScript 两种语言的 hello world 示例,从示例代码来看,Dart 的入口会从 main 函数开始,这一点与 C 非常类似,而 JavaScript 更加松散没有诸多限制。

// JavaScript// 代码执行从代码的顶部开始console.log('Hello world!');// Dartmain() {    // 代码执行从主函数开始    print('Hello world!');}

热度

下图展示了 Dart、JavaScript 两种语言在 Stack Overflow 上的热度指数,从图上可以明显看出后者相对前者有明显的差异。

在看看 Google Trend 的数据,红色代表 JavaScript、蓝色代表 Dart,得出的结论与 Stack Overflow 上的热度指数高度一致。

4.本文总结

本文主要和大家探讨为何 Flutter 会选择 Dart 而不是 JavaScript,相信通过本文的阅读,大家对 Dart 会有一个初步的了解。

因为篇幅问题,文章并没有过多展开,如果有兴趣,可以在我的主页继续阅读,同时文末的参考资料提供了大量优秀文档以供学习。最后,欢迎大家点赞、评论、转发、收藏!


参考资料

https://mobilecoderz.com/blog/javascript-vs-dart-a-quick-comparison-to-choose-dominating-one/

https://hackernoon.com/why-flutter-uses-dart-dd635a054ebf

https://github.com/dart-lang/sdk

https://www.inapps.net/dart-vs-javascript-detailed-comparison/

https://emeritus.org/blog/coding-dart-programming-language/