1月份接了一javascript引擎移植的活,虽然没有最后做完,但是在其中也收获了不少东西,现在该写点东西总结一下了:
大概内容就是给一款web浏览器(小日本的)做个“心脏搭桥手术”,把它现在用的js引擎(自主研发的),换成firefox的tracemonkey.
原先引擎封装的可真叫一个烂,源代码看了一个月才彻底搞明白。然后开始“做手术”,tracemonkey的资料较少,就先用spidermonkey做试验。因为spidermonkey的调用方式有两种,一种是XPconnect,另外一种是使用jsapi。firefox使用的是前一种方式,我猜想这样的效率可能更高,但是用在自己的程序中的复杂性可能会更高,所以我还是使用了第二种方式,使用jsapi给完成runtime context的建立和销毁后,就尝试把window对象作为引擎的全局对象,并把它的属性和方法添加到新建的context中。再然后就是把dom对象和一些这个浏览器需要的其他对象添加进来。然后再模拟一些其他的函数,比如引擎暂停和恢复运行的功能等等。这个工作就可以大体上做完了。
可惜移植工作做到一半的时候(差不多window对象加入完了),小日本变卦不想做了(可能是经济危机的原因吧),所以也只好提前停工了。可惜是可惜了一点,但是这中间收获的经验和信心却是非常宝贵:
1) 我看过的源代码不少,但基本上都有比较清楚注释,但这回的代码一条有用的注释都没有,有几条日文的注释翻译过来也不像人话了。这确实加大了读代码的难度,可还是坚持着读下来了。以后再遇到多么复杂的代码我多有信心去读了
2) 我一直认为自己对于脚本语言(包括:perl,javascript等等)还算有点研究。起码日常的应用没问题,别人写的脚本一般也能看懂。可在研究完这个js引擎后才惊讶的发现,自己以前对脚本语言的认识真的只停留在应用的层次上。对于一些重要的概念并没有彻底的搞明白(比如: 闭包,作用域链,原型链等等)。我现在才真正明白:要想彻底搞懂一门语言,看它的编译器(解释器)绝对是必要的。
3) 这个引擎是用纯c语言写的。它当中的有些算法确实非常的精妙,而且作者对于数据结构的应用也恰到好处,做到了使用最少的资源,来达到最高的效率。所以这段时间发现自己的c语言功底又加深了不少。
总之: 虽然项目并没有真正做完并交付使用,但是实施的过程却是积极并富有成效的。呵呵。
这段时间真的够累, 还是先修整一下,然后再考虑下一步的学习计划。前两天我去驾校报了名,修整阶段去学一学车也不错,毕竟早晚要学的。
阅读(1227) | 评论(1) | 转发(0) |