- 本帖最后由 Hengstar 于 2012-11-18 22:11 编辑 *
--------------------------------------------前言----------------------------------------
相信这是一个对公司技术而言比较激动人心的话题。首先声明:我不是标题党!
难得有一个双休的周末,总算有时间能静下来研究点东西了。
想到现在项目开发中遇到的一些问题,最令人头疼的无疑是JS脚本的调试问题了。相信这个问题也是目前公司大部分技术痛恨的问题吧。大把大把的时间浪费在一些诸如大小写写错,少个标点符号之类的简单问题,而且只能靠print在n多位置输出结果来缩小错误查找范围(有同感的童鞋们一定要顶哦!:lol)。
上周刚写过一篇关于跨平台的文章《http://blog.chukong-inc.com/index.php/2012/11/14/搭建跨平台的统一c代码工程方案-跨平台篇/》。看过的童鞋们应该记得文章中提到过关于Google v8提供的Eclipse插件,可以用来调试JS脚本。没错,它是真的,而且是强悍的! 这两天专心钻研了下v8,总算了解了使用方法和一些内部原理机制。并且能够正常调试,也尝试移植到我们目前项目的代码中成功运行了。所以发此文章把一些学习心得和大家分享下。欢迎大家共同探讨。
--------------------------------------------为什么选择Google v8?----------------------------------------
关于在调试脚本上大量的时间浪费,我认为主要原因归结如下:
1.脚本语言本身的灵活性导致了不严谨性,且没有编译器的排错支持;
2.习惯性的手工写脚本,没能充分地利用IDE的auto-complete功能;其实VS,Eclipse之类的IDE都提供了intelligent代码解析功能。只要配置恰当,是可以让IDE帮你自动补全你想输入的已经定义过的名字的(个人觉得VS+VA的aoto-complete是最好用的)。
3.最致命的问题还是由于没有调试器的支持。
有些童鞋也许要反驳了:新的IE浏览器,Chrome浏览器,Firefox的Firebug都支持JS脚本的调试功能,而且很强大了。的确是这样的,没错。不过我在这里的讨论的是不依赖浏览器的JS脚本。做Web开发的应该比较了解,web应用程序中,JS都是由各个浏览器去解释执行的。每个浏览器都内置一套解析JS脚本的引擎。例如:Firefox的SpiderMonkey(我们目前服务器端和SPII引擎的JS脚本部分就是用该引擎解释执行的),Google Chrome的v8(我们本次讨论的主角)。所以,很自然的,各个浏览器开发商都可以基于自己的这套引擎在自己的浏览器内潜入JS的调试环境。毕竟JS主要还是用于Web开发的脚本语言。但是随着技术的发展,现在JS已经逐渐被应用到Web之外的众多领域。我们公司就属于其一,在非web的游戏开发领域,确实比较前卫了。我们的大部分项目底层都是用C++实现的,用SpiderMonkey将JS脚本嵌入工程用作上层逻辑开发。现在的问题是:没有浏览器的支持,如何去调试JS脚本呢?虽然基于开源的引擎,理论上是可以开发一套自己的调试器,作为插件嵌入到IDE中的。但是这样做技术难度比较大,而且做出来也不一定能在短时间内达到稳定实用。但是如果引擎的开发者已经提供了这样的好用的工具,有什么理由不直接使用呢?
之前花了点时间去寻找直接支持SpiderMonkey解析JS的调试方案,没有找到比较满意的东东。不过的确有些个人开发了一些简单的插件。只是太过简单,文档什么的都没有,也没有人提供维护,所以没有打算使用。之前早就听说Google v8提供了调试工具。这两天查阅了相关资料,发现确实很强大。文档虽然不算很详细,但是已经足够你使用和做一些简单的优化扩展了。链接如下:http://code.google.com/p/chromedevtools/
从文档中了解到v8是目前最快的浏览器JS引擎,貌似还有Benchmark针对Firefox和Safari的一些性能对比测试。本人目前还没有验证过,既然Google都这么说了,我就信了吧-.-#。通过看他们的一些内部机制介绍, 可以看出,高效是有条件的。因为使用了hidden class的机制,第一次创建某个对象时会相对比较慢。因为要创建hidden class。但是重复使用时会变得异常高效。这就是复用的魔力,将需要动态查找的信息静态化。详见官方的文档。
https://developers.google.com/v8/design
Google提供了两种调试工具,一种是基于Console的D8(目前还没有尝试使用)。另一个是基于Eclipse的插件,提供GUI的调试。我选择的是后者。
接下来进入大家最关心的如何使用的话题了。其实官方文档里面已经说明的比较详细了,不过使用过程中还是会遇到各种各样的问题。为了让大家少走弯路,我整理了一下大致的流程供大家快速参考。好了,废话说完了~
-------------------------------------开发环境限制-----------------------------------
我测试的环境是Linux CentOS 6.3 + Eclipse CDT 1.5.1
Eclipse可以在官方下载各个平台的版本
http://www.eclipse.org/cdt/
这是一个比较沉重的part。既然这个插件是Eclipse的插件,自然也限制了IDE必须是Eclipse了。但是为了GUI调试的便利,忍了吧。实在不想用Eclipse的童鞋可以考虑用Console的调试器D8。不过好在Eclipse本身是跨平台的,所以平台倒是不用过于担心了。
-----------------------------------安装v8------------------------------
https://developers.google.com/v8/build
有多种方式选择下载安装,我是直接用Git下载的。
Down下来后需要编译
http://code.google.com/p/v8/wiki/BuildingWithGYP
以我的环境为例,直接make dependencies后,make native就OK了。其它环境下参考以上文档
-----------------------------------插件安装-----------------------------
首先需要安装插件,打开Eclipse,菜单选择Help->Install New Software…弹出界面里点右边的Add…然后Location中输入http://chromedevtools.googlecode.com/svn/update/dev/
后OK。选择插件进行安装
34
由于需要java VM等相关依赖项支持,如果有缺失项,请手动安装依赖项或是再添加几个自动更新的下载点
http://download.eclipse.org/releases/juno
http://download.eclipse.org/tools/cdt/releases/indigo
http://download.eclipse.org/linuxtools/update
官方参考:
http://code.google.com/p/chromedevtools/wiki/HowToInstall