Tüm makaleler

Text Diff: algoritmalar iki metin arasındaki farkı nasıl bulur

Türkçe eklemeli (agglutinative) bir dildir: "ev", "evdeki", "evdekilerden" gibi tek bir kökün üzerine art arda ekler binerek anlam değişir. Bu yüzden bir cümlede sadece tek bir ek değiştiğinde bile — mesela "-de" hâl ekinin "-den" olması — kelime düzeyinde bir diff genellikle kelimenin tamamını "değişti" olarak işaretler, çünkü kelimenin sadece son birkaç harfi farklıdır ama diff kelimeyi bölünmez bir birim sayar.

En uzun ortak alt dizi

Klasik diff yaklaşımı, bir metnin iki sürümü arasındaki satırların en uzun ortak alt dizisini (LCS) bulmaya dayanır. Bu alt dizinin parçası olan satırlar değişmemiş kabul edilir; geri kalan her şey eski sürümden kaldırılmış veya yeniye eklenmiş olarak işaretlenir. Sonuç, mümkün olan rastgele bir dizilim değil, minimum değişiklik kümesidir.

Sonuç nasıl okunur

Silinen satırlar genellikle - işareti ve kırmızı renkle, eklenen satırlar + işareti ve yeşil renkle gösterilir. Günlük dildeki anlamıyla "değişen" bir satır, teknik olarak eski satırın silinmesi artı yeni satırın eklenmesi olarak gösterilir — diff'in bir satırı yerinde düzenleme gibi ayrı bir kavramı yoktur.

Satır satır karşılaştırma neden her zaman sezgisel değil

Bir metnin ortasına tek bir yeni satır eklenirse, satır satır karşılaştırma sonraki tüm satırları "değişti" olarak gösterebilir, çünkü algoritma bunun bir ekleme mi yoksa toplu bir değiştirme mi olduğunu her zaman ayırt edemez. Türkçede ek yığılması nedeniyle benzer bir yanıltıcı etki kelime düzeyinde de ortaya çıkar: tek bir ekin değişmesi, koca kelimeyi baştan sona farklı bir kelimeymiş gibi gösterir.

Buna neden ihtiyaç duyulur

  • Bir yapılandırma dosyasının veya belgenin iki sürümü arasında tam olarak neyin değiştiğini kontrol etmek.
  • Fark bulma algoritmasının mantığını anlayarak bir code review'u incelemek.
  • Bir yeniden düzenlemeden önce ve sonra bir betiğin çıktısını karşılaştırarak regresyon olmadığını doğrulamak.

Satır düzeyinde diff'e karşı karakter düzeyinde diff

Satır satır karşılaştırma kod ve yapılandırma dosyaları için uygundur, ama içinde tek bir kelimenin değiştiği düzyazı veya uzun bir cümle için tüm satırı silinmiş ve yeniden eklenmiş olarak işaretler. Satır içinde kelime veya karakter düzeyinde diff, değişen tam eki veya harfi daha kesin gösterir — bunun bedeli büyük metinlerde daha yüksek işlem yüküdür.

Aracı dene