本周要点:V8 引擎本周也满 10 岁啦,npm 开始酝酿下一代的包管理器,与此同时 yarn 也不甘落后 推出了 Plug’n’Play 提案。
🗞 新闻联播
继上周 Chrome 10 周岁,这周 V8 团队也在官方微博庆祝 V8 10 周岁了。博文中回顾了 V8 的十年历程中的重要里程碑:
- 2006 年, Google 聘请了 Lars Bak 为 Chrome 浏览器开发一个全新的 JavaScript 引擎,当时在内部还是一个秘密项目;
- 2008 年,随着 9 月 2 号 Chrome 的发布,V8 在同一天开源,最初的 第一条 commit 可以追溯到 6 月 30 号;最初,V8 只支持 ia32 和 ARM 指令集,使用 SCons 作为构建系统;
- 2009 年,引入全新的正则表达式引擎 Irregexp,提升真实场景下的正则表达式性能;加入了 x64 指令集支持;这一年 Node.js 的第一个版本
0.0.1
发布了,嵌入了 V8; - 2010 年,V8 引入了一个全新的优化 JIT 编译器 Crankshaft,生成相比之前快 1 倍而且体积减少 30% 的机器码;同年加入了 32 位 MIPS 指令集的支持;
- 2011 年,发布了新的 增量式垃圾回收器,极大地提升了 web 应用和 HTML5 游戏的交互性能;实现了 ES5 严格模式的支持;将 V8 的构建系统从 SCons 迁移到 GYP;团队也从最初的丹麦迁移到了德国慕尼黑;
- 2012 年, V8 的基准测试之年;基于 Sunspider 和 Kraken 基准测试集的度量冲刺提升性能;开发了一个新的基准测试集:Octane,刺激了主流 JS 引擎提升运行时性能优化和 JIT 技术的应用;
- 2013 年,发布 Octane 2.0,加入如 asm.js 场景的用例;
- 2014 年,将部分主线程的 JIT 编译移到后台,引入了 concurrent compilation(并行编译),减少页面卡顿并显著提升性能;落地了 优化编译器 TurboFan 的初始版本;合作伙伴帮忙实现了 V8 针对 PPC、MIPS64 和 ARM64 指令集的支持;构建系统也跟随 Chromium 的脚步切换到了 GN;源码管理也从 SVN 迁移到了 Git;
- 2015 年,实现了 code caching and script streaming(代码缓存和流式脚本处理),显著提升了页面加载性能;启动了新的解释器 - Ignition;尝试了 JavaScript 子集化的想法,引入 strong mode 实现更有力的保证和更可预测的性能,但后来发现成本收益比不高;实现了 Idle-time garbage collection 显著降低了垃圾回收卡顿和内存开销;第一个WebAssembly 的原型落地;
- 2016 年,交付了 ES2015 特性集的收尾工作以及 ES2016 的部分特性;开始推出新的 Ignition + TurboFan 编译器流水线,用来 编译和优化 ES2015 和 ES2016 特性,并在 低端 Android 设备中默认启用 Ignition;启动了 Orinoco 项目,它是一个新的并行垃圾回收器,用来减少主线程垃圾回收耗时;重新聚焦性能优化的方向,由综合性的微基准测试转向 真实环境下的性能度量和优化;将 V8 检查器从 Chromuim 移植到了 V8,从而使 V8 嵌入者可以使用 Chrome DevTools 来调试 V8 中的 JavaScript;WebAssembly 从原型升级到了实验式支持;
- 2017 年,终于完成了多年的引擎翻修,正式默认启用新的 Ignition 和 TurboFan 流水线,也彻底 移除了旧的 Crankshaft 和 FullCodegen 流水线;启动了新的垃圾回收器 Orinoco v1.0,包括 concurrent marking(并发标记)、concurrent sweeping(并发清除)、parallel scavenging(并行回收)和 parallel compaction(并行压缩);实现了 JavaScript modules 的支持以及完整的 ES2017 和 ES2018 特性集;交付了 JavaScript 代码覆盖率的原生支持,启动了 Web Tooling Benchmark 度量 V8 的优化如何影响真实世界开发者工具及其生成的 JavaScript 代码的性能;
- 2018 年,针对年初的 Spectre/Meltdown 漏洞 V8 也交付了应对的 缓解办法;最近则刚刚交付了一个新的针对 WebAssembly 的基线编译器 Liftoff;交付了
BigInt
用于 JavaScript 中的任意精度整数的操作;实现了 在后台线程上编译脚本字节码;以及未完待续……
GitHub Pull Requests in Visual Studio Code
- VS Code 团队推出了一个公开预览版的扩展 GitHub Pull Requests,可以在 VS Code 中直接 review 和管理 Pull Request,再也不需要在 IDE 和浏览器之间来回切换了。
Yarn Plug’n’Play: Getting rid of node_modules
与上面的 tink 看起来有些类似,yarn 的这个新提案给出了一个完全可选的替代方案来解决依赖安装到本地的问题,而且还给出了 相关实现的 PR,其中的一些亮点包括 70% 的包安装提速、应用启动速度会更快、yarn 可以准确提醒你在
dependencies
中遗漏了需要列出的包、CI 上的 yarn 安装过程将可以省略等。这个方案已经在 Facebook 内部生产环境中使用了大约 2 周了,目前还没有发现什么问题。因此是时候他们决定向外推出了。yarn 的这个提案的实现看起来与 tink 确有些类似,只是
node_modules
底下前者放的是.pnp.js
文件描述包的静态解析表和解析器,而 tink 的方案里则放的是.package-map.json
文件记录各安装包内文件的 hash 值。那本地找不着要安装的包,实际都去哪儿了呢?可以推断应该都在各自定义的一个集中化的目录下,这样就能实现跨项目的包安装复用,感觉有点像引用了安装在全局的包,只是在解析的过程中又需要更好地处理多版本并存、link
软连接等问题。期待这条路趟出来,相信对于大家的磁盘压力会小得多。
📖 百家讲坛
- Chrome DevTools - Debugging Node.js Application Using ndb
- 从原始的
node debug abc.js
到 node-inspector 再到node --inspect-brk
,Node.js 的调试体验一步步进化,而前两个月,或许你听说了,Chrome 实验室又推出了一个改进的调试体验工具 ndb,相比之前又有了一些新的强大特性:1. 自动探测和附属上子进程;2. 可以在模块被require
之前放置断点;3. 可以直接在调试器 UI 上编辑文件并保存到本地;4. 默认自动将当前工作目录之外的文件 blackboxes(排除在外)。
- 从原始的
- Chrome’s new design — a UX perspective
- 从用户体验视角解读 Chrome 的全新设计。包括搜索优化、标签栏管理、滚动时扩大可视区域、Material Design 等。
- Designing With Code
- 使用代码作为工具参与设计已经不是一件新鲜事了,尤其是 Sketch 的出现后,去年 Airbnb 就推出了 React Sketch.app 工具,试图通过 React 代码作为涉及资产解决涉及与代码的更新同步问题,在 知乎上也引发了大家的广泛关注和讨论,这之后还有网页版的设计工具 Figma,也在 4 月份引入了 将设计转换为 React 代码 的支持。本文作者分享了在做华尔街日报的两个项目中通过编写代码作为设计工具来创建设计的实践。
- The Problem with font-display and Reflow
- 进行性能优化时,决定 Web Font 的加载行为是一项技术活。
@font-face
规则中新增了一个font-display
声明,开发者可以根据 Web Font 的加载时间来决定如何渲染或降级处理。如果你还没用过font-display
,可以先通过 《Controlling Font Performance with font-display》(这里是中文翻译版本)了解一下。而font-display
使用可能会遇到渲染重排的问题,这篇文章里介绍了原因和解决办法。最简单的方法就是使用font-display: optional
。
- 进行性能优化时,决定 Web Font 的加载行为是一项技术活。
- Introducing the React Profiler
- React 16.5 新增了 DevTools profiler 插件的支持,使用 React 实验性 Profiler API 来收集每个被渲染的组件的耗时信息,为在 React 应用中定位性能瓶颈提供帮助。本文介绍了如何使用这个工具以及如何分析诊断相关的输出数据。
👤 大家
本周的“大家”,让我们关注 V8 的创始人 Lars Bak。
- 2000或2001年以前在美国,是Sun的 HotSpot JDK的主力开发之一。
- 回到丹麦,2002年创立 OOVM。因为他对 Smalltalk 的热爱,OOVM 被写成一个以 Smalltalk 为开发语言的迷你虚拟机,主打各种资源有限嵌入式设备,代码调试、热部署、热替换都很方便。没记错的话当时宣传是最低128K RAM就可以运行。
- OOVM 在 2004年被当时 J2ME VM 的主要开发商 Esmertec 收购,后来改名为OSVM,以突出其能够在 bare metal 上运行的特性。
- Lars Bak的家是个丹麦的农场,有时候高层开会就跑去他家里开…
- 2006年因为经济不景气,同时 OSVM 始终没能在市场上取得大的进展(一方面原因是 Smalltalk 还是太小众了),Esmertec 关掉了位于丹麦的 OSVM分支。
- Lars Bak 随后加入 Google。这里 Wikipedia上的记载有误,他是在06年而不是04年加入 Google 从事V8开发的。
后来V8和Dart的工作大家都知道了。
作者:rlei
链接:https://www.zhihu.com/question/21918553/answer/19857329
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
大神确实是大神,虚拟机玩得出神入化。《金融时报》当年还为他发过一篇人物特写,摘录其中的一小段:
这个丹麦人首次在加州硅谷引起人们的注意是在1991年,那时他在Sun公司工作,后来成为业界最佳程序员之一。1994 年,他离开Sun,帮助创建了Animorphic系统,该公司后来被Sun收购。再次回到Sun之后,巴克开发了后来成为Java HotSpot(行业标准计算系统之一)的程序。
抛开法律和市场份额不说,技术挑战已经存在了。微软不得不创建比V8更好的东西,巴克说。很多技术观察家很怀疑他们能够在短时间内完成:在测试中,V8处理JavaScript的速度比最常见的IE浏览器要快56倍。我们一开始就是高标准,巴克说。随后谦虚地加了一句:还算成功啦。
即使Chrome漫画没有让巴克迅速成名,他的知名度在这几个月中也迅速增加。越来越多的人想了解Chrome背后的这个人。他宁可写虚拟机器,也不愿意管理奥尔胡斯办公室,而且他宁可做其他所有事情,而不是和记者谈话,可那是游戏的一部分,他接受了。话虽如此,他离Facebook的创建者马克 扎克伯格或比尔盖兹还有很远的距离。我问,在漫画出来之后,你有没有收到粉丝的邮件?他笑了:没。不过我也没有收到抱怨的邮件。
🛸 探索·发现
15 Best Google Fonts by the Numbers (Tips on Usage)
- 按使用量统计排名的 Top 15 Google Fonts。
-
即将要登录 iOS 12 的 AR 3D扫描应用 3D Scanner,能扫描现实的物体再复制出来,甚至还能扫描自己坐在旁边!还可以把扫描出来的 3D 模型用 iMessage 分享给朋友,对方收到以后可以在 AR 场景中查看,相当酷炫,你们看视频感受一下。
-
- 又一个从源码生成图片的工具,做 PPT 或者 Keynote 神器。不过相比之下似乎还是 Carbon 更强大一些。
-
- 一个用来构建实时数据可视化的 JavaScript 类库,效果很炫酷:
- 一个用来构建实时数据可视化的 JavaScript 类库,效果很炫酷:
-
- 百度 Echarts 的当家花旦 @羡辙 小姐姐推出了免费的 ECharts 学习教程,对数据可视化感兴趣的萌新们可以看过来。
🛰 天气预报
09.17 iOS 12 正式开始推送
09.20 - 09.21 Vue.js London,📍伦敦
- 这次还特邀了 React 大佬 Dan Abramov 😎,不知会碰撞出什么火花
- 09.20 - 09.21 Google Developer Days China 2018,📍上海
- 09.23 第七期 杭州 Node Party 技术分享,📍杭州
- 09.29 - 09.30 React Boston,📍波士顿
- 10.14 腾讯 IMWebConf 2018 ,📍深圳
- 10.14 PyCon China 2018 北京站,📍北京
- 10.18 - 10.20 QCon 2018 上海站,📍上海
- 10.21 PyCon China 2018 上海站,📍上海
- 10.27 PyCon China 2018 深圳站,📍深圳
- 11.04 PyCon China 2018 杭州站,📍杭州
- 11.16 - 11.19 CNUTCon 全球运维技术大会2018,📍上海
- 12.07 - 12.08 ArchSummit 全球架构师峰会,📍北京
评论