C-002-001
supports保留采访者的问题、无限时间前提、对标准委员会的限定和最后一句,避免把“I don't have time”剪成脱离语境的宣言。
逐字稿主张、关系类型与来源之间的双向公开映射。
保留采访者的问题、无限时间前提、对标准委员会的限定和最后一句,避免把“I don't have time”剪成脱离语境的宣言。
两份同期官方公告分别证明 Dart 发布时 Chrome 集成尚属探索,以及 Dartium 技术预览后来把最终纳入 Chrome 写为目标。
二零零六年,Google 的浏览器项目仍然保密。Lars 希望留在丹麦,于是 V8 的早期小组没有搬进加州总部,而是在奥胡斯附近工作。
V8 官方回顾支撑 2006 年奥胡斯团队、农场附属建筑,以及 2008 年与 Chrome 同日公开的事实顺序。
可就在 Chrome 发布一个月后,Lars 接受丹麦媒体采访,谈的已经不只是机器速度。
他说,对多数应用来说,最后百分之二十到三十的性能并不是最重要的。真正昂贵的,是程序员的生产力。
他还描述了两种写程序的节奏。一种是修改代码,重新启动,看看能不能运行;不行,就再来一次。另一种是让系统保持运行,程序员直接在里面试验。
这份 V8 发布后的同期采访支撑 Lars 对运行中试验和人的反馈时间的长期关注;它不证明后来的 Dart 或 Flutter 决策由此单独产生。
Lars 以参与者身份概括浏览器引擎的友好竞争和整体速度提升;正文明确不把这句话当成可精确归因的成绩单。
二零一一年十月,Google 公开 Dart。它不是给 JavaScript 加几处语法,也不只是再造一台虚拟机。它想把刚才那些问题,分别放进语言、VM、库和编辑器里解决。
与此同时,Dart 仍然保留两条运行路线:有 Dart VM 的地方直接运行,没有 Dart VM 的浏览器则把 Dart 编译成 JavaScript。
语言、类型、VM、快照、编译到 JavaScript。每一项单独看都有工程理由。把它们放在一起,Dart 得到了一次从表面到底层重新安排的机会,也把一整套新选择压到了采用者面前。
Dart 初始公告支撑结构化大型应用、类型与工具目标,以及 VM 直接执行和编译到 JavaScript 的双路径;“bad parts”仍按创建者诊断呈现。
两个人刚刚把同一个问题摆到 Web 面前:JavaScript 应用越来越大,开发者需要更好的结构、类型信息和工具。
Anders 说,TypeScript 从 JavaScript 开始,也以 JavaScript 结束。
这意味着 TypeScript 的编辑器和编译器可以先给开发者带来价值,不必等待 Chrome、Firefox、Safari 和 Internet Explorer 同时安装一种新运行时。
Anders 的原声和 TypeScript 发布说明共同界定 TypeScript 从 JavaScript 出发、编译后仍回到 JavaScript 的兼容路线。
Lars 把这条路线称作 a safe bet,一场更稳妥的赌注。
采访继续谈到标准演进。Lars 说,如果拥有无限时间,渐进改善当然合理。
从这个角度看,Dart 的 clean break,也就是和旧设计做一次更彻底的切割,不只是对整洁的追求,也是一种时间判断:与其等旧系统逐步修补,不如先造出一套完整的新系统,再用结果说服别人。
同场采访证明 Lars 在未实际编码 TypeScript 的限定下称其为 safe bet;Microsoft 的同期文章提供渐进演进与 Web 兼容的另一方语境,不能据此推导胜负因果。
Dart 后来成为 ECMA-408 标准,却没有因此自动跨过这座山。ECMA-408 规定 Dart 语言可以怎样实现,不代表各家浏览器已经同意把它装进去。
到二零一五年,ECMA-408 已经发布四版,装有 Dart VM 的技术预览浏览器 Dartium 也公开存在。可主流浏览器里,仍然没有第二个原生 Dart 实现。
ECMA-408 官方页证明四个正式版本,Dartium 公告证明技术预览真实存在;两者都不能单独证明其他浏览器采用原生 Dart VM。
不是 Dart 项目停止,不是可以在浏览器之外独立运行的 Dart VM 消失,也不是 Dart 从此退出 Web。
几年工程投入以后,那台在 Dartium 中真实运行过的 VM 没有进入正式 Chrome。开场里那个位置,就在这一天真正空了下来。
官方公告给出的直接理由是,实际用户最终都要把 Dart 编译成 JavaScript,团队需要更好的 JavaScript 集成、更一致的跨浏览器调试,以及一条统一的部署路径。
2015 年官方公告直接证明终止 Chrome 原生 VM 集成计划,并把 Web 路线集中到编译 JavaScript、跨浏览器调试和统一部署;它没有宣布 Dart 项目停止。
一个名叫 Sky 的移动 UI 实验,早在二零一四年十月就已经提交第一版代码。
二零一五年一月底,仓库里出现一个名为 sky use dart 的实验开关。
接下来十几天,工程师把 Dart 绑定层搬进来,接上 VM 和快照,再把 V8 绑定层和 V8 本身断开。二月十日,一个由 Dart 驱动的旋转方块已经跑了起来。
Sky 不是在 Chrome 放弃 Dart VM 以后才出现的救援项目。它先独立存在,先用 JavaScript,又在两条路线都还没有确定命运时,主动改用 Dart。
三段源码历史共同证明 Sky 先以 JavaScript 开始,并在 Chrome 路线公告前完成 Dart 切换;它们不保存会议室里的完整选型理由。
为什么?仓库保存了动作,却没有替我们保存会议室里的全部理由。今天没有一份完整的同期评分表能替我们回答。
公开源码提交证明迁移发生过。二零二一年的参与者回忆给出后见解释:JavaScript 原型随着层次增加,启动变慢;团队评估多种语言,最后选择了能够和框架共同演进的 Dart。
Eric Seidel 的后见回忆提供 JavaScript 启动问题和 co-evolve 解释;正文保留回忆与同期工程记录之间的证据层级差异。
Eric Seidel 的现场演示直接证明 2015 年 4 月的 Sky 画面已由 Dart 驱动;它不能证明 Chrome 放弃 Dart VM 的原因。
可普通 iOS 应用不能在设备上随意生成和执行新的机器代码。对依赖 JIT 的运行时来说,这不是慢一点的问题,而是发布边界。
Flutter 因此需要 AOT,Ahead Of Time compilation,预先编译。
开发时使用 JIT。应用保持运行,修改后的代码可以快速进入现有的 Dart VM;界面状态不必每次清空,程序员不用从首页重新走一遍。
三份工程材料连接 iOS 发布限制、开发期 JIT、发布期 AOT 与 2015 年预编译快照实现;不能把后来成熟能力倒写成最初即完整存在。
其中一次改动测量垃圾回收的一个子步骤。测试设备是 Nexus 4,工作负载是 Flutter Gallery;主线程上的最长耗时,从十七点七毫秒降到一点一毫秒。
这个数字不能扩写成“Dart VM 普遍快了十六倍”。它只属于那台设备、那个应用、那项指标。
十七点七毫秒,听起来几乎小到不值得讲。可一块六十赫兹的屏幕,每一帧大约只有十六点七毫秒。虚拟机里一个平时没人看见的垃圾回收步骤,已经足以独占甚至越过一帧。
commit 明确记录 Nexus 4 / Flutter Gallery 的 weak-handle processing 最大值 17.7ms 到 1.1ms;正文同时限制该数字只属于当时设备、应用和指标。
二零一六年,Lars 和 Kasper 在演讲后半主动打出一张标题为《与 Flutter 的蝴蝶效应》的幻灯片。
架构图里,Dart VM 位于 Flutter 栈的底层。Lars 说,如果 Flutter 出现性能问题,他们可以到 Dart VM 里修。
这段声音不是装饰。它让“共同演进”变成一个很具体的动作:界面卡住以后,团队可以沿着技术栈向下走,走进 Dart VM,再在那里动手。
它能证明,到二零一六年,Lars 已经公开把 Flutter 当成 Dart 未来的重要部分。它不能证明 Flutter 是他创建的、选择 Dart 由他一人决定,或后来所有语言变化都属于他。
Lars 公开说明 Flutter 性能问题可以进入 Dart VM 修复,并提到为 Flutter 完成大量 VM 与 AOT 工程;正文不把它扩大为个人创建或单独决策。
早期 Dart 的类型更像给工具的提示。真实的大型工程很快暴露出张力:如果类型只是一条建议,开发者和编译器究竟敢多相信它?到了 Dart 2,类型逐渐成为双方都能依赖的契约。
Flutter 把按钮、文字、布局乃至整个页面这样的界面构件统称为 widget。Dart 2.3 加入 spread、collection if 和 collection for。
用普通话说,开发者可以在创建一组 widget 的地方,直接展开内容,直接写条件和循环。原本要绕到外面准备列表的 UI 逻辑,回到了界面结构所在的位置。语言开始顺着人搭建一块屏幕时的思路生长。
这些来源共同证明 Dart 2 的类型变化受多条工程压力影响,以及 Dart 2.3 的集合语法直接围绕 Flutter UI 构建;避免简化为 Flutter 单独改造 Dart。
两份官方发布公告分别确认 Dart 2 stable 与 Flutter 1.0 的时间顺序。
这份离开 Google 后的采访证明 Lars 与 Kasper 已投入 Toit,并再次把一秒以内的反馈循环与程序员试验联系起来;它没有解释离职原因。
到 Flutter 1.0 发布时,这个问题已经有了一种很具体的形状。
调试模式下,应用仍然运行在 Dart VM 里。程序员保存文件,更新后的代码进入正在运行的虚拟机。
应用状态保留下来,手机上的界面随之改变。Flutter 当时的官方说明把热重载时间写成,一秒以内。
这就是 stateful hot reload,保留状态的热重载。
它不是 Lars 一个人的发明,也不是对 Dart 浏览器路线的补偿。把它说成个人翻身,会抹掉 Flutter、Dart、VM 和工具团队共同完成的工作。
Flutter 官方材料支撑调试模式下 VM、状态保留与一秒以内 hot reload 的产品表述;正文明确这不是 Lars 一个人的发明。