Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2974323
  • 博文数量: 401
  • 博客积分: 12926
  • 博客等级: 上将
  • 技术积分: 4588
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-22 14:51
文章分类

全部博文(401)

文章存档

2015年(16)

2014年(4)

2013年(12)

2012年(82)

2011年(98)

2010年(112)

2009年(77)

分类: LINUX

2010-05-06 10:18:21

阅读源代码是一门技术活,有一个老外专门写了一本书,《Code Reading》,教人怎样阅读代码,用什么工具阅读代码等等。

我最早用过souce insight(界面挺漂亮,快捷键挺方便),后来用过开源的source navigator(那叫一个慢),对这些工具有一些不满意的地方:

1。有局限性。当代码变得复杂,比如C语言里用了很多宏,C++里用了很多继承的时候,用这些工具会找不到,或者找出来很多噪音,这时通常就没办法自己扩展了

2。不够快。尤其是当代码量变得庞大,我是说像Android的代码那样,快上两个G了,这些工具基本没法用了。至少是没法直接用,必须分而治之,针对自己感兴趣的部分代码创建不同的阅读项目,这又引出一个新的问题,你怎么能有信心目前看的这个东西跟别的代码项目没有关系呢?如果有关系,并且是很重要的,对你理解代码很有帮助的,那就会浪费时间了。总之让人没有安全感。

后来又使用了tags/cscope。这两个工具再加上grep对阅读不太大的代码库已经足够了,包括Linux Kernel。

但是当阅读Android的代码的时候,单独的grep或者cscope里的正则表达式匹配就不够了,代码库太大,搜索的时间很长。

配合beagle的索引功能,可以让搜索几乎任意大的代码库都只需要很短的时间。具体的配置是用beagle-build-index先生成一个索引,再用beagle-static-query把包含要搜索的字符串的文件列出来,最后再用grep精确定位到这些文件中包含要搜索的字符串的那些行上。

生成beagle索引的方法:

在代码库的最上层目录执行: mkdir .beagle; beagle-build-index --recursive --deny-pattern .beagle --enable-deletion --target .beagle/ .

列出匹配文件的beagle命令是beagle-static-query --add-static-backend "$beagle_dir" --backend none --max-hits 100000 "$longest_token"|sed -e 's!^file://!!'|grep -v '#'|sort -u|~/.my-beagle-filter

其中,$beagle_dir应该是你的代码库最上层目录下的.beagle文件夹的路径,$longest_token则是我自己处理过的要搜索的正则表达式中的最大的字符数字串,因为beagle建立索引的时候应该是只针对一个一个的单词进行创建的。

后面的那些sed/grep等的处理则是让beagle-static-query的输出变成Posix的路径。~/.my-beagle-filter做一些额外的处理,比如,在阅读Linux Kernel源代码的时候,如果只关注x86的架构,那么就可以在这里把别的架构的文件都过滤掉。

所有的这些配置都可以在里找到:

svn co

我一般把我的HOME目录里重要的配置文件全部放在上面这个svn上。所以~/.my-beagle-filter的内容您也可以在.../svn/trunk/.my-beagle-filter里看到,其他的以~开头的目录/文件的路径也依此类推。

最后一步就是用grep针对匹配的文件进行精确的定位,这个脚本在~/bin/beagle-grep.sh。

要注意的是,任何工具都是有局限的,比如我这套配置脚本,也有很大的局限性。但是目前它已经能满足我的大部分需要了。只是提醒大家千万不要过分的依赖任何某个特定的工具。如果某个工具你觉得好用,你就偷着乐吧;如果不好用的话,你得忍受,实在受不了的时候就千万别勉强了,该出手时就出手,写一个自己的工具出来,让大家都来用!

阅读(1302) | 评论(0) | 转发(0) |
0

上一篇:emacs 快捷键

下一篇:sed详细用法及实例

给主人留下些什么吧!~~