2010-09-13 12 views
12

¿Cuál es el problema que no se ha creado nivel industrial herramienta de refactorización para C/C++, solo necesito una herramienta que "simplemente funcione"?Razones para que las herramientas de refactorización para C/C++ sean tan limitadas

Lo que quiero decir con "nivel industrial" es una calidad proporcionada por los productos de JetBrains (IntelliJ, ReSharper) o superior. Todas las soluciones disponibles (incluida la asistencia visual de Tomato Software o Eclipse CDT) no son lo suficientemente maduras.

A continuación se detallan las ventajas para una puesta en marcha de un proyecto de este tipo.

  • alivio de la sintaxis de C++ aburing (haciendo que el desarrollo sea más divertido);
  • C++ está evolucionando (la versión 0x viene, por tanto, mucho trabajo para tales implementadores de herramientas);
  • nicho de comercialización es más amplio que cualquier otra cosa (una gran cantidad de código C++ escrito, una gran cantidad de proyectos C++ activos), incluso teniendo en cuenta los proyectos Web (HTML/JavaScript);
  • C++ se elige para los problemas del sistema donde cada error encontrado por la herramienta en tiempo de compilación es una supervivencia (muchas empresas o gobiernos deberían estar interesados);
  • dicha herramienta puede disminuir el tiempo de compilación del proyecto;

El único inconveniente son los desafíos técnicos ... pero mirando lo que Google, Microsoft, Intel, etc. están haciendo, no debería haber problemas técnicos irresolubles.

    Permite resumir:
  1. es posible aplicar dicho producto
  2. es enormemente rentable
  3. que no existe

Nadie quiere obtener un beneficio? Colusión;)? ¿Cuál es el motivo?

+5

+1 para dar la sensación de que no estoy solo – Chubsdad

+5

¿No hay un solo ejemplo de refactorización que quiera que la herramienta haga, y está hablando de "sintaxis aburrida"? Si eres un troll, vete, y si no lo eres, incluye algunos detalles técnicos en tu pregunta en lugar de solo establecer conclusiones injustificadas. –

+1

@Ben Voigt Este no es un tema para posibles refactorizaciones de C y C++. En resumen, todo el trabajo posible debería delegarse en una herramienta. También navegación, sugerencias, advertencias, mantenimiento de archivos ... C++ es un pozo de esas oportunidades: el límite es el cielo, especialmente frente a C++ 0x (http://en.wikipedia.org/wiki/C%2B%) 2B0x). (También para refactorizaciones del lenguaje relacionado, eche un vistazo aquí http://www.jetbrains.com/resharper/features/code_refactoring.html) – tivadj

Respuesta

8

This link habla de algunos detalles y la complejidad que

+1

"muy complicado" no significa imposible. Los compiladores ** hacen ** su trabajo. – tivadj

+11

"Muy complicado" A menudo significa "demasiado lento para el uso en tiempo real". –

+0

@tivadj @MadKeithV Caso práctico, Visual Studio Intellisense, que pondrá de rodillas a su estación de trabajo con un proyecto C++ de tamaño moderado. –

6

La razón es que C++ no es analizable mediante técnicas de análisis más comunes (LALR, LL, etc.) y, de hecho requiere una cierta elevación bastante pesado para analizar correctamente. Algunas herramientas como clang y gcc-xml hacen posible que otras herramientas procesen C++ sin implementar sus propios analizadores de C++, aunque ambas son bastante nuevas, y aún puede ser complicado procesar C++ incluso con estas herramientas de análisis. Creo que la industria eventualmente verá todos los artículos relacionados con Java portado/adaptado a C++ ... la pregunta es cuándo.

+0

El problema es más que un simple análisis sintáctico. Debe obtener el nombre y la resolución de tipo correctos (y la gente a menudo quiere que lo haga teniendo solo acceso parcial a las fuentes), y debe poder calcular la información del flujo de datos, incluidos los puntos de análisis y la información del gráfico de llamadas. Estos son análisis muy sofisticados, y los analizadores por sí mismos no hacen esto. –

+0

@Ira, correcto ... Aludí a algunos de esos problemas cuando escribí "todavía puede ser complicado procesar C++ incluso con estas herramientas de análisis". –

4

El problema es que C++ es difícil de analizar (su gramática no está libre de contexto) y es difícil de entender sin tener que compilar la fuente. Las herramientas de Java pueden funcionar porque el lenguaje es mucho más simple, tanto la gramática como la semántica.

+5

Scratch "hard", reemplace con "impossible". El preprocesador solo puede invalidar cualquier suposición sobre el código sin compilarlo. –

+0

Y si ejecuta un pase de preprocesador ... sus resultados de refactorización terminan con todas las macros sustituidas, etc. De hecho, las refactorizaciones automáticas comienzan a parecerse mucho a las optimizaciones del compilador; cosas como la subexpresión común y la refactorización de rutas calientes son realmente agradables pero produce un código que ya no es fácil de comprender y editar para un humano. –

+0

Imposible en general, sí; Práctico, bien. Cuando el preprocesador se usa de manera abusiva, el código es ilegible y no se puede mantener, y la mayoría de la gente no escribe ese tipo de cosas. Es peor con C que con C++, porque C++ ofrece mecanismos alternativos de abstracción. Para una herramienta que puede analizar C (módulo mal usado macros/condicionales) y C++ (bastante bien), consulte nuestra interfaz de C++: http://www.semanticdesigns.com/Products/FrontEnds/CppFrontEnd.html. Respaldado por una robusta herramienta de transformación de programas, DMS. Esto ha sido para hacer masivas refactorizaciones en C++. –

15

Vamos a considerar sólo una refactorización básica: función Cambiar nombre

La aplicación parece muy simple. Encuentre todas las referencias y reemplace el identificador utilizado.

Se vuelve un poco más complicado con las funciones virtuales. Ahora es necesario encontrar la declaración base (y la implementación, si no es abstracta), y las referencias pueden ser a cualquier implementación derivada en la jerarquía de clases.Mucho más difícil, pero aún factible, porque el grupo de funciones a renombrar está bien definido.

Esa es la complejidad que se aplica a los lenguajes como C# y Java. Ahora viene el kicker: las plantillas de C++ son patadas. El conjunto de implementaciones en la jerarquía de clases ya no está bien definido, porque podría incluir CUALQUIER función con el mismo nombre y posiblemente parámetros compatibles. ¿Te acuerdas de la búsqueda de Koenig, verdad?

Tratar de separar la lista de funciones que deben tener el mismo nombre, porque comenzaron en el mismo conjunto de resolución de sobrecarga, de aquellos verdaderamente independientes, sería una pesadilla absoluta. En este punto, también podría hacer una búsqueda textual y reemplazar.

Así que vamos a bajar su pliego de peticiones/deseos:

  • "aliviar la sintaxis aburrido". Esto es solo trolling y no significa nada en ningún sentido técnico. Si la herramienta no ingresa y saca sintaxis de C++, no es una herramienta de refactorización de C++.
  • "C++ está evolucionando". Esto significa que una herramienta de este tipo debería mantenerse a un costo considerable para mantenerse al día. También significa que una herramienta bien mantenida robaría fácilmente la cuota de mercado de herramientas estables más antiguas. Y significa que cualquier herramienta necesita una tonelada de configuración de usuario; después de todo, no desea generar C++ 0x-ismos en una base de código C++ 03, por lo que los usuarios tendrán que usar la herramienta muchísimo para recuperar el tiempo de configuración.
  • "Cada error es una supervivencia"? ¿No estoy seguro exactamente de lo que significa esta afirmación gramaticalmente absurda, pero tal vez signifique cero tolerancia a los errores? Pero eso se logra mejor manteniendo la estabilidad (la antítesis de la refactorización automatizada que toca varios archivos), la arquitectura sólida y la documentación (que una herramienta de refactorización no se actualizará automáticamente, ¿o eso quiere también?), Conjuntos de pruebas masivas y análisis estático . De hecho, la refactorización hace que las suites de prueba masivas sean aún más importantes, si eso es posible, para verificar que la herramienta no haya roto nada. Tenga en cuenta que el análisis estático automático enfrenta algunos de los mismos desafíos que la refactorización, pero dado que no cambia el código, puede funcionar y funciona en códigos AST post-preprocesados ​​y/o compiladores.
  • "disminuir el tiempo de compilación"? Este es un reclamo sin fundamento que requiere una evidencia seria o al menos un razonamiento sólido. ¿Está esperando una herramienta de refactorización para introducir pimpl para la compilación de cortafuegos? Ninguna de las refactorizaciones de estilo C# y Java reducirá el tiempo de compilación de C++ ni un ápice.
  • "es posible" No, en realidad parece que no lo es. Si usted o yo no podemos diseñar una refactorización básica como Renombrar la función de una manera sensata, no importa implementarla correctamente, ¿cómo puede alguien implementar docenas de ellas? Si es posible, también es extremadamente caro, lo que lleva a:
  • "es enormemente rentable". La rentabilidad no solo requiere una gran base de usuarios que están dispuestos a pagar por un producto, sino que las posibles ventas brutas exceden los costos. Afirmo que ha subestimado seriamente los costos, de modo que hasta que proporcione una investigación real sobre los costos y los mercados, también lo llamaré una ilusión.
  • "no existe". Después de hacer todo lo posible para explicar por qué una herramienta así no puede existir, ahora voy a decirte que ya lo hace. Sip. Al menos en la medida en que la refactorización mejora el código final al elevar subexpresiones comunes fuera de los bucles, desenrollar bucles, intercambiar orden de iteración, alineación, optimización de caché, vectorización, ya son proporcionados optimizando compiladores, un área en la que C++ lidera ambos C# y Java por un amplio margen. C++ simplemente no requiere muchos de los ajustes de nivel de fuente necesarios en C# y Java para obtener un buen producto final. Es solo la manipulación del código fuente para que sea más accesible para los humanos lo que queda, y las herramientas existentes hacen un trabajo adecuado, si no una excepción, de esto.
+0

Muy. muy buena respuesta. ¡Felicitaciones! –

Cuestiones relacionadas