代码阅读之工具篇
前言
相对来讲,对于一个programmer来讲,更多的时间是花在代码阅读而不是写代码上,因此改进这方面的技巧和工具能够对programmer的工作效率能起到很大的提升。相对而言,谈论工具是相对简单的,因而作为代码阅读这一系列文章的头一篇,我先在此讨论一下我总结和使用的工具,希望能对别人有所帮助。
正则表达式
因为下面两小节介绍的工具的使用都会涉及到正则表达式,而且我觉得任何一个好的programmer都应该了解和掌握正则表达式。这里我不会具体讲任何正则表达式的使用,只会提一些比较general的概念和一些比较有用的链接
Regular_expression,读完这一篇,你会了解到什么叫做PCRE和各种其他的标准,工作中有时会遇到写的或者找的正则不能正常工作,这个时候你就得考虑是否是因为语言、环境、工具支持的正则表达式标准是否支持你所用的标准,比如说BSD授权和GNU授权的grep对正则表达式的支持就不一样,同样你也会知道literal和non-literal、escape以及单引号和双引号,拿不同语言对于string的支持来讲,groovy支持单引号的字符串,而java却不支持单引号字符串,因而它们对于这些情况时的做法就不一样。
搜索工具
-
grep /ack/ ag/pt/ sift /ripgrep
我把这些归为一类,因为这些工具使用起来大同小异,大多都支持前面提到的PCRE,虽然有些工具在速度上存在优势,但是对于AOSP这种规模的代码库来讲还是性能不足。
sift
的作者写了一篇关于几个工具之间的性能对比,感兴趣的可以去看一看,具体选择看个人,比如说根据个人熟悉编程语言不同来选择,因为能够一定程度的自定义还是一种优势。 -
这是由google工程师开源的一款工具,特别适合大规模的代码库搜索,具体介绍和使用可以看github中的介绍。我在这讲一下我个人遇到的问题和解决方案。因为工作的原因,经常需要阅读
AOSP
源码,codesearch
是基于索引的,但是目前来讲并不支持多个索引,默认会索引执行cindex命令目录下的所有文件,并且把索引文件.csearchindex
存放在HOME
目录下。-
当我完全不清楚搜索内容在哪一块的代码中,基于整个
AOSP
代码库的搜索会很方便,而且这个时候codesearch
的速度优势就体现出来了,下面是我拿codesearch
和ag
做的一次对比,当然拿基于索引的搜索和不基于索引的搜索相比是很不公平的,我这只想体现codesearch
的优势所在和应用场景。$ time codesearch is_first_stage
real 0m1.645s
user 0m0.430s
sys 0m0.135s$ time ag is_first_stage
real 4m0.311s
user 0m8.858s
sys 1m13.302s -
另一方面基于索引整个代码库的搜索会导致很多时候会出现一大堆搜索结果,而且codesearch默认会将多个代码库的索引合并到
$HOME/.csearchindex
中,那如何生成和使用不同的索引呢?以下是我的解决方案,下面先贴两个bash脚本的代码:
-
_cindex
,在任意目录下执行_cindex
则会index当前目录下的所有代码
#! /usr/bin/env bash
CSEARCH_WORKSPACE=~/.codesearch_cache
if [[ ! -d "$CSEARCH_WORKSPACE" ]];then
mkdir -p "$CSEARCH_WROKSPACE"
fi
CURRENT_DIR="${PWD//\//_}";
export CSEARCHINDEX="$CSEARCH_WORKSPACE/$CURRENT_DIR.csearchindex";
cindex $PWD;
_csearch
,会根据当前执行命令的目录来判断需要使用的索引
#! /usr/bin/env bash
CSEARCH_WORKSPACE=~/.codesearch_cache;
CURRENT_DIR="${PWD//\//_}";
export CSEARCHINDEX="$CSEARCH_WORKSPACE/$CURRENT_DIR.csearchindex";
if [[ -f "$CSEARCHINDEX" ]];then
pattern='('
pattern+='no such file or directory' # cindex在代码更新后重新index的话,增量更新索引但是不会删除失效的记录,所以这里通过grep -v来过滤一下结果
pattern+=')'
csearch -n "$@" |& grep -i -v "$pattern"
else
echo "please do _cindex first"
fi
- zoekt Google工程师出品的另一个代码搜索工具,支持web交互,但是目前最大的问题是创建index的速度太慢,有待观察。
更强大的工具
上个小结提到的多个工具只能做基于文本的搜索,然而对于代码而言,要是能够基于这些语言的关键字进行更多处理那就更好了,幸运的是我们有了下面的工具。
-
各种IDE,例如idea,IDE不仅能够支持关键字,而且能够在词法和语法层面进行处理,因而对于代码的定位更加准确,很多时候专用的IDE是最好的代码阅读工具,但就我个人的经验而言,IDE对于涉及多种编程语言的混合项目的支持就不太好。
-
vim+cscope+gnuglobal+ctags,这种方式相较第一种工具而言对语言的支持就比较粗糙,更多的是只停留在关键字的程度,另外就是学习门槛比较高,甚至需要修改一些vim的插件来满足自己的需求,这方面涉及的东西和知识面比较多,不方便细讲,下面就提一个我自己的dotfiles,里面有些我在配置过程中遇到的问题和解决方案。
补充说明
这里我要推荐一本书,也就是code reading,也是读完这本书使我有了写关于代码阅读文章的想法。
google-tags,前google工程师的Piaw Na参与编写的源码索引工具的开源版本,他在他的一篇博客中提到了这个工具,该开源版本已经很长时间没有维护,这里提一下以备后用。