Se algo pode ser gerado, então isso é dado, não código.
Na medida em que você estipula posteriormente que o código são dados, sua proposta se reduz a "Se algo puder ser gerado, esse item não será código". Você diria, então, que o código de assembly gerado por um compilador C não é código? E se coincidir exatamente com o código de montagem que escrevo à mão? Você pode ir lá, se quiser, mas eu não vou com você.
Vamos começar com uma definição de "código". Sem ser muito técnico, uma definição muito boa para os propósitos desta discussão seria "instruções acionáveis por máquina para executar um cálculo".
Dado isso, toda essa ideia de geração de código fonte não é um mal-entendido?
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", não deverá haver nenhum problema conceitual com a geração de código em geral.
Ou seja, se existe um gerador de código para alguma coisa, por que não fazer disso uma função adequada que possa receber os parâmetros necessários e executar a ação correta que o código "geraria" teria feito?
Bem, essa é uma pergunta totalmente diferente, sobre o motivo de empregar geração de código, e não sobre sua natureza. Você está propondo a alternativa de que, em vez de escrever ou usar um gerador de código, alguém escreve uma função que calcula o resultado diretamente. Mas em que idioma? Longe vão os dias em que alguém escreveu diretamente no código da máquina e, se você escrever o código em qualquer outro idioma, depende de um gerador de código na forma de um compilador e / ou montador para produzir um programa que realmente seja executado.
Por que, então, você prefere escrever em Java ou C ou Lisp ou o que quer? Montador mesmo? 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 se aplica à maioria dos geradores de código de nível superior. Os casos prototípicos provavelmente são geradores de scanner e analisador, como lex
e yacc
. Sim, você pode escrever um scanner e um analisador diretamente em C ou em alguma outra linguagem de programação de sua escolha (até mesmo código de máquina bruto), e às vezes um faz. Porém, para um problema de qualquer complexidade significativa, o uso de uma linguagem para fins especiais de nível superior, como lex ou yacc, facilita o código manuscrito, a gravação, a leitura e a manutenção. 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 C e a instanciação de modelos C ++ como exercícios na geração de código; você se opõe a isso? Caso contrário, acho que você precisará executar algumas ginástica mentais para racionalizar a aceitação delas, mas rejeitar outros tipos de geração de código.
Se estiver sendo feito por motivos de desempenho, isso soa como uma falha do compilador.
Por quê? Você está basicamente afirmando que um 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 executar o cálculo e emitir mais dados que chamamos de "saída". (De um certo ponto de vista, pode-se chamar esse programa universal de "sistema operacional".) Mas por que você supõe que um compilador deve ser tão eficaz na otimização de um programa de uso geral quanto na otimização de um programa mais especializado? programa? Os dois programas têm características diferentes e capacidades diferentes.
Se estiver sendo feito para conectar dois idiomas, isso soa como uma falta de biblioteca de interface.
Você diz que como se ter uma biblioteca de interface universal até certo ponto fosse necessariamente uma coisa boa. Talvez fosse, mas em muitos casos essa biblioteca seria grande e difícil de escrever e manter, e talvez até lenta. E se esse animal não existe de fato para atender o problema específico em questão, quem é você para insistir em que um seja criado, quando uma abordagem de geração de código pode resolver o problema com muito mais rapidez e facilidade?
Estou faltando alguma coisa aqui?
Várias coisas, eu acho.
Eu sei que o código também é dados. O que eu não entendo é, por que gerar código fonte? Por que não transformá-lo em uma função que pode aceitar parâmetros e agir sobre eles?
Geradores de código transformam código escrito em um idioma em código 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, principalmente, por que eles podem querer misturar idiomas de níveis subjetivamente diferentes.
Mas eu já toquei nisso. A pessoa escolhe um idioma para uma tarefa específica, baseada em parte em sua clareza e expressividade para essa tarefa. Como o código menor possui menos bugs, em média, e é mais fácil de manter, também existe uma tendência para idiomas de nível superior, pelo menos para trabalhos em larga escala. Porém, 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 mais efetivas ou concisas em outro. Às vezes, usar a ferramenta certa para o trabalho significa empregar geração de código.