微信号:infoqchina

介绍:有内容的技术社区媒体

JSIL:将CIL编译为JavaScript时所遇的挑战

2013-12-06 14:49 InfoQ

InfoQ:将CIL编译为JavaScript有多难?你认为最困难的是哪一部分?


K. Gadd:很难从一般意义上来描述这种困难。项目的早期阶段还处于研究阶段,我基于一个开源的C#反编译器创建了一个简单的项目原型,而我编写的JavaScript代码生成器其实是这个项目中的C#代码生成器的一个修改版本。这是一种能够在某种程度上证明我准备验证的一些基本原理的简单方式,当时我的脑海中存在着各种各样的问题:“.NET语言和运行时中的哪一部分能够清晰地映射到浏览器中,运行性能如何,当前的反编译器技术的质量怎样,以及实现了这些目标的反编译器会多么复杂?”这一过程仅仅花费了我微不足道的一些精力,而早期阶段的成果让我看到了希望,它促使我决定把JSIL当作一个严肃的项目来对待。


自那时起,事情就开始变得复杂了。IL特性中的主要部分,例如算术运算、字段与属性的访问等等,很容易就能在一个基础水准上实现这些功能,因此编写出良好的代码并使一系列测试用例正常运行也不是什么很大的问题。而大部分工作业务都消耗在那些边边角角的地方,比如说ECMA CLI详细规格中没有显而易见的结论的部分、有许多晦涩的功能依赖于C#编译器、还有许多本身就非常难以实现的特性。如果我的目标是为从头开始进行开发创建一个编译器,就像Script#所做的事一样,那正确的做法是完全忽视这些特性,除非它们能证明自身的存在价值。但因为我的目标是移植现有的软件,我不得不倾尽全力以找出支持这些特性的方法。


在某些特殊情况下事情会变得极度困难。总的来说,由于我缺乏编译原理的知识,或者是整体上缺乏计算机科学的教育背景,这意味着为了解决难题,我必需学习很多新知识,并且动手进行各种实验。举个简单的例子,如何恰当地处理“ref”与“out”参数就是我正在攻克的难关,这是由于JavaScript并没有相应的特性,而要模拟这一特性需要对代码进行比较复杂的自动转换。刚开始时,处理这两个参数的转换代码有许多严重的缺陷,现在两年过去了,目前的实现方式已经变得十分复杂。这一课题目前基本算是“已解决”,因为我已经没有在这方面遇到什么新的问题了,不过在我期望这一功能功能作为我的基本代码库的一部分,在未来也能够正常运行。


整个过程中最主要的挑战实际上有些违反常识,因为试图从IL中创建良好的JavaScript代码所需的不仅仅是反编译IL代码,并且还要将C#编译器所做的一些优化工作剔除,并加入一些我设置的优化功能。要在缺少指导手册的情况下正确地处理这一工作,要求开发者必需掌握非常非常扎实的静态分析与其它相关课题的知识,缺乏这些知识会导致你在实现优化时在代码中留下各种严重的缺陷。JSIL中的静态分析与优化部分大概是我过去一年来所修复的大部分缺陷的直接原因了,面对这些挑战只能依赖我所掌握的那些不完整的知识见招拆招。那些对处理这方面问题有兴趣的人,首先得做好花费大量时间阅读相关材料的心理准备 :)。 从好的方面来说,优化后的结果还是让你的投入非常值得,很多情况下,优化后的结果是从比MS CLR慢50倍提速到比CLR只慢5倍。


***********************************

本文来自InfoQ微信公众账号:infoqchina

1、回复“今日新闻”,查看今天更新的新闻;

2、回复“今日英文”,查看今天英文站的更新;

3、回复“文章 +关键词”,搜索关键词相关内容;

4、回复“QCon”,了解QCon大会相关信息;

5、回复“活动”,了解最近InfoQ组织的线下沙龙;

6、回复“架构师”,获取《架构师》下载地址;

7、回复“投稿”,了解投稿和加入编辑团队的流程。

***********************************

 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 【第154期】WebAPP与原生APP的交互设计区别 岂安科技受邀出席2016年中国航空-增值收入及商品销售高峰论坛 Android开发过程 我对于微信文章的感悟 自定义View(一)