从V8经验到新语言
Dart的起点与Google的JavaScript引擎V8有关。拉尔斯·巴克和卡斯帕·伦德在开发V8之后,于2010年试验了一种名为Spot的简单网页语言,它成为Dart项目的前身。巴克领导项目,并邀请长期研究编程语言的吉拉德·布拉查加入;布拉查参与编写语言规范,把设计决定整理成可供实现者共同遵循的说明。
2011年10月10日,巴克与布拉查在丹麦奥胡斯的GOTO大会介绍Dart。当天Google发布声明,公开语言及初步工具源码。发布物被明确定位为技术预览:开发者可以试用、检查和参与修改,语言和工具还会继续演进。
网页应用变大后的组织问题
网页已从显示文档的平台转向承载完整应用。少量脚本可以由一人快速写成;当代码、界面和团队扩大,程序结构不清、缺少模块边界和工具支持,就会增加调试与维护成本。Dart团队希望保留网页跨平台、无需单独安装和快速修改的便利,同时让大型项目具备更明确的结构。
Dart采用开发者熟悉的C系语法,以类组织对象,以库划分程序。设计目标覆盖现代浏览器、手持设备乃至服务器。性能与启动速度是目标的一部分,易学、可逐步增加结构也是同等重要的考虑,而不是要求所有小程序从一开始便使用复杂的类型声明。
一个求和程序与可选类型
早期语言的做法可用求和说明:在main函数内令values为列表[2,3,5],以var total = 0建立累计值,再用for (var n in values)逐项执行total += n,最后由print(total)输出10。列表、循环和变量足以组成小程序,不必先为入口另建一个类。
需要明确意图时,可把累计变量写成num total = 0,说明它应保存数值。早期Dart允许省略类型,也允许后来补上。其静态检查器给出类型警告,不因这类警告自动禁止程序执行;检查模式还会在运行时检查若干赋值。类型标注因此兼作团队沟通和开发工具的依据。
这套说明针对早期Dart及1.x规范。可选类型、静态警告与运行时检查分别承担不同任务,不能把后来语言版本的类型规则直接倒推到2011年的技术预览。
虚拟机与浏览器转译并行
Dart代码有两条执行路线:交给Dart虚拟机运行,或由编译器转为JavaScript,再由现有浏览器的引擎执行。后一路线使采用新语言不必以所有浏览器先安装新虚拟机为条件。2011年公布预览时,Dart虚拟机尚未整合进正式Chrome,团队只是表示会探索这种可能。
并发则借助称为isolate的独立执行单元。它们各有自己的内存和控制流程,彼此通过消息传递通信,不共享可变状态。例如把计算交给另一单元,需要发出输入、接收结果,而不是让两个单元随意读写同一个累计变量。这种边界把并发协调显式化。
把语言变成可用的开发环境
2012年10月16日,Google发布首个面向开发者的Dart软件开发工具包版本。它补齐了更完整的HTML库、JavaScript互操作、服务器输入输出库和Pub包管理器,并提供名为Dartium的定制Chromium浏览器,让开发者在浏览器内直接运行Dart。
开发环境的作用是让代码能够被编写、检查、运行和调试,再转成可部署的应用。通过互操作库,项目可以继续调用既有JavaScript代码;通过包管理器,团队可以复用外部库。语言规则与这些工具一起工作,才使从小脚本扩展到大型应用的设想具有操作路径。
1.0发布与规范成文
2013年11月14日,Dart SDK 1.0发布,团队将其宣布为可用于生产的稳定工具包。Dart Editor提供补全、重构、跳转到定义及调试功能;dart2js负责把程序转成现代浏览器可运行的JavaScript。发布声明还列举Google内部客户关系管理应用等采用实例。
2014年6月,Ecma International发布ECMA-408第一版,正式规定Dart的语法和语义。标准以语言为范围,并不把所有库的应用程序接口都纳入规定。2011年的公开预览、2013年的稳定工具包和2014年的标准,分别对应开放试验、可部署实现与规范化三个阶段。