问题描述
从 Microsoft Edge’s JavaScript engine to go open-source 上看到,微软准备在下个月开源其 JavaScript 引擎 Chakra 的核心部分("ChakraCore")。文中介绍说 Chakra 在运行速度和对 ES6 的支持上都是业界领先的。

我感觉和 coreclr 一样, Chakra 肯定是花了相当大的投入,其代码一定值得一看。
一句话:微软大法好!
今天一早就听说了这个消息,兴奋不已。可惜今天一天都不在家,刷知乎不够及时没抢先发这个问题/讨论,哈哈~
等源码真的放出之后有机会再来更新。
(2016-01-13更新:开源啦!
Github地址:
Microsoft/ChakraCore · GitHub)
Chakra从诞生之时开始就非常有竞争力,在许多方面它在现代主流JavaScript引擎里都是领先的,或者说是特别的。它的源码是非常好的学习资料,如今即将能看到它开源出来自然振奋人心。
例如它的GC,它是主流产品里少有的用内存页写保护的方式来实现并发GC的写屏障(write-barrier)的。参考:
Advances in JavaScript Performance in IE10 and Windows 8用Node.js对V8的GC有所不满的同学们,或许Node.js/Chakra是个有趣的选择。
又例如它的JIT编译器里的类型推导与V8、JavaScriptCore、IonMonkey之间的异同,也会是很有趣的方面。
Chakra的数据流分析看来也做了不少工作,很好奇它具体做了啥,它是怎么用FlowGraph / FlowEdge的。
还有,Chakra的code gen在对抗heap spray之类的攻击方面也下了不少功夫,也是值得外界学习的方面。
不知道Chakra的JIT编译器在需要重量级优化的地方有什么对策。JavaScriptCore率先投入重磅的基于LLVM的FTL,V8也跟着开始开发新的TurboFan,SpiderMonkey则通过OdinMonkey在asm.js场景取巧,那Chakra拿什么来应对?拭目以待。
题主提到了Chakra与CoreCLR相比,我觉得Chakra搞不好比CoreCLR更有值得学习的地方——从VM实现者的角度来说。
Chakra的架构师,Steve Lucco,之前是在CLR组做架构师的。但我的个人猜测,他在CLR组干得或许不太得志——他在加入微软前还设计过一个名为OmniVM的VM,然而后来CLR的设计与实现还是更多的受JVM和Anders的影响,而与OmniVM的设计理念有许多不同。
Chakra应该是让Steve全权新设计的,这下就爽了,各种重型武器毫无吝啬的都扔了进去。
当然,微软也不会平白无故决定把这么重量级的程序开源出来。
看来开源的目的之一跟CoreCLR一样,是希望得到社区力量的支持来帮助Chakra移植到其它平台上。大家有兴趣在Linux或者Mac上用Chakra的话,这下就有福了,而且也可以向其贡献自己的力量。
有些Chakra很特别的或者说曾经领先的地方看来不会包括在这次开源的ChakraCore里。
- Chakra与IE/Edge的DOM之间的整合。请参考:HTML5, Modernized: Fourth IE9 Platform Preview Available for Developers 以及 Exploring IE9’s Enhanced DOM Capabilities 。Chakra与IE的组合可能是业界率先让JavaScript引擎的GC直接去管理浏览器的DOM节点的;在它之后,WebKit系才开始在WebKit2里加强DOM与JavaScriptCore的耦合,(外加其多进程模型与Chrome的不完全兼容)于是也导致了Blink的fork,以及后者的Oilpan项目。对Oilpan项目可以参考Garbage Collection for Blink C++ objects (a.k.a. Oilpan)。
- Chakra在Windows Store里支持字节码缓存的功能。它可以在把JavaScript源码parse成字节码之后缓存起来,避免后续执行需要重复parse源码的开销。
顺带放几个传送门:
JavaScript 可以开发 Windows 8 应用,但为什么它不是直接运行在 CLR 上,而又重新弄了一个虚拟机 Chakra? - RednaxelaFX 的回答如何对比 v8 跑 node.js 和微软的 Chakra 跑 node.js? - 互联网