Tutti gli articoli

Text Diff: come gli algoritmi trovano la differenza tra due testi

Sulla Gazzetta Ufficiale italiana, le modifiche a un articolo di legge sono da sempre presentate come "testo a fronte": la vecchia formulazione a sinistra, la nuova a destra, con le parole cambiate evidenziate — una tradizione di confronto testuale nata per i testi normativi ben prima che esistesse un comando diff.

La sottosequenza comune più lunga

L'approccio classico al diff si basa sulla ricerca della sottosequenza comune più lunga (LCS) di righe tra due versioni di un testo. Le righe che ne fanno parte sono considerate invariate; tutto il resto viene contrassegnato come rimosso dalla vecchia versione o aggiunto alla nuova. Il risultato è un insieme minimo di modifiche, non una qualsiasi sequenza possibile di rimozioni e aggiunte.

Come leggere il risultato

Le righe rimosse sono in genere contrassegnate con - in rosso, quelle aggiunte con + in verde. Una riga "modificata" nel senso comune del termine viene tecnicamente mostrata come la rimozione della vecchia riga più l'aggiunta della nuova — il diff non ha un concetto proprio di modifica di una riga sul posto.

Perché il confronto riga per riga non è sempre intuitivo

Inserire una singola nuova riga in mezzo a un testo può far apparire tutte le righe successive come "modificate", perché l'algoritmo non distingue sempre un inserimento da una sostituzione massiva. Chi confronta versioni successive di un testo normativo con uno strumento automatico conosce bene questo limite: rinumerare un solo comma può far segnalare come riscritto tutto il resto dell'articolo.

A cosa serve

  • Verificare esattamente cosa è cambiato tra due versioni di un file di configurazione o di un documento.
  • Rivedere una code review comprendendo la logica dell'algoritmo di ricerca delle differenze.
  • Confrontare l'output di uno script prima e dopo un refactoring per confermare l'assenza di regressioni.

Diff a livello di riga rispetto al livello di carattere

Il confronto riga per riga va bene per codice e file di configurazione, ma per prosa o una frase lunga in cui è cambiata una sola parola, contrassegnerà l'intera riga come rimossa e aggiunta di nuovo. Il diff a livello di parola o carattere all'interno della riga mostra con più precisione proprio la parola cambiata, al prezzo di una maggiore complessità computazionale su testi grandi.

Prova lo strumento