摇树

2021-08-01 21:08:57

跳转到导航 跳转到搜索 在计算中,摇树是一种死代码消除技术,在优化以 ECMAScript 方言(如 JavaScript 或 TypeScript)编写的代码到由 Web 浏览器加载的单个包中时应用。通常与 minifier 常见的传统单库死代码消除技术形成对比,树摇动通过从入口点开始并仅包括可能执行的函数来消除包中未使用的函数。 [1] [2] 它被简洁地描述为“实时代码包含”。动态语言中的死代码消除比静态语言中的问题要困难得多。 “摇树器”的想法起源于 1990 年代的 LISP [3]。其思想是,一个程序所有可能的执行流程都可以表示为一个函数调用树,这样就可以消除从未被调用的函数。该算法在 Google Closure Tools 中应用于 JavaScript,然后在同样由 Google 编写的 dart2js 编译器中应用于 Dart,由 Bob Nystrom 在 2012 年提出 [4] [2] 并在作者 Chris Buckett 的“Dart in Action”一书中进行了描述2013 年:当代码从 Dart 转换为 JavaScript 时,编译器会进行“摇树”。在 JavaScript 中,即使你只需要一个函数,你也必须添加一个完整的库,但是由于树摇动,Dart 派生的 JavaScript 只包含你需要的库中的单个函数 这个术语的下一波流行归因于到 2015 年开发的 Rich Harris 的 Rollup 项目 [5]。 JavaScript 中摇树的流行是基于这样一个事实,即与 CommonJS 模块不同,ECMAScript 6 模块加载是静态的,因此可以通过静态解析整个依赖树来推导出语法树。因此,摇树成为一个简单的问题。然而,摇树不仅适用于导入/导出级别:它还可以在语句级别工作,具体取决于实现。 [需要引用]