coreutils4.5源码expr.c读后感20200903 很长一段时间没有写博客了。因为很久一段时间没有读源码了。这两天,又开始读。感觉还是要从基础的读起,一下子读ruby0.49等编程语言的源码,哪怕是awk1.01的源码,都太复杂了。饭还是要一口一口的吃。 原来还想用平板看代码,现在发现,还是要用笔记本看,因为读代码时,要调试,要编译,再进行测试,根据结果来验证自己的想法是否正确。当然,前期也可以只是看,但效果不是太理想。还是要手摸键盘,一边看,一边改代码,编译后,执行一把,才能看到效果。 所以,我有一个感觉,如果代码跑不起来,会严重影响读代码的效率。而只要代码能跑起来,读代码就会快很多。 今天按代码行数排序,开始读。当时有一个seq.c总是编译不了,其中用到了floor等数学math.h中的函数,一般来讲,加上-lm编译参数就行了,我搞了半天搞不定,于是重新下载了coreutils5.0的包,再 ./configure sudo make 一把,发现报错,其中tee.c中报冲突,大意是库中有tee函数,与tee.c中的tee函数格式不一样,我想了一个天才般的主意,修改tee.c中的tee函数名字,在vim中执行: %s/\<tee\>/tee3/g 再编译,就ok 在test.c中也有一个函数eaccess,和库中的格式不一样,同样修改test.c中eaccess为eaccess3。再编译。 sudo make 就ok了。 有人想读懂那个makefile文件,我发现太麻烦了,我直接编译,再本地执行 cd src 修改文件后 sudo make ./seq 1 3 (这里执行修改后的可执行文件名,一定要加./不然就执行的不是修改后的可执行程序了。) 这样一操作后,真是爽了。 开始读了许多程序,这里不一一细说,下午接着读expr.c这个程序,因为这个程序有点awk101编译程序的影子。比如一些结构体的定义,等等。 但我看不懂这个程序的调用。 先定义一个调试选项
#define EVAL_TRACE 再本地执行: ./expr 3 + 2 [eval]: 3 + 2 [eval1]: 3 + 2 [eval2]: 3 + 2 [eval3]: 3 + 2 [eval4]: 3 + 2 [eval5]: 3 + 2 [eval6]: 3 + 2 [eval7]: 3 + 2 [eval4]: 2 [eval5]: 2 [eval6]: 2 [eval7]: 2 5 这个调用轨迹不明白。 ./expr 3 + 2 + 8 [eval]: 3 + 2 + 8 [eval1]: 3 + 2 + 8 [eval2]: 3 + 2 + 8 [eval3]: 3 + 2 + 8 [eval4]: 3 + 2 + 8 [eval5]: 3 + 2 + 8 [eval6]: 3 + 2 + 8 [eval7]: 3 + 2 + 8 [eval4]: 2 + 8 [eval5]: 2 + 8 [eval6]: 2 + 8 [eval7]: 2 + 8 [eval4]: 8 [eval5]: 8 [eval6]: 8 [eval7]: 8 13 好像程序是从后面向前面执行的。不明白。expr没有生成语法树,不是遍历语法树,再执行,而是手工做的。 我在一台旧笔记本上装了linux,直接在linux下读代码。另外,我又在windows10下,安装ubuntu应用后,再编译代码,再个都能编译通过。这倒是我今天的收获。但代码确实没有读懂。
