¿Tiene sentido escribir scripts de compilación en C ++?

15

Estoy usando CMake para generar mis proyectos IDE / makefiles, pero todavía necesito llamar "scripts" personalizados para manipular mis archivos compilados o incluso generar código.

En proyectos anteriores, he estado usando Python y estaba bien, pero ahora estoy teniendo serios problemas para administrar muchas dependencias en dos proyectos muy grandes en los que estoy trabajando, así que quiero minimizar las dependencias en todas partes.

Alguien me sugirió usar C ++ para escribir mis scripts de compilación en lugar de agregar una dependencia de lenguaje solo para eso. Los proyectos ya usan C ++, por lo que hay varias ventajas que puedo ver:

  • para construir todo el proyecto, solo sería necesario un compilador de C ++ y CMake, nada más (todas las demás dependencias son C o C ++);
  • La seguridad de tipo C ++ (cuando se usa C ++ moderno) hace que todo sea más fácil de "corregir";
  • también es el idioma que mejor conozco, así que estoy más cómodo incluso si puedo escribir un buen código de Python;
  • ganancia potencial en la velocidad de ejecución (pero no creo que sea realmente perceptible);

Sin embargo, creo que puede haber algunos inconvenientes y no estoy seguro del impacto real, ya que aún no lo intenté:

  • podría ser más largo para escribir el código (dicho esto no estoy seguro porque soy lo suficientemente eficiente en C ++ para escribir algo que funcione rápidamente, así que tal vez para este sistema no sería tan largo escribir) (el tiempo de compilación no debería ' t sea un problema para este caso);
  • Debo suponer que todos los archivos de texto que leeré como entrada están en UTF-8, no estoy seguro de que se pueda verificar fácilmente en tiempo de ejecución en C ++ y el lenguaje no lo comprobará por usted;
  • las bibliotecas en C ++ son más difíciles de administrar que en los lenguajes de secuencias de comandos;

Me falta experiencia y visión de futuro, así que tal vez me faltan ventajas e inconvenientes. Entonces la pregunta es: ¿tiene sentido usar C ++ para esto? ¿Tiene experiencias para informar y ve ventajas y desventajas que podrían ser importantes?

Klaim
fuente
1
Dependiendo de un intérprete de un solo idioma para la compilación , no parece tan malo, especialmente porque es Python: muy portátil, extendido en Linux y fácilmente disponible en Windows. Si necesita bibliotecas de Python adicionales, puede usar virtualenv y no agregará nada más que un archivo de Python (que podría enviar) conexión a Internet y un poco de fontanería para configurar virtualenv, instalarlos en el y ejecutar su construir scripts en ese entorno. Puede obtener un script adicional en su compilación y una conexión a Internet como requisito.
Puede adivinar la codificación de texto con una fiabilidad bastante buena.
DeadMG
@DeadMG Sí, pero hacerlo a mano si es demasiado trabajo (si quieres una buena suposición y no te limitas a "es esto ascii o unicode, y si es unicode, ¿cuántos bits y qué orden de bytes?") Y agregar otra dependencia (si hay una biblioteca libre y autónoma para esto) derrota el punto de caer a C ++ para dejar de depender de Python.
@delnan Sí, pero todavía tiene más lenguaje para instalar. Según su descripción, cualquier dependencia adicional no parecería "demasiado mala", pero lo estoy considerando porque ya hay mucho que administrar, por lo que tal vez pueda ayudar a limitar los idiomas utilizados también. También utilizo un lenguaje de secuencias de comandos incrustado (implementado en C ++ directamente en el proyecto), javascript / HTML / CSS, XML y otros formatos que ya son muchos para tener en cuenta.
Klaim
2
¿Qué usará para construir su script de compilación de C ++?
jk.

Respuestas:

24

Solo usa Python.

Me desarrollo en C ++ y hago mis scripts de compilación en Python, y me resultaría doloroso hacer scripts de compilación en C ++:

  • Python hace que sea trivial manipular diccionarios, listas, diccionarios anidados de diccionarios de listas, etc. (Por ejemplo, uno de mis scripts utiliza una jerarquía de niveles múltiples de todas mis herramientas, versiones de herramientas y rutas de versiones de herramientas. ) C ++ puede hacer lo mismo con plantillas y clases personalizadas, pero es mucho más detallado (lo que se traduce en más líneas de código, lo que generalmente se traduce en una menor productividad).
  • Python proporciona bibliotecas y rutinas de alto nivel, como su manejo, subproceso y os.walk de XML y JSON . De nuevo, C ++ puede hacer esto, pero es mucho más trabajo encontrar las bibliotecas, aprender sus API, ensamblar correctamente las llamadas (que a menudo son de nivel inferior), etc.
  • Los scripts de compilación son una actividad sin valor agregado (para tomar prestado un término de Lean). Es mejor utilizar un lenguaje de alto nivel como sea posible, hacerlos lo más rápido posible, volver al trabajo, lo que beneficia a sus usuarios.
  • En mi experiencia, los scripts de compilación tienden a crecer de manera imprevista. Incluso si una tarea parece inicialmente simple para C ++, puede complicarse rápidamente. Cuando surge un nuevo requisito, a menudo es mucho más simple abordar el manejo en un script Python que hacerlo en C ++ (lo que puede requerir buscar o leer en las nuevas API de la biblioteca, etc.).

En cuanto a las ventajas que enumera para C ++:

  • Agregar una sola dependencia (Python) no debería complicar significativamente su compilación. Ya es estándar en la mayoría de las instalaciones de Linux, por ejemplo. Gracias a las bibliotecas "baterías incluidas" de Python, puede ser incluso más fácil de administrar que las bibliotecas C ++ de las que dependerían sus scripts de compilación.
  • El tipo de seguridad que ofrece C ++ es más útil para proyectos grandes, no pequeños scripts.
  • Python complementa muy bien C ++ (nivel alto versus nivel inferior, tipo dinámico versus tipo estático, etc.) e incluso puede integrarse muy bien con C ++ (gracias a SWIG y Boost.Python) si luego desea hacerlo, entonces es Vale la pena aprender para un programador de C ++.
  • Como dijiste, la velocidad de ejecución no debería ser un problema.
Josh Kelley
fuente
Hicimos esto (compilaciones de Python) después de un año de dificultades con cmake en un proyecto de plataforma cruzada. Al final, ni siquiera nos molestamos en intentar verificar la dependencia (la parte más compleja de una compilación). Dado que para las compilaciones automatizadas desea reconstruir todo de todos modos y en C ++ hay tantas dependencias complejas
Martin Beckett
1

Creo que esta es una pregunta específica del caso. Yo diría que no hay una respuesta correcta si tiene sentido o no usar C ++ para crear scripts, la única forma de resolverlo es probarlo en la práctica.

Personalmente, vería Python superior a C ++ debido a una mejor expresividad del lenguaje y herramientas de biblioteca estándar más fáciles (opinión personal, por supuesto) para administrar la tarea de manipular archivos binarios y generar código. Por supuesto, las bibliotecas sofisticadas desarrolladas para la tarea podrían estar disponibles, pero si no, entonces yo personalmente apostaría definitivamente a que Python sea la respuesta "más a menudo correcta", en general.

zxcdw
fuente
1

No escriba guiones usted mismo, está duplicando esfuerzos y reinventando ruedas.

Use algo como SCONS o incluso Maven 3 que tiene soporte para sistemas de compilación C ++ .

Un buen sistema de compilación, independientemente del lenguaje, no debería requerir una lógica personalizada en forma de scripts para construir un artefacto ejecutable que funcione.

Si tiene que escribir scripts para un sistema de compilación para personalizarlo, no es un buen sistema de compilación. Escribir un complemento para un sistema de compilación es una historia diferente, pero aún así debería ser muy particular para un entorno / hardware en su mayoría, y debería ser algo a lo que rara vez se recurre.


fuente
1
Como expliqué, ya estoy usando cmake pero todavía necesito secuencias de comandos personalizadas. Estoy hablando de esos scripts personalizados, no del proceso de construcción en sí.
Klaim
1
Me encanta Maven: ¡el guión necesario para construir un programa C "Hell World" es más largo que el programa!
quant_dev
@quant_dev, recuerdo la primera vez que busqué el uso de Maven, en su propia página web, recomiendan comenzar con alguien que ya conoce a maven, ya que es difícil de configurar la primera vez. ¡Esa fue la primera señal de que no quería tener nada que ver con eso!
Brady
Me gustaron SCons, es un poco lento pero muy fácil de usar.
quant_dev
1
@JarrodRoberson Usé "guiones" demasiado liberalmente. Me refiero a sus archivos de configuración. No estoy seguro de si ser declarativo hace que Maven sea más portátil y más fácil de mantener. Sin embargo, lo hace menos flexible, lo que puede ser un dolor en proyectos grandes.
quant_dev
0

Para centrarse en la pregunta:

¿Tiene sentido escribir scripts de compilación en C ++?

La respuesta es un simple no .

La respuesta actualmente aceptada se amplía a Python y enumera un montón de preocupaciones válidas, pero me gustaría agregar una razón independiente del idioma:

Realmente no desea escribir nada en ningún lenguaje compilado si puede ayudarlo:

  • ¡Necesitarás un script para arrancar el script!
  • O bien, debe registrar el script compilado en el control de fuente (¡y mantenerlo sincronizado con las fuentes verificadas!)
  • El script de repente también tiene una configuración de compilación para el script adjunto. (¡Eso necesita ser mantenido!)

Además, yendo con la otra respuesta:

Probablemente tampoco desee utilizar un lenguaje de script "en bruto" para crear sus scripts de compilación (entiendo que CMake manejaría las complejidades de C ++).

Lo que probablemente debería hacer es elegir uno de los Build . Los sistemas . a cabo . allí . y ver si uno se ajusta a su factura wrt. scriptability / extensibilidad / play-nice-with-CMake / crossplatformness.

Martin Ba
fuente