开发者工具·文本比较
Unix diff 简史:Hunt、McIlroy 和基于行的模型
· 背景
文本差异 算法 软件历史记录
跟踪从 1970 年代的贝尔实验室到今天的工具的差异,解释了为什么按行比较文本成为标准,以及后来的算法如何改进它。
为什么“发生了什么变化”的每张图片看起来都像 Unix diff — 首先观察到代码托管站点、审查工具和浏览器工具都继承了相同的模型
现代审阅屏幕通常共享未更改的上下文、删除和添加的视觉语法。人们很容易将这种相似性变成一个完整的谱系故事,但这个存储库是 ToolAcre 当前实现的证据,而不是 Unix 历史的主要档案。
因此,安全文章区分了两个任务。它详细解释了当前来源所证明的内容,并将该工作簿的历史名称、日期和动机标记为需要外部权威参考。熟悉并不等于引用,尤其是对于算法作者而言。
贝尔实验室和比较文件的问题 — 描述了早期 Unix 需要比较源文件以及 Douglas McIlroy 和 James Hunt 的工作
该大纲将早期工作归功于贝尔实验室的人物。四个文本差异源文件都没有记录该历史,并且该任务禁止发明或未引用的声明。因此,该模块不会将传记细节、引文或日期作为已确定的事实进行重复。
未来的历史文章应直接引用论文、手册或机构档案。在这些来源成为证据集的一部分之前,更正是明确的:ToolAcre 现在可以演示行差异模型,但它无法验证模型起源故事中的每一步。
贝尔实验室作者和早期 Unix 历史需要外部主要来源,但此存储库中不存在
当前代码根据规范化换行符约定进行拆分并比较行数组。这一事实解释了今天的粒度。它并不能证明电传打字机或存储限制导致了历史设计选择,因为没有历史材料被导入到实现中。
这种区别的重要性超出了学术范畴。 “这个工具可以在线工作”可以通过测试重现。 “线路是出于这一历史原因而选择的”是一个因果断言,需要该时期的文件。好的技术写作不会使用当前的代码作为过去意图的追溯证据。
存储库证明 ToolAcre 比较行;它并不能证明为什么历史系统选择它们
`toUnifiedText` 发出 `---` 和 `+++` 标签,后跟以空格、减号或加号为前缀的每一行。它是补丁状的,可供下载,但它不包含 `@@` hunk 标头。将其称为完整的统一差异会夸大此处实现的格式。
该路由也不会生成正常或上下文格式。这些格式之间的历史演变可能值得用外部手册来解释,但附带的输出支持更窄的描述:带有熟悉的标记和调用者提供的标签的可读全行流。
ToolAcre 导出补丁形流,而不是完整的历史差异格式
概要显示现代引擎使用 Myers,但 ToolAcre 没有。它的文件头命名为普通 LCS 动态规划,并在不同的中间记录 O(n·m) 时间和内存。该实现填充 `Uint32Array` 表并重建通过它的一条路径。
这不是美容修正。算法名称具有特定的复杂性和相关行为。前缀和后缀修剪加上 2,000 线帽使此设计适合有界粘贴差异。读者不应将迈尔斯复杂性主张转移到具有二次矩阵的代码上。
ToolAcre 使用普通 LCS 动态规划,而不是 Myers
基于行的比较仍然无法识别语义等价、移动的块或格式化意图。这些限制直接来自有序字符串键。编译器可能会认为两个源片段是等效的,而行差异报告替换,或者在积极的规范化下相反。
原始模型仍然有用,因为它的结果是可检查的。每行都有文本、类型和特定于侧面的行号。审阅者可以不同意对齐,但仍然考虑每一行,这对于不透明的“含义改变”分数来说更困难。
这不包括什么——二进制比较、增量压缩和版本控制内部结构
二进制增量、压缩、存储库对象存储和合并内部结构均在此路线和证据集之外。这篇文章还省略了所要求的历史年表,而不是凭记忆填写。错过一项声明比发布未经验证的声明更好。
对于这些主题,从所描述的系统收集主要规格和来源。不要从视觉相似性推断文件格式或从“最小”一词推断算法。 ToolAcre 的配置使用该词,而实现提供了限定它的确切机制。
要点:五十年来一个好主意 - 总结了沿袭并指出 ToolAcre 的文本比较在浏览器选项卡中应用了相同的基于行的模型
持久的教训是方法论上的:将历史与实施分开。该浏览器工具证明了标准化线分割、LCS 重建、显式选项、不同线上限和本地渲染。它并不能证明谁发明了周围的约定或为什么。
使用路径来检查当前文本并使用主要来源来讲述过去。这个界限可能会让历史文章不那么笼统,但它使每一个包含的陈述都可以审计。精确度胜过由未引述的回忆组装而成的精美血统。