Aujourd'hui, vous avez besoin d' un compilateur C réel pour être un compilateur d'optimisation , notamment parce que C n'est plus une langue proche du matériel, car actuels processeurs sont complexes incroyablement ( hors-ordre , pipelinée , superscalaire , avec complexes caches et TLB , donc besoin d’ ordonnancement des instructions , etc ...). Les processeurs x86 actuels ne ressemblent pas aux processeurs i386 du siècle précédent, même s'ils sont capables d'exécuter le même code machine. Voir que le C n'est pas un langage de bas niveau (votre ordinateur n'est pas un PDP-11 rapide), article de David Chisnall.
Peu de gens utilisent des compilateurs C naïfs, non optimiseurs, tels que tinycc ou nwcc , car ils produisent un code plusieurs fois plus lent que ce que les compilateurs optimiseurs peuvent générer.
Coder un compilateur d'optimisation est difficile. Notez que GCC et Clang optimisent tous deux la représentation de code "neutre par rapport au langage source" (Gimple pour GCC, LLVM pour Clang). La complexité d'un bon compilateur C n'est pas en phase d'analyse!
En particulier, créer un compilateur C ++ n’est pas beaucoup plus difficile que de faire un compilateur C: analyser C ++ et le transformer en représentation de code interne est complexe (car la spécification C ++ est complexe), mais il est bien compris, mais les éléments d’optimisation sont encore plus complexes. complexe (à l’intérieur de GCC: les optimisations moyennes, neutres en langage source et en processeur cible, constituent le composant principal du compilateur, le reste étant équilibré entre des interfaces pour plusieurs langues et des interfaces pour plusieurs processeurs). Par conséquent, la plupart des compilateurs C optimiseurs sont également capables de compiler d'autres langages, tels que C ++, Fortran, D, ... Les parties spécifiques à C ++ de GCC représentent environ 20% du compilateur ...
De plus, C (ou C ++) est si largement utilisé que les utilisateurs s'attendent à ce que leur code soit compilable même s'il ne suit pas exactement les normes officielles, qui ne définissent pas assez précisément la sémantique du langage (chaque compilateur peut donc avoir sa propre interprétation). de celui-ci). Regardez aussi dans le compilateur C prouvé CompCert , et l' analyseur statique Frama-C , qui se soucient de la sémantique plus formelle de C.
Et les optimisations sont un phénomène de longue haleine : il est facile d'implémenter quelques optimisations simples, mais elles ne rendront pas un compilateur compétitif! Vous devez implémenter de nombreuses optimisations, et les organiser et les combiner intelligemment, pour obtenir un compilateur réel compétitif. En d'autres termes, un compilateur d'optimisation réel doit être un logiciel complexe. BTW, GCC et Clang / LLVM disposent de plusieurs générateurs de code C / C ++ spécialisés internes. Et les deux sont de grosses bêtes (plusieurs millions de lignes de code source, avec un taux de croissance de plusieurs pour cent par an) avec une importante communauté de développeurs (quelques centaines de personnes travaillant principalement à temps plein ou au moins à mi-temps).
Notez qu’il n’existe pas (à ma connaissance) de compilateur C multithreads, même si certaines parties d’un compilateur pourraient être exécutées en parallèle (par exemple, optimisation intra-procédurale, allocation de registre, ordonnancement des instructions, etc.). Et construire en parallèle avec make -j
n'est pas toujours suffisant (surtout avec LTO ).
En outre, il est difficile d’obtenir des fonds pour coder un compilateur C à partir de rien, et cet effort doit durer plusieurs années. Enfin, la plupart des compilateurs C ou C ++ sont aujourd'hui des logiciels libres (il n'y a plus de marché pour les nouveaux compilateurs propriétaires vendus par les startups) ou du moins sont des produits monopolistiques (comme Microsoft Visual C ++ ), et être un logiciel libre est presque indispensable pour les compilateurs ( car ils ont besoin des contributions de nombreuses organisations différentes).
Je serais ravi d'obtenir des fonds pour travailler sur un compilateur C à partir de rien en tant que logiciel libre, mais je ne suis pas assez naïf pour croire que c'est possible aujourd'hui!