開發者工具·文字比較
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 重建、明確選項、不同線上限和本地渲染。它並不能證明誰發明了周圍的約定或為什麼。
使用路径來檢查當前文字並使用主要來源來讲述過去。這個界限可能會讓歷史文章不那麼籠統,但它使每一個包含的陳述都可以審計。精確度勝過由未引述的回憶組裝而成的精美血統。