trabajo sobre practico plataforma organigrama objetivos merge diff cvs semantic-analysis

merge - sobre - ¿Combinación consciente del contexto?



series de netflix pdf (8)

Mire https://en.wikipedia.org/wiki/Comparison_of_file_comparison_tools especialmente la columna Comparación estructurada.

Actualmente solo hay dos herramientas que entienden la estructura del lenguaje.

  • Comparar ++ (Funciona muy bien para C ++)
  • Pretty Diff (herramienta de comparación de códigos con conocimiento del idioma para varios idiomas basados ​​en web. También embellece, minimiza y algunas otras cosas ...)

Desafortunadamente, muchas herramientas tienen esta columna todavía vacía.

¿Hay alguna herramienta de diff / merge para lenguajes de programación, que funcione de una manera sensible a la sintaxis (como XML Diff Tool), haciendo más que comparar línea por línea (y opcionalmente ignorando espacios en blanco).

Me interesa un programa que realmente siga la sintaxis del lenguaje y los delimeters, sugiriendo cambios sin romper la corrección sintáctica o agrupando declaraciones separadas en múltiples líneas. El comportamiento de ejemplo sería:

* al encontrar un if(){ que introduce un nivel de anidamiento adicional, empaqueta automáticamente el corchete de cierre } varias líneas a continuación con él).

* mantener los elementos de sintaxis coincidentes, evitar las tonterías, como eliminar un bloque tiende a crear:

int function_A() { int ret; ret = something; ret += something_else;

return ret; } int function_B() { if(valid) { int ret; ret = something; ret += something_else;

return ret; }

else return -1; }

Personalmente, me encantaría encontrar un software capaz de manejar la sintaxis de C ++, pero conocer soluciones para otros idiomas también sería interesante.


Parece que te interesaría el algoritmo Patience Diff de Bram Cohen (creador de BitTorrent) (que se usa en el sistema de control de versiones bazar).

Ver El problema de la dificultad ha sido resuelto y especialmente las ventajas de Patience Diff :

Extracto del segundo enlace:

Otra ventaja de la diferencia de paciencia es que con frecuencia no coincide con líneas que simplemente no deberían coincidir. Por ejemplo, si ha reescrito completamente una sección de código, no debería coincidir con las líneas en blanco en cada versión, como muestra este example . Finalmente, hay este ejemplo:

void func1() { x += 1 } +void functhreehalves() { + x += 1.5 +} + void func2() { x += 2 }

Lo cual es sencillo y obvio, pero los algoritmos diff con frecuencia lo interpretarán así:

void func1() { x += 1 +} + +void functhreehalves() { + x += 1.5 } void func2() { x += 2 }


Por favor mira Compare++ .

Puede hacer una comparación estructurada sensible al lenguaje para C / C ++, Java, C #, Javascript, CSS, ... y opcionalmente ignorar comentarios, formatear puro, espacios en blanco y cambios de casos y tener la capacidad única de alinear secciones movidas como la función C ++ , Espacio de nombres de Java, método de C #, selector de CSS, ...


Si bien KDiff3 no compara elementos de sintaxis en un contexto de gramática, sí tiene una granularidad mayor que "toda la línea modificada", y resaltará exactamente qué partes de una línea se cambian.

Y en mi experiencia, tiene un algoritmo muy bueno para detectar cambios. Dado su ejemplo anterior, compara correctamente function_A y function_B fuera de la caja:

Y aun así, si el algoritmo no coincide con lo que desea, por ejemplo, como el siguiente:

siempre puede anular manualmente colocando marcas de sincronización donde desee que realice la comparación.

Alternativa 1:

Alternativa 2:


Si está utilizando eclipse, el editor de comparación integrado proporciona diff / merge consciente de la sintaxis, al menos para Java. Marque "Abrir comparación de estructura automáticamente" en las preferencias "General / Comparar / Parche", luego elija "Comparación de estructura de Java" en el editor de comparación.


Vea nuestras herramientas SmartDifferencer .

Los SmartDifferencers son específicos del idioma, impulsados ​​por analizadores de lenguaje de calidad de producción, crean AST y comparan los árboles. Esto los hace completamente independientes del diseño del texto y los comentarios intermedios; notablemente, son inmunes a los cambios en el texto de los literales (raíz, mover punto decimal + exponente de cambio, diferentes secuencias de escape) si el valor real representado por el literal no es diferente. El resultado se informa en términos de sintaxis del lenguaje y acciones de edición plausibles (mover, copiar, insertar, eliminar, cambiar el nombre del identificador dentro del bloque).

Hay versiones para C #, Java, C ++, Python y una variedad de otros lenguajes. Hay ejemplos de cada uno de estos en el sitio web.

Existe un SmartDifferencer para C, pero el análisis de archivos C sin la línea de comando del compilador completo a veces es problemático, por lo que a veces falla y debe recurrir a herramientas de comparación más primitivas, como diff. Estamos trabajando para mejorar esta situación.


Beyond Compare hace algo de lo que estás preguntando. No mantiene la corrección sintáctica ni compara bloques de idiomas a la vez, pero puede hacer lo siguiente:

  • Una cierta comprensión de la sintaxis del lenguaje, por lo que puede resaltar la sintaxis de los archivos comparados, y también puede reconocer y, opcionalmente, ignorar las diferencias sin importancia (como los comentarios, incluidos los comentarios de líneas múltiples).
  • Soporte para usar programas de conversión externos para cargar y guardar datos. De fábrica, admite usar esto para embellecer XML y HTML antes de compararlo. Puede configurar la Sanguijuela GNU para estandarizar la sintaxis antes de comparar dos archivos C.
  • Pesos de línea opcionales que le permiten otorgar un mayor peso al emparejamiento, por ejemplo, llaves de cierre. No he probado esta característica.
  • Reemplazos, para ignorar en una sola sesión cada lugar donde old_variable_name a la izquierda se reemplazó con new_variable_name a la derecha.

Es, de lejos, la mejor herramienta de difusión y fusión que he usado. También es multiplataforma, es económico ($ 30 por estándar, $ 50 por profesional) y tiene un período de evaluación muy generoso, así que vale la pena intentarlo.


Semántica Merge .
Idiomas admitidos, desde el sitio web:

Comenzamos con C # y Vb.net, luego agregamos Java. Ahora C ya es compatible y luego nos enfocaremos en C ++, Objective-C y JavaScript, dependiendo de sus comentarios