coreutils4.5源码读后感20200904

tech2026-06-06  14

coreutils4.5源码读后感20200904 为了在vim下写代码,有时写好代码后,要保存,退出编辑器,回到命令窗口,再编译执行。为了不退出vim进行编译,我在网上找程序员vim配置文件,发现一个高人,总结了如下三句话: git clone https://github.com/chxuan/vimplus.git ~/.vimplus cd ~/.vimplus ./install.sh 真是超级爽。不过,如果要么直接在linux下读,要么在windows下读。如果你在win10下,进入ubuntu,在ubuntu中看代码太模糊了。 这里要注意,在.vimrc中,设置tabstop=8个空格。这样,代码的格式就正确了。不然会出现缩进不正确的情况。gnu的代码都有统一的格式。缩进是2个空格。 其实,关键是要解读源代码。不知他人如何读代码,但有时真想找个人交流交流。最好大家都读同一个程序,然后交流彼此的理解。但目前没人,就只能自说自话了。 读源码的过程,就是深入了解命令使用方法的过程。比如expr,其中还有许多用法。比如: ./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 [eval1]: 2 [eval2]: 2 [eval3]: 2 [eval4]: 2 [eval5]: 2 [eval6]: 2 [eval7]: 2 3 $ ./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 [eval2]: 2 [eval3]: 2 [eval4]: 2 [eval5]: 2 [eval6]: 2 [eval7]: 2 3 ./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 [eval3]: 2 [eval4]: 2 [eval5]: 2 [eval6]: 2 [eval7]: 2 0  ./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 [eval]: 3 * 2 [eval1]: 3 * 2 [eval2]: 3 * 2 [eval3]: 3 * 2 [eval4]: 3 * 2 [eval5]: 3 * 2 [eval6]: 3 * 2 [eval7]: 3 * 2 [eval5]: 2 [eval6]: 2 [eval7]: 2 6  ./expr length abc [eval]: length abc [eval1]: length abc [eval2]: length abc [eval3]: length abc [eval4]: length abc [eval5]: length abc [eval6]: length abc [eval6]: abc [eval7]: abc 3  ./expr index zabcd bc [eval]: index zabcd bc [eval1]: index zabcd bc [eval2]: index zabcd bc [eval3]: index zabcd bc [eval4]: index zabcd bc [eval5]: index zabcd bc [eval6]: index zabcd bc [eval6]: zabcd bc [eval7]: zabcd bc [eval6]: bc [eval7]: bc 3 ./expr substr abcde 2 3 [eval]: substr abcde 2 3 [eval1]: substr abcde 2 3 [eval2]: substr abcde 2 3 [eval3]: substr abcde 2 3 [eval4]: substr abcde 2 3 [eval5]: substr abcde 2 3 [eval6]: substr abcde 2 3 [eval6]: abcde 2 3 [eval7]: abcde 2 3 [eval6]: 2 3 [eval7]: 2 3 [eval6]: 3 [eval7]: 3 bcd 其中正则表达式匹配的没有弄出来。 ./expr abc : b [eval]: abc : b [eval1]: abc : b [eval2]: abc : b [eval3]: abc : b [eval4]: abc : b [eval5]: abc : b [eval6]: abc : b [eval7]: abc : b [eval6]: b [eval7]: b 0 expr.c的程序写得很流畅,核心的处理过程基本知道。比如,./expr 3 + 2 处理时,基本就是把数取出来 ,然后进行l->u.i+r->u.i这样相加。但就是串不起来。也就是说,我对整体程序的总体结构很不理解。它又不是很明显的递归。有些头痛。 总体来讲,expr.c写得相当流畅。比如对结点的定义: enum valtype {   integer,   string }; typedef enum valtype TYPE;

/* A value is.... */ struct valinfo {   TYPE type;            /* Which kind. */   union   {                /* The value itself. */     intmax_t i;     char *s;   } u; }; typedef struct valinfo VALUE; 后面有很多函数处理value值,如 static VALUE * int_value (intmax_t i) {   VALUE *v;

  v = NEW (VALUE);   v->type = integer;   v->u.i = i;   return v; } 因为没有产生语法树,所以没有gawk的那个结构体定义复杂。但主程序的调用关系就有些不清晰了。 如计算“3+2+4”,大体是先计算机2+4,得到结果后,再3+6,计算出来后,再将6返回。

今天接着分析expr.c,发现真是搞不懂程序的执行流程。调试时: $ ./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 其中,为什么不是 [eval7]: 3 + 2 [eval3]: 2 呢??? 我发现这个程度基本上都通读完了,但就是串不起来。也许要单步执行一次。

 

最新回复(0)