web-dev-qa-db-fra.com

Comment le premier compilateur C ++ pourrait-il être écrit en C ++?

Stroustrup affirme que Cfront, le premier compilateur C++, a été écrit en C++ ( FAQ Stroustrup ).

Cependant, comment est-il même possible que le premier compilateur C++ soit écrit en C++?

Le code qui compose le compilateur doit également être compilé, et donc le premier compilateur C++ n'aurait pas pu être écrit en C++, n'est-ce pas?

48
Pacerier

La clé est ici:

Le premier compilateur C++ (Cfront) a été écrit en C++. Pour construire cela, j'ai d'abord utilisé C pour écrire un préprocesseur "C avec des classes" en C. "C with Classes" était un dialecte C qui est devenu l'ancêtre immédiat de C++. Ce préprocesseur a traduit les constructions "C avec des classes" (telles que les classes et les constructeurs) en C. Il s'agissait d'un préprocesseur traditionnel qui ne comprenait pas tout le langage, laissait l'essentiel du type vérifier le compilateur C à faire et traduisit individuellement construit sans connaissance complète. J'ai ensuite écrit la première version de Cfront en "C avec classes".

La première version de Cfront n'a donc pas été écrite en C++, plutôt en langage intermédiaire. La possibilité de créer des compilateurs C et des préprocesseurs directement en C a conduit à de nombreuses innovations (et trous de sécurité massifs ) en C. Donc, vous écrivez votre nouveau préprocesseur qui transforme votre code "C avec classes" en ligne droite C (car le C droit peut faire n'importe quoi), puis vous utilisez "C avec des classes" pour écrire un compilateur C++ (pas que vous ne pouviez pas le faire en C, cela prendrait un certain temps), puis vous utilisez ce compilateur C++ pour écrire un compilateur plus efficace/complet en C++. Je l'ai?

58
Christopher Bibbs

Il a été amorcé. Dès qu'une fonctionnalité C++ a été ajoutée à cfront, cfront peut également utiliser cette fonctionnalité à partir de ce moment (mais pas pour implémenter cette fonctionnalité). Cela a fonctionné car cfront avait la capacité de convertir du code C++ en code C. Donc, si une nouvelle plate-forme est sortie, vous pouvez utiliser cfront sur une autre plate-forme pour convertir cfront de C++ en C, puis utiliser le compilateur C de la nouvelle plate-forme pour terminer la compilation de C en code objet.

17
David Schwartz

Je pense que B.S. répond à cette question:

Le premier compilateur C++ (Cfront) a été écrit en C++. Pour construire cela, j'ai d'abord utilisé C pour écrire un préprocesseur "C avec des classes" en C. "C with Classes" était un dialecte C qui est devenu l'ancêtre immédiat de C++. Ce préprocesseur a traduit les constructions "C avec des classes" (telles que les classes et les constructeurs) en C. Il s'agissait d'un préprocesseur traditionnel qui ne comprenait pas tout le langage, laissait l'essentiel du type vérifier le compilateur C à faire et traduisit individuellement construit sans connaissance complète.

J'ai ensuite écrit la première version de Cfront en "C avec classes". Cfront était un compilateur traditionnel qui effectuait une vérification complète de la syntaxe et de la sémantique de la source C++. Pour cela, il avait un analyseur complet, construit des tables de symboles et construit une représentation complète de l'arborescence interne de chaque classe, fonction, etc. généré C, ne s'est appuyé sur C pour aucune vérification de type. Il a simplement utilisé C comme assembleur. Le code résultant était d'une rapidité sans compromis.

D'abord, il a créé quelque chose qu'il a appelé "C avec des classes" implémenté par un simple préprocesseur en C. C'était essentiellement du C++, mais le préprocesseur n'a fait que peu ou pas de vérification. Il l'a ensuite utilisé pour écrire Cfront, la version la plus puissante du traducteur de C++ en C, avec vérification de type, tables de symboles, etc.

9
Mike Dunlavey

J'ajouterai cette réponse car aucune réponse ne couvrait cet aspect.

Techniquement, vous n'avez pas besoin de logiciel pour compiler du code. Tant que vous disposez des spécifications de compilateur nécessaires, vous pouvez effectuer la compilation proprement dite manuellement. Ce n'est pas ainsi que le premier compilateur C++ a été compilé. Je dis juste que c'est possible.

Comparer avec le langage d'assemblage. Lorsqu'ils étaient utilisés au début, il n'existait aucun logiciel d'assemblage pour convertir le code d'assemblage en code machine. Cela a été fait à la main, mais le langage d'assemblage a donné aux programmeurs une meilleure vue d'ensemble.

2
klutt