全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com)
关于printf的实现,之前我自己看过几个,印象中至少这几个分析过:早期linux内核中的版本、我自己工具箱中常用的一个版本、一个部分功能实现的嵌入式版本。后两个都是来自于开源项目,而我自己工具箱中选择的那个版本其实是考虑了功能自己资源消耗上的多重因素选定。之前分析的3个版本,其实在格式化输出上的做法都是类似的方案。不过这次实现以及分析的JOS中的格式化输出,设计思路略有不同。
MIT的课程对你自己实现的代码有一个测试的方式,这里就是课程的测试代码。需要能够成功打印一个八进制的数据出来。
有了十进制以及十六进制的实现参考,其实八进制实现照葫芦画瓢即可。不过,这里可以深究一下其实现方式。
这个函数的实现的确是巧妙,实现的也如此轻描淡写!采用了一个递归的实现方式,简单几行代码就实现了。由于之前的几个版本的格式化输出代码分析影响,看到这段代码的简洁度之后直接有点叹为观止的感觉。而且,从通用性上这个也有很好的改进。代码的实现风格让我想到了SICP,这是典型的学院派设计风格!而递归方式,也直接巧妙地完成了从高位开始输出的功能。
利用自带的测试脚本,可以看得出来能够通过打印测试。
自然,这个也不是百分百一定好的设计。从实用性角度考虑,我还是喜欢工程学派的模式,因为工程学派在资源使用上考虑周到。反倒是这种学院派的风格,从效率以及资源消耗上可能会带来一些问题。
这是我之前分析过的工程范式的代码设计,看到这部分格式化判断分支的时候,其实设计的思路还是大同小异。
这里又截取了两段不完整的代码,暂且不去分析具体的实现方式,单从风格上来说就能够体验到很大的差异。
如果从知识探索的角度来说,我是很喜欢学院派风格的,这也是我能力之中所欠缺的。但是从实用性角度来说,工程派的确是给我们带来了太多革新式的成果让我们一直从中受益。两者一个是探路者,而另一个则是务实家。这种思考以及学习和工作的模式,有时候很值得我们去深入思考其中的思维哲学。