Si quelque chose peut être généré, alors ce sont des données, pas du code.
Dans la mesure où vous stipulez plus tard que le code est une donnée, votre proposition se réduit à "Si quelque chose peut être généré, alors ce n'est pas du code". Diriez-vous alors que le code assembleur généré par un compilateur C n'est pas un code? Et si cela coïncide exactement avec le code d'assemblage que j'écris à la main? Vous pouvez y aller si vous le souhaitez, mais je ne viendrai pas avec vous.
Commençons plutôt avec une définition de "code". Sans être trop technique, une définition plutôt bonne pour les besoins de cette discussion serait "des instructions exploitables par une machine pour effectuer un calcul".
Dans ces conditions, l’idée même de la génération de code source n’est-elle pas un malentendu?
Eh bien oui, votre proposition de départ est que le code ne peut pas être généré, mais je rejette cette proposition. Si vous acceptez ma définition de «code», la génération de code en général ne devrait poser aucun problème conceptuel.
Autrement dit, s'il existe un générateur de code pour quelque chose, pourquoi ne pas en faire une fonction appropriée pouvant recevoir les paramètres requis et effectuer l'action correcte que le code "aurait généré" aurait fait?
Eh bien, c’est une question tout à fait différente, sur la raison d’utiliser la génération de code, plutôt que sur sa nature. Vous proposez comme alternative que, au lieu d'écrire ou d'utiliser un générateur de code, on écrit une fonction qui calcule directement le résultat. Mais dans quelle langue? Il est révolu le temps où quiconque écrivait directement dans le code machine et si vous écrivez votre code dans une autre langue, vous dépendez d'un générateur de code sous la forme d'un compilateur et / ou d'un assembleur pour générer un programme qui s'exécute réellement.
Pourquoi, alors, préférez-vous écrire en Java, en C, en Lisp ou ailleurs? Même assembleur? J'affirme que c'est au moins en partie parce que ces langages fournissent des abstractions pour les données et les opérations qui facilitent l'expression des détails du calcul que vous voulez effectuer.
Il en va de même pour la plupart des générateurs de code de niveau supérieur. Les cas prototypiques sont probablement des générateurs de scanner et d’analyseur tels que lex
et yacc
. Oui, vous pouvez écrire un scanner et un analyseur directement en C ou dans un autre langage de programmation de votre choix (même du code machine brut), et parfois un. Mais pour un problème de complexité significative, l'utilisation d'un langage de niveau supérieur, tel que lex ou le yacc, facilite l'écriture, la lecture et la maintenance du code manuscrit. Habituellement beaucoup plus petit aussi.
Vous devriez également considérer ce que vous entendez exactement par "générateur de code". Je considérerais le prétraitement C et l’instanciation de modèles C ++ comme des exercices de génération de code; vous opposez-vous à cela? Sinon, je pense que vous devrez effectuer une gymnastique mentale pour rationaliser l'acceptation de celles-ci, mais en rejetant d'autres versions de la génération de code.
Si cela est fait pour des raisons de performances, cela ressemble à une lacune du compilateur.
Pourquoi? Vous pensez en principe qu’il faut un programme universel vers lequel l’utilisateur insère des données, certaines classées comme "instructions" et d’autres comme "entrée", et qui effectue le calcul et émet plus de données que nous appelons "sortie". (D'un certain point de vue, on pourrait appeler ce programme universel "système d'exploitation".) Mais pourquoi supposez-vous qu'un compilateur devrait être aussi efficace pour optimiser un programme aussi polyvalent que pour optimiser un logiciel plus spécialisé? programme? Les deux programmes ont des caractéristiques et des capacités différentes.
Si cela est fait pour relier deux langues, cela ressemble à un manque de bibliothèque d’interface.
Vous dites que comme si une bibliothèque d'interface universelle à un certain degré serait nécessairement une bonne chose. Peut-être que ce serait le cas, mais dans de nombreux cas, une telle bibliothèque serait volumineuse et difficile à écrire et à gérer, voire lente. Et si une telle bête n’existe pas en réalité pour résoudre le problème particulier qui se pose, alors qui souhaitez-vous qu’elle soit créée, quand une approche de génération de code peut résoudre le problème beaucoup plus rapidement et facilement?
Est-ce que j'ai râté quelque chose?
Plusieurs choses, je pense.
Je sais que ce code est aussi une donnée. Ce que je ne comprends pas, c'est pourquoi générer du code source? Pourquoi ne pas en faire une fonction capable d’accepter des paramètres et d’agir sur ceux-ci?
Les générateurs de code transforment le code écrit dans une langue en code dans une langue différente, généralement de niveau inférieur. Vous vous demandez alors pourquoi les gens voudraient écrire des programmes dans plusieurs langues et surtout pourquoi ils pourraient vouloir mélanger des langues de niveaux subjectivement différents.
Mais j'ai déjà abordé ce sujet. On choisit un langage pour une tâche particulière, basé en partie sur sa clarté et son expressivité pour cette tâche. Dans la mesure où le code plus petit contient en moyenne moins de bogues et est plus facile à gérer, il existe également un biais en faveur des langages de niveau supérieur, du moins pour les travaux à grande échelle. Cependant, un programme complexe implique de nombreuses tâches. Souvent, certaines d'entre elles peuvent être traitées plus efficacement dans une langue, alors que d'autres sont traitées de manière plus efficace ou plus concise dans une autre langue. Utiliser le bon outil pour le travail signifie parfois employer de la génération de code.