为什么是 Dart ?

2023-10-31

为什么是 Dart ?

为什么选择Dart语言,这是很多人的疑问,让我们先来看看,最近Dart 编程语言的发展情况:

2022年2月TIOBE编程语言排行榜:

很遗憾,Dart在前20名之外,但好消息是它还处于前30名之内!

在这个排行榜中,值得我们注意的是Dart语言仍然处于Kotlin之上,虽然优势并不明显。让我们再来看一看 IEEE Spectrum 最新发布的2021年度的编程语言排行榜 Top Programming Languages 2021

在IEEE Spectrum 的榜单中,Dart 处于第14位,并且与Kotlin拉开了更多差距。这份榜单是以2021整个年度来衡量的,显然比TIOBE的排名更均衡。另外,TIOBE的排名主要参考当月搜索引擎的搜索热度,这有点类似于热搜排名。而IEEE Spectrum 的榜单除了参考热搜,还要参考Github的仓库数量,一些技术论坛的发帖数量等等,因此IEEE Spectrum榜单更能衡量一门编程语言的生态情况。

总而言之,Dart语言仍然是极具潜力的一门编程语言,非常值得学习。

有部分人曾在我面前极力吹捧Kotlin语言,给了我Kotlin远超Dart语言的感觉,但我们回到大数据面前,Kotlin的热度似乎还赶不上Dart,真是让人情何以堪呐…更何况同为JVM语言,Kotlin可以直接使用Java的库,它直接借助Java庞大的生态,发展得也不过如此。

事实上,我不是编程语言宗教的信奉者,在我眼里没有谁是最好的语言,只有最合适的语言。我信奉的是工具论,每种编程语言都是一种工具,是人来主导工具,而不是人被工具主宰!我理解最完美的状态,是干什么活,就用什么工具,而不是因为我手上只有这把锤子,所以看什么都是钉子。

作为一个跨平台的移动开发者,Kotlin也好,Swift也好,都是需要学习的,如果有人固执的认为,学一种就够了,一招鲜吃遍天,那么他说不定什么时候就得踩一个大坑。

好了,现在让我们回到一开始的问题,Flutter为什么选择了Dart语言,我们为什么要拥抱 Dart 语言?

背景

从历史上看,计算机语言被分为两类:静态语言(例如Fortran 或 C,其中变量在编译时静态类型化)和动态语言(例如,Smalltalk 或 JavaScript,其中变量的类型可以在运行时改变)。静态语言通常被编译为目标机器的本地机器码(或汇编代码),这些程序在运行时由硬件直接执行。动态语言由解释器执行,不产生机器码。

当然,事情最终变得更加复杂。虚拟机(VM)的概念变得流行起来,它实际上只是一种在软件中模仿硬件机器的高级解释器。虚拟机使得将一种语言移植到新的硬件平台变得更加容易。在这种情况下,VM 的输入语言通常是一种中间语言。例如Java语言被编译成一种中间语言(字节码),然后在虚拟机(JVM)上执行。那么虚拟机和解释器之间有什么区别呢?简单说,解释器是直接解释执行编程语言的源代码,这些源代码是字符串;虚拟机解释执行的是由源代码翻译之后生成的字节码,这些字节码是二进制,但同时,这些字节码并不是真正的机器码,不能被任何硬件直接理解执行。

此外,现在还有即时(JIT) 编译器。JIT 编译器在程序运行期间执行编译,因此称为即时编译。在程序创建期间(编写完源代码)进行原始编译的编译器现在称为提前(AOT) 编译器

一般来说,只有静态语言适合 AOT 编译为本机机器码,因为机器语言通常需要知道数据的类型,而在动态语言中,类型并没有提前固定。因此,动态语言通常被解释或 JIT 编译。

在开发过程中完成 AOT 编译时,总是会导致开发周期变慢(从对程序进行修改到能够执行程序以查看修改结果之间的时间)。但是 AOT 编译导致程序可以更可预测地执行,并且在运行时无需暂停分析和编译。AOT 编译的程序也执行得更快(因为它们提前就被编译好了)。

JIT 编译可以提供更快的开发周期,但会导致执行速度变慢或不稳定。特别是,JIT 编译器的启动时间较慢,因为当程序开始运行时,JIT 编译器必须先进行分析和编译,然后才能执行代码。

如上图,早期直接由虚拟机这个软件去解释执行字节码性能较差,为了解决这个问题,就提出了JIT编译。JIT编译就是在虚拟机这个软件中再内置一个编译器,当用户运行Java编写的程序时,虚拟机会对字节码进行分析,对于频繁执行,且比较耗费性能的部分代码,就由JIT编译器在运行时将其编译成机器码,这样就可以将这部分直接交给CPU来执行,提升性能。因此,支持JIT编译的虚拟机,首次运行程序可能会更慢,因此它在运行时还要进行编译工作。有人可能会说,既然如此,为什么不在运行之前,就将所有代码编译成机器码,运行时直接交给CPU执行,这样不就速度更快了吗?是的,这就是AOT!

Dart

2011 年 10 月 10 日,谷歌的两名工程师在 GOTO 会议上推出了“ Dart ”,作为一种全新的编程语言,旨在帮助开发人员构建 Web 应用程序。Dart 1.0 于 2013 年 11 月 14 日发布。

在开发 Dart 之前,Dart 团队成员在高级编译器和虚拟机方面做了开创性的工作,包括动态语言(如用于 JavaScript的V8 引擎和用于 Smalltalk 的Strongtalk )和静态语言(如用于 Java的Hotspot 编译器)。他们利用这一经验使 Dart 在编译和执行方面异常灵活。

Dart 是极少数非常适合同时编译 AOT 和 JIT 的语言之一。支持这两种编译为 Dart 和(尤其是)Flutter 提供了显着的优势。

在开发过程中使用 JIT 编译,使用速度特别快的编译器。然后,当应用程序准备好发布给用户使用时,它会被编译为 AOT。因此,借助先进的工具和编译器,Dart 可以实现两全其美:极快的开发周期,以及快速的执行和启动时间。

Dart 在编译和执行方面的灵活性并不止于此。例如,Dart 可以编译成 JavaScript,以便浏览器执行。这允许在移动应用程序和 Web 应用程序之间重用代码。开发人员报告称,他们的移动和 Web 应用程序之间的代码重用率高达 70% 。Dart 也可以通过编译为本机代码或编译为 JavaScript 并与node.js一起使用来在服务器上使用。

最后,Dart 还提供了一个独立的 VM

结论:Dart 可以高效地编译 AOT 或 JIT、解释或转译成其他语言。Dart 不仅编译和执行异常灵活,而且速度特别快。

学习Dart的理由

  • Dart 非常灵活。Dart 是一种灵活的编程语言,你可以编写代码,然后在任何地方运行,没有任何限制。

使用 Dart 和 Flutter 编写的移动应用程序是跨平台的原生应用程序;因此它们可以在 Android、iOS、Windows、Linux、MacOS上运行。甚至可以编写 Web 应用程序,让代码在浏览器上运行。从开发人员的角度来看,语言的灵活性和可移植性非常重要。毕竟,谁不想编写一些代码并在尽可能多的平台上运行呢?

一旦你熟悉了面向对象的一般原则,在 Dart 中编码就会感觉很自然。Javascript 遵循无类型哲学,因为根据 JS,无类型意味着灵活性。但是开发人员经常说,过多的灵活性会扼杀你的软件。有时你想使用类型,而有时则不想。有了 Dart,你可以做到两全其美。

  • Dart 很容易学习。Dart 语法看起来非常熟悉,即使是第一眼。哪怕你之前没有看过 Dart 代码,也可以轻松理解它而不会费力。Dart 语言结构良好,因此如果你已经了解 C、Java 、JavaScript或 C#等任意一门编程语言,那么 Dart 上手将非常容易。

  • Dart 有很好的工具支持,确保了生产力。除了各种静态工具,它有一个现代化的仓库——pub,可以很容易的依赖我们需要的第三方库,也可以很方便的发布我们开源的库。

  • Dart 是一种健壮的语言。Dart 是一种开源、面向对象、可选类型和基于类的语言,它对函数式编程和响应式编程具有出色的支持。与 Java 不同,Dart 一点也不臃肿。事实上,它是一种相对简单、现代且高效的类似于 C 的编译语言,它在2.12之后发布的空安区特性,极大的提升了代码的健壮性。

除了Dart本身的优秀特性,学习Dart语言最核心的理由,当然是为了Flutter!Flutter是一种极为优秀的跨平台UI框架,并且是谷歌最新的 Fuchsia 操作系统默认的App开发框架,而Dart也是Fuchsia系统默认的几种开发语言之一,可以说,Dart未来的潜力巨大。

懒惰是人类的天性,我能理解为什么有编程语言宗教。许多人因为工作的关系,业务的驱动,好不容易从Java语言切换到kotlin语言,结果现在来了Flutter,又要学一门Dart语言,Kotlin语言都还没捂热了,又要学,第一感触就是反感抵触。老实说,我第一次接触Flutter和Dart就非常排斥,即使我已经会写Java、JavaScript、Python、Go等一些语言,并且正在学习Kotlin,但是我仍然不太情愿为了用一用Flutter再学一种编程语言。为了Flutter,我决定一试,结果让我感觉非常好。当人们批评Java的冗余繁琐,大谈Kotlin简化代码提升生产力时,我反而觉得Java的那些痛点都被Dart解决了,我个人感觉Dart可能比Kotlin更加简洁。

如果我因为拖延症或其他原因,不想学习某种技术时,或许我也会拼命抵制它,搜遍互联网,找到所有的负面理由贬低它,并且大声疾呼,我使用的这种编程语言已经足够好了,它是我手上的锤子,它能解决一切问题!找遍了理由和黑点,可能起因只是因为懒得学而已。但我们知道这没有意义,不如开放胸怀,去拥抱变化。

切换新的语言和技术栈就像搬家,人们都很讨厌,很讨厌折腾,我们总是希望这是最后一次了,但往往可能还有很多次!如果我们总是这样想,只会收获一个糟糕的心情。曾经有网友说过一句话,编程语言对程序员来说就像女朋友,不同的是,程序员玩腻了总能换一门新的,这样,程序员的生活总是充满新鲜感!这话虽然很粗糙,但是Linus Torvalds也讲过,“大多数优秀的程序员做编程不是因为他们期望得到报酬或得到公众的奉承,而是因为编程很有趣。”

所以,学会享受!

最后送给大家一首 Dart 之诗:

When playing darts, it is agreed,

A steady hand is what you need.

A good eye and a perfect stance.

(For darts is not a game of chance!)


关注公众号:编程之路从0到1

编程之路从0到1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么是 Dart ? 的相关文章

随机推荐

  • 《JAVA 基础: 第一个JAVA应用程序》

    一 Java语言运行机制及运行过程 1 再次强调JAVA语言的特点 特点一 面向对象 两个基本概念 类 对象 三大特性 封装 继承 多态 特点二 健壮性 吸收了C C 语言的优点 但去掉了其影响程序健壮性的部分 如指针 内存的申请与释放等
  • 运用成员函数模板接受所有兼容类型——条款45

    所谓智能指针是 行为像指针 的对象 并提供指针没有的机能 例如条款13曾经提及std auto ptr和tr1 shared ptr如何能够被用来在正确时机自动删除heap based资源 STL容器的迭代器几乎总是智能指针 无疑地你不会奢
  • 卷积神经网络的复杂度分析

    在进行CNN的设计中 我们不仅要考虑模型的准确率 还需要考虑模型的实用性 现阶段大量的paper纯堆精度 缺没有深入思考模型以及算法的实用性 最近有一点感触很深 很多我们在做研究时认为默认的东西 在进行实际应用项目中 才发现这些先验数据是无
  • NVIDIA 安装 CUDA

    名词解释 CUDA 是一个架构 该架构使GPU能够解决复杂的计算问题 此实战使用电脑为联想Y9000P 显卡型号为 3060 在安装 CUDA 之前需要先打开 NVIDIA 控制面板 一 准备工作 如图我这个显卡需要安装 CUDA 11 7
  • Pci设备驱动1:pci设备驱动实例(realtek8168)

    Pci设备驱动1 pci设备驱动实例 realtek8168 2012 05 25 11 30 32 分类 LINUX Realtek8168网卡时pci接口的网卡 其驱动程序就是一个PCI设备的驱动程序实例 我们一起看看其流程 1 首先
  • JDK8到JDK17有哪些吸引人的新特性?

    作者 京东零售 刘一达 前言 2006年之后SUN公司决定将JDK进行开源 从此成立了OpenJDK组织进行JDK代码管理 任何人都可以获取该源码 并通过源码构建一个发行版发布到网络上 但是需要一个组织审核来确保构建的发行版是有效的 这个组
  • EfficientDet训练自己的训练集

    一 安装环境 install requirements pip install pycocotools numpy opencv python tqdm tensorboard tensorboardX pyyaml pip install
  • 五步教你如何注册一个公司网站

    在今天的数字化时代 每个公司都需要一个强大的线上存在感 注册一个公司网站是实现这一目标的第一步 但是 对于许多公司而言 这个过程可能有些困难 因此 在本文中 我将介绍一个五步计划 让您轻松注册一个成功的公司网站 步骤一 确定网站目标 在注册
  • oracle时间大小比较 格式

    首先给大家分享一个巨牛巨牛的人工智能教程 是我无意中发现的 教程不仅零基础 通俗易懂 而且非常风趣幽默 还时不时有内涵段子 像看小说一样 哈哈 我正在学习中 觉得太牛了 所以分享给大家 点这里可以跳转到教程 createtime gt to
  • android开源进度条,Android github开源进度条类框架SmoothProgressBar的使用

    前言 SmoothProgressBar是Github上的一个开源框架 牛人所著 只作翻译 Github项目主页 SmoothProgressBar https github com castorflex SmoothProgressBar
  • 80004005错误代码_关于访问共享时出现80004005错误

    访问网内某共享文件夹时出现的错误 报80004005错误代码 无法打开共享文件夹 但因为原先该共享访问并不存在障碍 因此应该不是权限的问题 到网上找了下 有以下一些说法与解决方法 1 开启windwos防火墙服务 2 设置宽带共享上网 打开
  • Docker部署ssh连接工具webssh2

    Docker部署ssh连接工具webssh2 一 检查系统版本 二 检查docker状态 三 下载webssh2镜像 四 创建webssh2容器 1 创建webssh2容器 2 查看webssh2状态 3 查看容器运行日志 五 访问webs
  • 简单易懂!详细讲解==与equals的区别(详讲equals源代码)

    与 equals 最本质的区别就在于 只是一个比较运算符 而equals却是一个方法 而只要是方法就可以重写 这就是 和equals最本质的区别 首先我们先来讲解 运算符 运算符可以对基本数据类型的值来进行判断 举例 int a 10 in
  • 关于保护继电器触点(灭弧)

    我用继电器驱动一个24V 60w电机 采用0 33uF 400V电容并联在触点上作为吸收和保护电容 用不了多久 就被击穿了 现在用的电容是0 1uF的X2电容 这种电容标称耐压是 275V 实际能承受2500V的冲击电压 后来的仿真和示波器
  • Prometheus-05 Prometheus的核心概念和架构

    Prometheus是一个开源的监控系统和时间序列数据库 被广泛应用于云原生环境中的监控和告警 本文将介绍Prometheus的核心概念和架构 帮助读者了解Prometheus的工作原理和基本组件 1 核心概念 Prometheus基于一些
  • python配置文件解析_【Python】configparser - 配置文件解析

    目录 一 介绍 ConfigParse 类实现一个基本配置文件解析器语言 提供了一个类似于Microsoft Windows INI 文件的结构 可以使用它来编写可由最终用户轻松定制的Python程序 注意 这个库不支持能够解析或写入在 W
  • java: 详解java中的集合框架

    一 Java集合框架概述 1 图解 集合可以看作是一种容器 用来存储对象信息 所有集合类都位于java util包下 但支持多线程的集合类位于java util concurrent包下 上图中淡绿色背景覆盖的是集合体系中常用的实现类 分别
  • GitHub项目管理详细教程/git教程【有图有代码】

    GitHub项目管理详细教程 git教程 有图有代码 一 Git 基本操作 二 Git 配置 1 配置个人的用户名称和电子邮件地址 2 查看配置信息 三 Git 工作区 暂存区和版本库 四 上传自己的项目到GitHub仓库 第一次 第二次
  • Python:Flask简单实现统计网站访问量

    hello 我是wangzirui32 今天我们来学习如何使用Flask简单实现统计网站访问量 开始学习吧 学习目录 1 项目架构 2 项目文件编写 2 1 index html 主页编写 2 2 people json 数据初始化 2 3
  • 为什么是 Dart ?

    为什么是 Dart 为什么选择Dart语言 这是很多人的疑问 让我们先来看看 最近Dart 编程语言的发展情况 2022年2月TIOBE编程语言排行榜 很遗憾 Dart在前20名之外 但好消息是它还处于前30名之内 在这个排行榜中 值得我们