If something can be generated, then that thing is data, not code.
Na medida em que você estipula mais tarde que o código é dado, sua proposição reduz para "Se algo pode ser gerado, então essa coisa não é código". Você diria, então, que o código assembly gerado por um compilador C não é código? E se acontecer de coincidir exatamente com o código de montagem que escrevo à mão? Você é bem-vindo para ir até lá se quiser, mas eu não irei com você.
Vamos começar com uma definição de "código". Sem ficar muito técnico, uma boa definição para os propósitos desta discussão seria "instruções acionáveis por máquina para realizar uma computação".
Given that, isn't this whole idea of source code generation a misunderstanding?
Bem, sim, sua proposição inicial é que o código não pode ser gerado, mas eu rejeito essa proposição. Se você aceitar minha definição de "código", então não deve haver nenhum problema conceitual com a geração de código em geral.
That is, if there is a code generator for something, then why not make that something a proper function which can receive the required parameters and do the right action that the "would generated" code would have done?
Bem, essa é uma questão totalmente diferente, sobre a razão para empregar a geração de código, em vez de sua natureza. Você está propondo a alternativa de que, em vez de escrever ou usar um gerador de código, alguém grave uma função que calcule o resultado diretamente. Mas em que idioma? Já se foram os dias em que alguém escreveu diretamente em código de máquina e, se você escreve seu código em qualquer outra linguagem, depende de um gerador de código na forma de um compilador e / ou assembler para produzir um programa que seja executado.
Por que, então, você prefere escrever em Java ou C ou Lisp ou o que for? Até montador? Afirmo que é pelo menos em parte porque essas linguagens fornecem abstrações para dados e operações que facilitam a expressão dos detalhes da computação que você deseja executar.
O mesmo acontece com a maioria dos geradores de código de nível superior também. Os casos protótipos são provavelmente geradores de analisadores e analisadores, como lex
e yacc
. Sim, você poderia escrever um scanner e um analisador diretamente em C ou em alguma outra linguagem de programação de sua escolha (mesmo código de máquina bruta), e às vezes um. Mas, para um problema de qualquer complexidade significativa, usar uma linguagem de propósito especial de nível superior, como lex ou yacc, torna o código escrito à mão mais fácil de escrever, ler e manter. Geralmente muito menor também.
Você também deve considerar o que exatamente você quer dizer com "gerador de código". Eu consideraria o pré-processamento de C e a instanciação de modelos C ++ como exercícios na geração de código; você se opõe a isso? Se não, então eu acho que você precisará realizar alguma ginástica mental para racionalizar a aceitação daqueles, mas rejeitar outros sabores de geração de código.
If it is being done for performance reasons, then that sounds like a shortcoming of the compiler.
Por quê? Você está basicamente supondo que se deve ter um programa universal para o qual o usuário alimenta dados, alguns classificados como "instruções" e outros como "entrada", e que prossegue para realizar o cálculo e emitir mais dados que chamamos de "saída". (De um certo ponto de vista, pode-se chamar um programa tão universal de "sistema operacional".) Mas por que você acha que um compilador deve ser tão eficaz na otimização de um programa de propósito geral quanto é otimizar um programa mais especializado? programa? Os dois programas têm características e capacidades diferentes.
If it is being done to bridge two languages, then that sounds like a lack of interface library.
Você diz isso como se ter uma biblioteca de interfaces universal para um grau fosse necessariamente uma coisa boa. Talvez sim, mas em muitos casos essa biblioteca seria grande e difícil de escrever e manter, e talvez até lenta. E se tal besta de fato não existe para servir ao problema específico em questão, então, quem é você para insistir que seja criado, quando uma abordagem de geração de código pode resolver o problema com muito mais rapidez e facilidade?
Am I missing something here?
Várias coisas, eu acho.
I know that code is data as well. What I don't understand is, why generate source code? Why not make it into a function which can accept parameters and act on them?
Os geradores de código transformam o código escrito em um idioma para codificar em um idioma diferente, geralmente de nível inferior. Você está perguntando, então, por que as pessoas gostariam de escrever programas usando vários idiomas e, especialmente, por que eles poderiam querer misturar idiomas de níveis subjetivamente diferentes.
Mas eu já falei sobre isso. Escolhe-se uma linguagem para uma tarefa específica, baseada em parte em sua clareza e expressividade para essa tarefa. Na medida em que o código menor tem menos bugs, em média, e é mais fácil de manter, há também uma tendência para linguagens de nível mais alto, pelo menos para o trabalho em grande escala. Mas um programa complexo envolve muitas tarefas e, muitas vezes, algumas delas podem ser tratadas de maneira mais eficaz em um idioma, enquanto outras são tratadas de maneira mais eficaz ou mais concisa em outro. Usar a ferramenta certa para o trabalho, às vezes, significa empregar a geração de código.