Les réponses précédentes donnent à peu près l'explication, bien que principalement d'un point de vue pragmatique, dans la mesure où la question a un sens , comme l'a parfaitement expliqué la réponse de Raphaël .
Ajoutant à cette réponse, il convient de noter que, de nos jours, les compilateurs C sont écrits en C. Bien sûr, comme le note Raphael, leur sortie et ses performances peuvent dépendre, entre autres choses, du processeur sur lequel il est exécuté. Mais cela dépend aussi de la quantité d'optimisation effectuée par le compilateur. Si vous écrivez en C un meilleur compilateur d'optimisation pour C (que vous compilez ensuite avec l'ancien pour pouvoir l'exécuter), vous obtenez un nouveau compilateur qui fait du C un langage plus rapide qu'auparavant. Alors, quelle est la vitesse de C? Notez que vous pouvez même compiler le nouveau compilateur avec lui-même, en tant que deuxième passe, afin de compiler plus efficacement, tout en fournissant le même code objet. Et le théorème du plein emploi montre qu’il n’ya pas de fin à de telles améliorations (merci à Raphaël pour le pointeur).
Mais je pense qu'il peut être intéressant d'essayer de formaliser la question, car elle illustre très bien certains concepts fondamentaux, notamment la vision dénotationnelle ou opérationnelle des choses.
Qu'est-ce qu'un compilateur?
Un compilateur , abrégé en s'il n'y a pas d'ambiguïté, est la réalisation d'une fonction calculable qui traduira un texte de programme calculant une fonction , écrit dans une langue source dans le texte du programme écrit dans une
langue cible , qui est censé calculer la même fonction .CS→TCCS→TP:SP SP:T TP
D'un point de vue sémantique, c'est-à-dire dénotant , peu importe comment cette fonction de compilation est calculée, c'est-à-dire quelle réalisation est choisie. Cela pourrait même être fait par un oracle magique. Mathématiquement, la fonction est simplement un ensemble de paires .CS→TCS→T{(P:S,P:T)∣PS∈S∧PT∈T}
La fonction de compilation sémantique est correct si les deux et calculent la même fonction . Mais cette formalisation s'applique également à un compilateur incorrect. Le seul point est que tout ce qui est mis en œuvre aboutit au même résultat indépendamment des moyens utilisés. Ce qui compte sémantiquement, c’est ce qui est fait par le compilateur, et non comment (et à quelle vitesse) cela est fait.CS→TPSPTP
Obtenir réellement de est un problème opérationnel , qui doit être résolu. C'est pourquoi la fonction de compilation doit être une fonction calculable. Alors, toute langue avec le pouvoir de Turing, peu importe sa lenteur, sera certainement en mesure de produire un code aussi efficace que toute autre langue, même si elle le fait moins efficacement.P:TP:SCS→T
En affinant l’argument, nous voulons probablement que le compilateur ait une bonne efficacité, afin que la traduction puisse être effectuée dans un délai raisonnable. La performance du programme de compilation est donc importante pour les utilisateurs, mais elle n’a aucun impact sur la sémantique. Je parle de performance, car la complexité théorique de certains compilateurs peut être bien supérieure à ce à quoi on pourrait s’attendre.
À propos de l'amorçage
Cela illustrera la distinction et montrera une application pratique.
Il est maintenant courant de commencer par implémenter un langage avec un interprète , puis d’écrire un compilateur dans le langage lui-même. Ce compilateur peut être exécuté avec l'interpréteur pour traduire tout programme en programme . Nous avons donc un compilateur en cours d’exécution du langage au langage (machine?) , mais il est très lent, ne serait-ce que parce qu’il s’appuie sur un interprète.I S C S → TSIS S C S → TCS→T:SS I S P : S P : T STCS→T:SISP:SP:TST
Mais vous pouvez utiliser cette fonction de compilation pour compiler le compilateur
, car il est écrit en langage , et vous obtenez ainsi un compilateur écrit en la langue cible . Si vous assumez, comme souvent le cas, que est une langue qui est plus efficacement interprété (natif de la machine, par exemple), vous obtenez une version plus rapide de votre compilateur directement dans le langage courant . Il fait exactement le même travail (c.-à-d. Produit les mêmes programmes cibles), mais le fait plus efficacement. S C S → TCS→T:SS TTTCS→T:TTTT