Saya mencoba menemukan beberapa contoh bagus dari utilitas diff / merge semantik. Paradigma tradisional dari membandingkan file kode sumber bekerja dengan membandingkan baris dan karakter .. tetapi apakah ada utilitas di luar sana (untuk bahasa apa pun) yang benar-benar mempertimbangkan struktur kode saat membandingkan file?
Misalnya, program diff yang ada akan melaporkan "perbedaan ditemukan pada karakter 2 baris 125. File x berisi void, di mana file y berisi bool". Alat khusus harus dapat melaporkan "Jenis pengembalian metode doSomething () diubah dari void ke bool".
Saya berpendapat bahwa jenis informasi semantik ini sebenarnya adalah apa yang dicari pengguna saat membandingkan kode, dan harus menjadi tujuan alat pemrograman generasi berikutnya. Apakah ada contohnya di alat yang tersedia?
sumber
Jawaban:
Kami telah mengembangkan alat yang mampu menangani skenario ini dengan tepat. Periksa http://www.semanticmerge.com
Ini menggabungkan (dan diff) berdasarkan struktur kode dan tidak menggunakan algoritma berbasis teks, yang pada dasarnya memungkinkan Anda untuk menangani kasus-kasus seperti berikut, yang melibatkan refactor yang kuat. Itu juga dapat membuat perbedaan dan konflik penggabungan seperti yang Anda lihat di bawah ini:
Dan alih-alih menjadi bingung dengan blok teks yang dipindahkan, karena ia mengurai terlebih dahulu, ia dapat menampilkan konflik pada basis per metode (sebenarnya per elemen). Kasus seperti sebelumnya bahkan tidak akan memiliki konflik manual untuk diselesaikan.
Ini adalah alat penggabung yang memahami bahasa dan sangat menyenangkan akhirnya dapat menjawab pertanyaan SO ini :-)
sumber
Eclipse memiliki fitur ini sejak lama. Ini disebut "Perbandingan Struktur", dan ini sangat bagus. Berikut adalah contoh tangkapan layar untuk Java, diikuti oleh yang lain untuk file XML:
(Perhatikan ikon minus dan plus pada metode di panel atas.)
sumber
Untuk melakukan "perbandingan semantik" dengan baik, Anda perlu membandingkan pohon sintaks bahasa, dan mempertimbangkan arti simbol. Perbedaan semantik yang sangat bagus akan memahami semantik bahasa, dan menyadari ketika satu blok kode memiliki fungsi yang setara dengan yang lain. Untuk melangkah sejauh ini membutuhkan teorema prover, dan meskipun akan sangat lucu, saat ini tidak praktis untuk alat yang nyata.
Perkiraan yang bisa diterapkan dari ini hanyalah membandingkan pohon sintaks, dan melaporkan perubahan dalam hal struktur yang disisipkan, dihapus, dipindahkan, atau diubah. Semakin mendekati "perbandingan semantik", seseorang dapat melaporkan bila pengenal diubah secara konsisten di seluruh blok kode.
Lihat http://www.semanticdesigns.com/Products/SmartDifferencer/index.html kami untuk mesin perbandingan berbasis pohon sintaks yang bekerja dengan banyak bahasa, yang melakukan pendekatan di atas.
EDIT Jan 2010: Versi tersedia untuk C ++, C #, Java, PHP, dan COBOL. Situs web menunjukkan contoh spesifik untuk sebagian besar ini.
EDIT Mei 2010: Python dan JavaScript ditambahkan.
EDIT Okt 2010: EGL ditambahkan.
EDIT November 2010: VB6, VBScript, VB.net ditambahkan
sumber
Apa yang Anda cari adalah "perbedaan pohon". Ternyata ini jauh lebih sulit untuk dilakukan dengan baik daripada perbedaan tekstual berorientasi garis sederhana, yang sebenarnya hanyalah perbandingan dua urutan datar.
" Pendekatan Perbandingan Struktural XML Berbutir Halus " diakhiri, sebagian dengan:
(penekanan saya)
Memang, jika Anda mencari lebih banyak contoh perbedaan pohon, saya sarankan untuk fokus pada XML karena itu telah mendorong perkembangan praktis di bidang itu.
sumber
Steker tak tahu malu untuk proyek saya sendiri:
HTML Tree Diff melakukan perbandingan struktur-sadar dokumen xml dan html, ditulis dengan python.
http://pypi.python.org/pypi/html-tree-diff/0.1.0
sumber
Solusi untuk ini akan berdasarkan per bahasa. Yaitu, kecuali jika dirancang dengan arsitektur plugin yang menolak banyak penguraian kode menjadi pohon dan perbandingan semantik dengan plugin khusus bahasa, maka akan sangat sulit untuk mendukung banyak bahasa. Bahasa apa yang Anda minati untuk memiliki alat semacam itu. Secara pribadi saya suka satu untuk C #.
Untuk C # ada add-in diff assembly untuk Reflector tetapi hanya melakukan diff pada IL bukan C #.
Anda dapat mengunduh add-in diff di sini [zip] atau pergi ke proyek di situs codeplex di sini .
sumber
Sebuah perusahaan bernama Zynamics menawarkan alat diff semantik tingkat biner. Ini menggunakan bahasa rakitan meta yang disebut REIL untuk melakukan analisis teoretis grafik dari 2 versi biner, dan menghasilkan grafik berkode warna untuk menggambarkan perbedaan di antara keduanya. Saya tidak yakin dengan harganya, tapi saya ragu itu gratis.
sumber
http://prettydiff.com/
Pretty Diff mengecilkan setiap masukan untuk menghapus komentar dan spasi kosong yang tidak perlu, lalu mempercantik kode sebelum algoritma diff. Saya tidak bisa memikirkan untuk menjadi kode semantik lebih dari ini. Dan, JavaScript-nya tertulis sehingga berjalan langsung di browser.
sumber