Proposal: Replace emitter with syntax tree transformations and a simplified node emitter

提案:使用语法树转换和一个简单的节点生成器替换掉现有的生成器。

In an effort to better support down-level transformations for complex emit like generators and Async Functions, and to be able to add new down-level transformations for the evolving ECMA-262 specification, we propose to replace the current emitter logic for the TypeScript compiler with an implementation that relies on transformations of the source tree.

为了更好的在底层支持复杂的生成结构,比如生成器和异步方法,并未不断发展进化的 ECMA-262标准的新规范添加转换,我们提出用一个依赖于源代码树转换的 TypeScript 编译器后端生成器替换掉当前的后端生成器逻辑。

Our current emitter is not built to handle the requirements for some of the more complex rewriting needed to support features such as generators (ES6/ES2015) and Async Functions (ES2016). In addition, as time goes on we will need to add more and more branching logic to handle down-level emit of new language features due to the yearly cadence that TC39 is adopting for the ECMAScript specification.

我们目前的后端生成器不是用来处理一些比较复杂的特性的,比如生成器(ES6 / ES2015标准)和 异步函数( ES2016)。此外,随着时间的推移,我们需要为 TC39采用的新的语言特性不断添加更多的分支逻辑。

Syntax tree transformations will give us the ability to transform our source tree in an iterative fashion, allowing us to inject new transformations at the head of a transformation chain so that few (if any) changes need to be made to existing transformations in later iterations. As a result, there would be minimal maintenance for the complex transformations needed for down-level generators, as long as new features are already transformed into a syntactically valid ES6 tree.

语法树转换器会允许我们以迭代的方式来转换我们的 TypeScript 源代码,他允许我们在转换链的头部注入一个新的转换器,这样如果有些内容需要改变的话,他会基于现有的逻辑进行转换。这样的结果是,复杂变换的生成器需要的维护成本被大大降低,只要将新的特性转变为一个语法有效的 ES6 语法树。

Generally this will also help to reduce the branching logic of our current emitter, and keep syntactic transformations isolated to an individual file for a language version or feature. As a result, the emitter itself can be simplified drastically and focus specifically on emitting the given syntax tree with almost no branching logic.

一般来说,这也可以帮助我们减少当前后端生成器的分支逻辑,并保证每个语言版本或者特性的语法转换器都是彼此鼓励隔离 在单独文件中。这使得后端生成器本身可以大大简化,并专注在特定语法树的生成中,几乎没有分支逻辑。

Requirements:
No transformation should directly modify the original source tree.
Transformations should be isolated to a specific language version or, when necessary, a language feature (i.e. TypeScript to ES6, ES6 to ES5, AMD module transformations, etc.).
Transformations should reuse existing syntax tree nodes when possible.
Transformations should employ a mechanism to quickly identify whether a node or subtree requires transformation to avoid a full walk of a source tree for each iteration.
Transformations should preserve source locations for use with source maps.
Transformations should not significantly impact the performance of the compiler, and ideally should improve compile time.

** 需求 **

  • 不能有任何的转换会直接修改原始的语法树
  • 转换应针对特定的语言版本或者有必要的情况下某个语言特性( 比如 TypeScript 到 ES6 ,ES6 到 ES5 , AMD 模块转换等等)
  • 转换器在可以的情况下应该复用现有的语法树节点
  • 转换器应该有一种机制快速确定一个节点或者子树需要被转换,避免每次迭代会对完整代码树进行遍历
  • 转换器应为 sourcemap 功能保留源代码位置
  • 转换器不应该明显影响编译器性能,理想情况下编译时间会改善。

Goals:
Transform a TypeScript syntax tree into a compatible JavaScript syntax tree based on compiler settings.
Source Map emit should behave as it does in the current compiler.
Comment preservation should behave as it does in the current compiler.

** 目标 **

  • 将 TypeScript 语法树转换为与编译器设置兼容的 JavaScript 语法树
  • SourceMap 应根据当前的编译器行为一致
  • 注释应和当前编译器行为一致。

Non-Goals:
We will not be replacing our declaration emitter with transformations at this time, though we may consider this in a future proposal.
We will not support end-user extensibility of these transformations at this time, though we may consider this in a future proposal.

** 非目标 **

  • 我们这次不会换掉我们的声明( Declaration File )转换器,这在我们未来计划的考虑中。
  • 我们这次不会支持终端用户扩展转换器,这在我们未来计划的考虑中。

Remaining Tasks:
Update to support block-scoped declarations captured in loops.
Verify comment preservation
Investigate comment preservation performance issues
Verify/adjust source map output
Fix failing tests
Update transformations to match recent changes to the emitter.
Investigate/improve performance of tree-transforming emitter.

** 剩下的任务 **

  • 支持循环中的块作用域声明捕获
  • 验证注释保存
  • 调查注释保存带来的性能问题
  • 验证 / 适配 sourcemap 输出
  • 修复失败的测试
  • 在更改了后端生成器之后更新转换器
  • 调查 / 改进语法转换生成器的性能。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容