language agnostic - Semantic Diff Utilities
language-agnostic semantics (8)
Desarrollamos una herramienta que puede tratar con precisión este escenario. Compruebe http://www.semanticmerge.com
Se funde (y diffs) en función de la estructura del código y no utiliza algoritmos basados en texto, lo que básicamente le permite tratar casos como el siguiente, que implica un fuerte refactor. También es capaz de representar las diferencias y los conflictos de fusión como se puede ver a continuación:
Y en lugar de confundirse con los bloques de texto que se mueven, ya que primero analiza, es capaz de mostrar los conflictos por método (de hecho, por elemento). Un caso como el anterior ni siquiera tendrá conflictos manuales para resolver.
Es una herramienta de fusión sensible al lenguaje y ha sido genial poder finalmente responder a esta pregunta ASÍ :-)
Estoy tratando de encontrar algunos buenos ejemplos de utilidades semánticas diff / merge. El paradigma tradicional de comparación de archivos de código fuente funciona al comparar líneas y caracteres ... pero ¿hay utilidades (para cualquier idioma) que realmente consideren la estructura del código al comparar archivos?
Por ejemplo, los programas diff existentes informarán la "diferencia encontrada en el carácter 2 de la línea 125. El archivo x contiene el vacío, donde el archivo y contiene bool". Una herramienta especializada debería poder informar "Tipo de devolución del método doSomething () cambiado de vacío a bool".
Yo diría que este tipo de información semántica es en realidad lo que el usuario está buscando al comparar el código, y debería ser el objetivo de las herramientas de programación de próxima generación. ¿Hay algún ejemplo de esto en las herramientas disponibles?
Enchufe desvergonzado para mi propio proyecto:
HTML Tree Diff hace una comparación consciente de la estructura de los documentos xml y html, escritos en python.
La solución a esto sería por idioma. Es decir, a menos que esté diseñado con una arquitectura de complemento que difiera una gran parte del análisis sintáctico del código en un árbol y la comparación semántica con un complemento específico del idioma, entonces será muy difícil admitir varios idiomas. ¿Qué idioma (s) le interesa tener para tal herramienta? Personalmente, me encantaría uno para C #.
Para C # hay un add-in de diff de ensamblaje en Reflector pero solo hace un diff en el IL y no en el C #.
Puede descargar el add-in de diff here [zip] o ir al proyecto en el sitio codeplex here .
Lo que estás buscando es un "árbol diff". Resulta que esto es mucho más difícil de hacer que una simple diferencia textual orientada a la línea, que en realidad es solo la comparación de dos secuencias planas.
El " Enfoque de comparación estructural de XML fino " concluye, en parte con:
Nuestro estudio teórico y nuestra evaluación experimental mostraron que el método propuesto produce mejores resultados de similitud estructural con respecto a las alternativas existentes, a la vez que tiene la misma complejidad de tiempo (O (N ^ 2))
(énfasis mío)
De hecho, si está buscando más ejemplos de diferenciación de árboles, sugiero centrarse en XML, ya que ha estado impulsando desarrollos prácticos en esa área.
Para hacer bien las "comparaciones semánticas", debe comparar los árboles sintácticos de los idiomas y tener en cuenta el significado de los símbolos. Una diferencia semántica muy buena comprendería la semántica del lenguaje y comprendería cuándo un bloque de código era equivalente en función a otro. Ir tan lejos requiere un demostrador de teoremas, y si bien sería extremadamente lindo, actualmente no es práctico para una herramienta real.
Una aproximación práctica de esto es simplemente comparar árboles de sintaxis y reportar cambios en términos de estructuras insertadas, eliminadas, movidas o cambiadas. Acercándose un poco a una "comparación semántica", se podría informar cuando un identificador se cambia de manera consistente en un bloque de código.
Consulte nuestro http://www.semanticdesigns.com/Products/SmartDifferencer/index.html para ver un motor de comparación basado en el árbol de sintaxis que funciona con muchos idiomas, que hace la aproximación anterior.
EDITAR Enero 2010: Versiones disponibles para C ++, C #, Java, PHP y COBOL. El sitio web muestra ejemplos específicos para la mayoría de estos.
EDITAR Mayo de 2010: se agregaron Python y JavaScript.
EDITAR Oct 2010: EGL agregado.
EDITAR Nov 2010: VB6, VBScript, VB.net añadidos
Una compañía llamada Zynamics ofrece una herramienta de diferencia semántica de nivel binario. Utiliza un lenguaje de metaensamblaje llamado REIL para realizar un análisis teórico de gráficos de 2 versiones de un binario, y produce un gráfico codificado por colores para ilustrar las diferencias entre ellos. No estoy seguro del precio, pero dudo que sea gratis.
Pretty Diff minimiza cada entrada para eliminar comentarios y espacio en blanco innecesario y luego embellece el código antes del algoritmo diff. No puedo pensar de todos modos para convertirme en más código semántico que esto. Y, su JavaScript escrito para que se ejecute directamente en el navegador.
Eclipse ha tenido esta característica durante mucho tiempo. Se llama "Comparación de estructuras", y es muy agradable. Aquí hay una captura de pantalla de muestra para Java, seguida de otra para un archivo XML:
(Tenga en cuenta los iconos menos y más en los métodos en el panel superior).