Si se puede generar algo, entonces eso es información, no código.
En la medida en que estipule más adelante que ese código son datos, su propuesta se reduce a "Si se puede generar algo, entonces esa cosa no es código". ¿Diría, entonces, que el código de ensamblaje generado por un compilador de C no es código? ¿Qué pasa si coincide exactamente con el código de ensamblaje que escribo a mano? Puedes ir allí si lo deseas, pero no iré contigo.
Comencemos con una definición de "código". Sin ser demasiado técnico, una definición bastante buena para los propósitos de esta discusión sería "instrucciones accionables por la máquina para realizar un cálculo".
Dado eso, ¿no es toda esta idea de generación de código fuente un malentendido?
Bueno, sí, su propuesta inicial es que el código no se puede generar, pero rechazo esa propuesta. Si acepta mi definición de "código", entonces no debería haber ningún problema conceptual con la generación de código en general.
Es decir, si hay un generador de código para algo, entonces ¿por qué no hacer de ese algo una función adecuada que pueda recibir los parámetros requeridos y realizar la acción correcta que el código "generado" habría hecho?
Bueno, esa es una pregunta completamente diferente, sobre la razón para emplear la generación de código, en lugar de sobre su naturaleza. Está proponiendo la alternativa de que, en lugar de escribir o usar un generador de código, se escriba una función que calcule el resultado directamente. ¿Pero en qué idioma? Atrás quedaron los días en que alguien escribió directamente en el código de máquina, y si escribe su código en cualquier otro idioma, entonces depende de un generador de código en forma de compilador y / o ensamblador para producir un programa que realmente se ejecute.
¿Por qué, entonces, prefieres escribir en Java o C o Lisp o lo que sea? Incluso ensamblador? Afirmo que es al menos en parte porque esos lenguajes proporcionan abstracciones para los datos y las operaciones que hacen que sea más fácil expresar los detalles del cálculo que desea realizar.
Lo mismo es cierto para la mayoría de los generadores de código de nivel superior, también. Los casos prototípicos son probablemente generadores de escáner y analizador sintáctico como lex
y yacc
. Sí, puede escribir un escáner y un analizador directamente en C o en algún otro lenguaje de programación de su elección (incluso código máquina sin formato), y a veces uno lo hace. Pero para un problema de complejidad significativa, el uso de un lenguaje de propósito especial de nivel superior como lex's o yacc's hace que el código escrito a mano sea más fácil de escribir, leer y mantener. Por lo general, también es mucho más pequeño.
También debe considerar qué quiere decir exactamente con "generador de código". Consideraría el preprocesamiento de C y la creación de instancias de plantillas de C ++ como ejercicios en la generación de código; ¿te opones a esto? Si no, entonces creo que necesitarás realizar algunas gimnasias mentales para racionalizar la aceptación de esas pero rechazando otros sabores de generación de código.
Si se hace por razones de rendimiento, eso suena como una deficiencia del compilador.
¿Por qué? Básicamente está postulando que uno debería tener un programa universal al que el usuario alimente datos, algunos clasificados como "instrucciones" y otros como "entrada", y que proceda a realizar el cálculo y emitir más datos que llamamos "salida". (Desde cierto punto de vista, uno podría llamar a un programa tan universal como "sistema operativo"). Pero, ¿por qué supone que un compilador debería ser tan efectivo para optimizar un programa de propósito general como lo es para optimizar un programa más especializado? ¿programa? Los dos programas tienen características diferentes y capacidades diferentes.
Si se está haciendo para unir dos idiomas, entonces eso suena como una falta de biblioteca de interfaz.
Dices eso como si tener una biblioteca de interfaz universal en algún grado fuera necesariamente algo bueno. Quizás lo haría, pero en muchos casos una biblioteca de este tipo sería grande y difícil de escribir y mantener, y tal vez incluso lenta. Y si tal bestia, de hecho, no existe para atender el problema particular en cuestión, ¿quién es usted para insistir en que se cree uno, cuando un enfoque de generación de código puede resolver el problema mucho más rápida y fácilmente?
¿Me estoy perdiendo de algo?
Varias cosas, creo.
Sé que el código también es información. Lo que no entiendo es, ¿por qué generar código fuente? ¿Por qué no convertirlo en una función que pueda aceptar parámetros y actuar sobre ellos?
Los generadores de código transforman el código escrito en un idioma para codificar en un idioma diferente, generalmente de nivel inferior. Se pregunta, entonces, por qué la gente querría escribir programas usando múltiples idiomas, y especialmente por qué querrían mezclar idiomas de niveles subjetivamente diferentes.
Pero ya toqué eso. Uno elige un lenguaje para una tarea particular basado en parte en su claridad y expresividad para esa tarea. Como el código más pequeño tiene menos errores en promedio y es más fácil de mantener, también existe un sesgo hacia los lenguajes de nivel superior, al menos para el trabajo a gran escala. Pero un programa complejo implica muchas tareas y, a menudo, algunas de ellas pueden abordarse de manera más efectiva en un idioma, mientras que otras se abordan de manera más eficaz o más concisa en otro. Usar la herramienta adecuada para el trabajo a veces significa emplear la generación de código.