我不得不看一下“sed”才能看出问题在哪里;它不应该那么大。我看了一下,知道了问题所在,感觉就像查尔顿·赫斯顿(Charleton Heston)在海滩上第一次看到破碎的雕像一样。我将要描述的关于“sed”的所有内容也可能适用于“tar”。但我还没有看过它。
许多GNU代码因为我不知道的原因而严重混乱 - 达到了无法维护的病态遗留状态。我不知道确切的时间,也许是在1990年代末或2000年代初,但就像有人按下了开关,突然间,所有漂亮的模块化自包含代码小部件都被大量混淆,与应用程序本身试图做的事情几乎没有任何联系。
在你的情况下,“sed”:整个库(不必要地)随应用程序一起使用。这至少是在版本4.2(您查询之前的最后一个版本)时的情况,可能在此之前 - 我需要检查一下。
另一件被搞糟的事情是构建系统(再次)达到了无法维护的程度。
所以,你真的在谈论遗留救援。
我的建议是......对于任何存在已久的代码库都适用......尽可能深入挖掘并首先回溯到其最早的形式;并且要扩展视野,查看其他“sed” - 如UNIX存档中的那些。
https://www.tuhs.org/Archive/
或者在BSD存档中:
https://github.com/freebsd
https://github.com/weiss/original-bsd
(第二个更深入地探讨了早期BSD在其早期提交中的情况。)
GNU页面上的许多“sed” - 但不是全部 - 可以在GNU sed页面上的“下载”下找到一个名为“镜像”的链接:
https://www.gnu.org/software/sed/
版本1.18仍然完好无损。版本1.17也隐含完好无损,因为那里有一个1.17到1.18的差异存在。两个版本都没有所有额外的东西堆积在上面。它更代表了GNU软件在变得混乱之前的样子。
实际上它非常小 - 所有*.c和*.h文件只有8863行。从这里开始。
对我来说,分析任何代码库的过程都会破坏原始代码,并且总是需要大量的重构和重新设计;并且简化来自于更好地编写本地化代码,同时保持或增加其功能。几乎总是由那些只有几年经验(我的意思是:不到20年)的人编写的,因此他们没有完全掌握语言的本地流利度,也没有足够的背景来编写良好的程序。
如果你也这样做,强烈建议你已经有一些测试套件或者添加了一些。例如,在4.2版本软件中就有一个测试套件,尽管它可能会对1.18和4.2之间新增的新功能进行压力测试。只要注意这一点。(因此,可能需要缩小测试套件以适应1.18。)你所做的每一个更改都必须通过你的测试套件进行验证。
你需要具备母语级别的语言流利度......否则,你需要愿意并有能力通过执行此类练习和其他类似练习来获得它。如果你没有足够的经验,你将会遇到一个软墙。你深入挖掘,前进就会变得更加困难。这表明你还不够有经验,没有足够的广度。因此,这个练习成为你学习经验的一部分,你只需要坚持下去。
由于早期版本的日期,您无论如何都需要进行一些重写,以将其提升到标准水平。稍后的版本可以用作此过程的指南。至少应该将其更新到C99,因为这基本上是POSIX的一部分。换句话说,您至少应该跟上当前世纪的步伐!
使其功能正常的挑战就足够让人练习了。通过这样做,您将学到其中的很多知识。使其运行起来的过程是建立“基线”的过程。一旦完成,您就拥有了自己的版本,并可以开始“分析”。
在建立基线之后,您可以全力以赴地进行重构和重新工程化。测试套件可帮助避免犯错和插入错误。您应该将所有已修改的版本保存在本地存储库中,以便在需要追踪测试失败或其他错误的突然出现时可以跳回到早期版本。您可能会发现,一些错误根源可以追溯到最初(因此:隐藏错误的发现)。
在你满意地重写了基线之后,你可以继续添加后续版本。在GNU的存档中,1.18直接跳到2.05。你需要在两者之间进行“差异”比较,看看所有更改的位置,然后将它们嫁接到你的1.18版本中,以获得你的2.05版本。这将帮助你更好地理解更改所解决的问题以及进行了哪些更改。
在某个时候,你会遇到GNU的Grange Wall。版本2.05直接跳到GNU历史存档中的3.01。一些纠缠开始在3.01版本中出现。因此,我们这里有一个软墙。但是,3.01也有一个早期的测试套件,你应该使用它来测试1.18,而不是4.2的测试套件。
当你遇到 Grunge Wall 时,你将直接看到纠缠的问题,并且你必须决定是否继续前进或放弃它们。我不能告诉你兔子洞的方向,除了 SED 长期以来一直非常好用,大部分甚至都是 POSIX 标准中列出和指定的(即使是当前版本),而版本 3 之前的东西也符合这个目的。
我运行了 diffs,2.05 和 3.01 之间的差异文件有 5000 行。好的。对于正在开发中的代码来说,这基本上很正常,但其中一些可能来自软 Grunge Wall。在 3.01 和 4.2 之间运行 diff,得到一个超过 60000 行的差异文件。你只需要问自己:一个遵守国际标准(POSIX)且不到 10000 行的程序如何能产生 60000 行的差异?答案是:这就是我们所谓的膨胀。因此,在 3.01 和 4.2 之间,你正在见证一个非常常见的代码库问题:膨胀的崛起。
所以,这基本上告诉你了哪个方向(“随波逐流”还是“放弃它”)是兔子洞。我可能会坚持3.01,并简要回顾一下3.01和4.2之间的差异以及更改日志,以获取对更改的概述,然后就此打住,除非为其更改提供的原因是有效的,否则可能会找到另一种编写方式。
我以前做过遗留代码修复,甚至在大多数人的词汇表中没有“遗留”这个词之前就已经这样了,并且很快就能认识到它的标志性迹象。这是人们可能会经历的过程。
我们已经看到一些大型代码库发生了这种情况。实际上,通过Wayland取代X11是一次大规模的遗留代码修复演习。正在进行的GNU's gcc被clang取代也可能被视为其中一个例子。