Semantic Diff Utilities [kapalı]


105

Anlamsal farklılık / birleştirme yardımcı programlarının bazı iyi örneklerini bulmaya çalışıyorum. Kaynak kod dosyalarını karşılaştırmanın geleneksel paradigması, satırları ve karakterleri karşılaştırarak çalışır .. ama orada (herhangi bir dil için) dosyaları karşılaştırırken kodun yapısını gerçekten dikkate alan herhangi bir yardımcı program var mı?

Örneğin, mevcut diff programları "125 satırının 2. karakterinde bulunan farkı rapor edecektir. X dosyası void içerir, burada y dosyası bool içerir". Özel bir araç, "doSomething () yönteminin void'den bool'a değiştirildiği dönüş tipi" ni raporlayabilmelidir.

Bu tür anlamsal bilgilerin aslında kullanıcının kodu karşılaştırırken aradığı şey olduğunu ve yeni nesil programlama araçlarının hedefi olması gerektiğini iddia ediyorum. Mevcut araçlarda bunun herhangi bir örneği var mı?


3
Görünüşe göre ağaç düzenleme mesafesi üzerine bazı araştırmalar yapılmış. Bunu AST'ye uygulamak, denenecek ilk şey gibi görünüyor. (Birisi bu tür bir şeyi yazmaya çalışmak
isterse

2
Gerçekten yararlı olup olmayacağından emin değilim. Bahsettiğiniz gibi bir fark daha kolayca farklılıkları vurgulayarak bir araca sahip, özellikle okuma daha görülür içinde bir çizgi. bazı kodların değişmeden hareket edip etmediğini tanıma yeteneği daha kolay ve daha kullanışlı olacaktır, imho!
UncleZeiv

2
@UncleZeiv Bu özelliğin doğal olarak aracın doğasından kaynaklanacağını umuyorum. Buna ek olarak, örneğin bir kişi kaşlı ayraç veya girinti stillerini değiştirip değiştirirse veya dosyayı statik yöntemler gruplandırılacak şekilde yeniden düzenlerse vb.
jasonmray

8
Buna şimdi Visual Studio'da ihtiyacım var. Bir ekip içindeki geliştiricileri farklılıkları kolaylaştırmak için aynı biçimlendirme yapısını kullanmaya zorlamak geriye dönük düşünmedir. Kod, iade sırasında bazı standartlara göre biçimlendirilmelidir ve geliştirici bir dosyayı her açtığında, kendi beğenisine göre biçimlendirilmelidir. Bu tür bir düşüncenin bu noktada daha yaygın olmadığına şaşırdım.
Langdon

3
IMHO Bu SO için güzel bir konudur. Bunu kabul ediyorsanız, "yeniden açmaya" oy verin
Ira Baxter

Yanıtlar:


37

Bu senaryoyu tam olarak ele alabilen bir araç geliştirdik. Http://www.semanticmerge.com adresini kontrol edin

Kod yapısına dayalı olarak ve metin tabanlı algoritmalar kullanmadan birleşir (ve farklılık gösterir), bu da temelde güçlü yeniden düzenleme içeren aşağıdaki gibi durumlarla başa çıkmanıza izin verir. Ayrıca, aşağıda görebileceğiniz gibi hem farklılıkları hem de birleştirme çatışmalarını oluşturabilir:

görüntü açıklamasını buraya girin

Ve taşınan metin bloklarıyla karıştırılmak yerine, önce ayrıştırdığı için, çatışmaları yöntem bazında (aslında her öğe için) görüntüleyebilir. Öncekine benzer bir vakanın çözülmesi gereken manuel çatışmalar bile olmayacaktır.

görüntü açıklamasını buraya girin

Bu, dile duyarlı bir birleştirme aracıdır ve nihayet bu SO sorusunu yanıtlayabilmek harikaydı :-)


SVN ile entegre etmek mümkün mü?
Revious

1
Ancak, Linux ve Mac sürümleri eskidir.
Michael Piefel

29

Eclipse uzun zamandır bu özelliğe sahipti. Adı "Yapı Karşılaştırma" ve çok güzel. İşte Java için bir örnek ekran görüntüsü ve ardından bir XML dosyası için başka bir ekran görüntüsü:

(Üst bölmedeki yöntemlerde eksi ve artı simgelerine dikkat edin.)

Eclipse'in Java Yapısı Karşılaştırıcısı Eclipse'in XML Yapısı Karşılaştırıcısı


3
Yapı Karşılaştırma, diğer kaynak denetimi birleştirme düzenleyicileri gibi değişiklikleri birleştirmenize izin veriyor mu? Yani, bu yöntemi bu sürümden diğer sürüme kopyalayın.
Jonathan Parker

1
Evet, bir değişiklik veya fark seçtiğinizde (üst veya alt bölmelerde), araç çubuğu düğmeleri (ekran görüntülerinde gösterilir) size değişikliği soldan sağa veya tam tersi şekilde kopyalama seçeneği sunar.
Hosam Aly

1
Ne yazık ki, ekran görüntüleri (en yüksek oy alan ve kabul edilen!) Cevabınızda artık görünmüyor. Tekrar gönderebilir misin?
blubb

@blubb Beni bilgilendirdiğiniz için teşekkürler. Java Comparer görüntüsüyle hatayı düzelttim. Yakında XML Yapı Karşılaştırıcısı için bir ekran görüntüsü eklemeye çalışacağım.
Hosam Aly

1
Ve bu Java dışındaki diller için çalışıyor mu?
einpoklum

14

"Anlamsal karşılaştırmaları" iyi yapmak için, dillerin sözdizimi ağaçlarını karşılaştırmanız ve sembollerin anlamını hesaba katmanız gerekir. Gerçekten iyi bir anlamsal farklılık, dilin anlambilimini anlar ve bir kod bloğunun işlev açısından diğerine eşdeğer olduğunu fark eder. Bu kadar ileri gitmek bir teorem kanıtlayıcı gerektirir ve son derece sevimli olsa da, şu anda gerçek bir araç için pratik değildir.

Bunun uygulanabilir bir yaklaşımı, söz dizimi ağaçlarını karşılaştırmak ve eklenen, silinen, taşınan veya değiştirilen yapılar açısından değişiklikleri raporlamaktır. Bir "anlamsal karşılaştırmaya" biraz daha yaklaşıldığında, bir tanımlayıcı bir kod bloğu boyunca tutarlı bir şekilde değiştirildiğinde rapor edilebilir.

Yukarıdaki yaklaşımı yapan birçok dilde çalışan sözdizimi ağacı tabanlı bir karşılaştırma motoru için http://www.semanticdesigns.com/Products/SmartDifferencer/index.html sayfamıza bakın .

Ocak 2010'u DÜZENLE: C ++, C #, Java, PHP ve COBOL için sürümler mevcuttur. Web sitesi bunların çoğu için özel örnekler gösterir.

DÜZENLEME Mayıs 2010: Python ve JavaScript eklendi.

Ekim 2010 DÜZENLEME: EGL eklendi.

Kasım 2010 DÜZENLEME: VB6, VBScript, VB.net eklendi


2
Merhaba Ira, fark algoritmanız hakkında bir makale yayınladınız mı? Ağaç düzenleme uzaklık farkı literatürü bulmakta sorun yaşıyorum. Teşekkürler Terence.
Terence Parr

Daha spesifik olmak gerekirse, diff3'ü aramak düz diff2 değil
Terence Parr

2
@Terence: Fark algoritmamızın yayını yok. Eşit alt ağaçları tanımlamak için son ek ağaçlarını kullanan bir Levenstein minimum mesafe hesaplamasıdır ve yeniden adlandırmayı işlemek için bazı huerstics vardır. IIRC, Yang'ın Yazılım Uygulaması ve Deneyimi konusunda bu konuda bir makalesi vardı. Bizimki ve Yang'ınki diff3 değil diff2'dir.
Ira Baxter

@IraBaxter Bağlantı şu anda bozuk ve site, google bağlantısından açılırken kapanmış görünüyor.
Răzvan Flavius ​​Panda

Site yedeklendi, bağlantı düzgün olmalı.
Ira Baxter

12

Yapmaya çalıştığın şey bir "ağaç farkı". Görünüşe göre bunu basit bir çizgi odaklı metinsel farklılıktan çok daha zor, ki bu gerçekten sadece iki düz dizinin karşılaştırmasıdır.

" İnce Taneli XML Yapısal Karşılaştırma Yaklaşımı " kısmen şu sonuçlarla sonuçlanır:

Teorik çalışmamız ve deneysel değerlendirmemiz, önerilen yöntemin aynı zaman karmaşıklığına (O (N ^ 2)) sahipken, mevcut alternatiflere göre gelişmiş yapısal benzerlik sonuçları verdiğini gösterdi.

(vurgu benim)

Aslında, daha fazla ağaç farklılaştırma örneği arıyorsanız, bu alandaki pratik gelişmeleri yönlendirdiği için XML'e odaklanmanızı öneririm.


Bağlantı için teşekkürler. Sematic diff araçlarını uygulamak için birkaç farklı yaklaşım düşünebilirim ve haklısınız - çoğu bir "ağaç farkına" soyutlanabilir. Daha karmaşık durumların bir "grafik farkına" soyutlanması bile gerekebilir.
jasonmray

Evet. IBM'in Rational Modeler'ı (tutulmaya dayalı) bunu UML modelleriyle yapmaya çalışır (iki model arasındaki farkları grafiksel olarak gösterir). Çok kullanmadığım için sonuçların yararlılığı hakkında yorum yapamam.
bendin

Diğer yapıları (örneğin, java kodu gibi) temsil eden şemalar bulabileceğiniz ve bir kod farkını uygulamak için XML tabanlı bir ağaç farkı kullanabileceğiniz için, XML'in başlamak için iyi bir yer olduğunu kabul ediyorum.
jasonmray

"bunu yap" => "grafik farkına" benzer bir şey yap.
bendin

1
Birçok dilde çalışan sözdizimi ağacı tabanlı bir karşılaştırma motoru için semdesigns.com/Products/SmartDifferencer/index.html adresine bakın .
Ira Baxter


2

Bunun çözümü dil bazında olacaktır. Yani, kodun bir çok ağaca ayrıştırılmasını ve belirli bir dile özgü eklentiyle anlamsal karşılaştırmayı erteleyen bir eklenti mimarisi ile tasarlanmamışsa, birden çok dili desteklemek çok zor olacaktır. Hangi dil (ler) için böyle bir araca sahip olmakla ilgileniyorsunuz? Şahsen C # için bir tane isterim.

C # için Reflektöre bir montaj farkı eklentisi vardır, ancak C # üzerinde değil yalnızca IL üzerinde bir farklılık yapar.

Dif eklentisini buradan [zip] indirebilir veya kodeplex sitesindeki projeye buradan gidebilirsiniz .


1
Tam olarak dil eklenti stilini kullanarak birçok dilde çalışan sözdizimi ağacı tabanlı bir karşılaştırma motoru için semdesigns.com/Products/SmartDifferencer/index.html adresine bakın . Henüz yayınlanmadı, ancak bir C # sürümü çok yakın.
Ira Baxter

Ocak 2010: C # Smart Differencer yayınlandı.
Ira Baxter

2

Zynamics adlı bir şirket, ikili düzeyde bir semantik farklılık aracı sunar. Bir ikilinin 2 versiyonunun grafik-teorik analizini gerçekleştirmek için REIL adlı bir meta-montaj dili kullanır ve aralarındaki farklılıkları göstermek için renk kodlu bir grafik üretir. Fiyatından emin değilim, ancak ücretsiz olduğundan şüpheliyim.


İkili düzey anlamsal farka bağlantı
emallove

2

http://prettydiff.com/

Pretty Diff, yorumları ve gereksiz boşlukları kaldırmak için her girişi küçültür ve ardından diff algoritmasından önce kodu güzelleştirir. Bundan daha fazla kod anlamsal olmayı düşünemiyorum. Ve onun yazılı JavaScript'i sayesinde doğrudan tarayıcıda çalışır.


5
O zaman sınırlı bir hayal gücünüz var! Bir dosyadaki iki yöntemin konumlarını değiştirmeden değiştirmeye ne dersiniz? Yeniden düzenlemeler ne olacak?
Robin Green

(Java'daki veri bildirimlerini bu şekilde değiştiremezsiniz ve yine de başlatıcılar nedeniyle eşdeğerliğe sahip olamazsınız; C # 'ın da benzer sorunları olduğunu varsayıyorum). Saf anlamsal fark için giderseniz, Turing makinesi eşdeğerliğini çözmeye çalışıyorsunuz demektir. Saf metin eşlemeden daha iyi ve Turing imkansızdan daha kötüsü yapmak için çok fazla aralık vardır.
Ira Baxter

@IraBaxter Araç kavramsal olarak sadece gerçekte eşdeğer olan eşdeğer şeyler olarak gösterecektir. Düzgün kodlandıysa, bahsettiğiniz sorun türü olmayacaktır.
Răzvan Flavius ​​Panda

"Düzgün kodlanmış", nihai aracı istiyorsanız algoritma eşdeğerliğini kanıtlamak anlamına gelir. Algoritma eşdeğerlik kanıtları genel olarak Turing-zordur, bu nedenle pratikte böyle bir araç almayacaksınız. Elde edeceğiniz şey, sözdizimi değişikliklerinden başka bazı eşdeğerlikleri işleyen bir araçtır . Bugüne kadar böyle bir alet yapmaya çalışan kimseyi görmedim.
Ira Baxter
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.