用beagle/grep让阅读海量源代码不再是难题

阅读源代码是一门技术活,有一个老外专门写了一本书,《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的架构,那么就可以在这里把别的架构的文件都过滤掉。

 

所有的这些配置都可以在http://windows-config.googlecode.com/svn/trunk里找到:

 

svn co http://windows-config.googlecode.com/svn/trunk

 

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

 

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

 

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值