Outre toutes les raisons liées à la qualité du générateur de code, il existe d'autres problèmes :
- Les compilateurs C libres (gcc, clang) sont un peu centrés sur Unix.
- La prise en charge de plusieurs compilateurs (par exemple, gcc sous Unix et MSVC sous Windows) nécessite une duplication des efforts.
- Les compilateurs peuvent intégrer des bibliothèques d'exécution (ou même des émulations *nix) sous Windows qui sont douloureuses. Deux runtimes C différents (par exemple linux libc et msvcrt) sur lesquels se baser compliquent votre propre runtime et sa maintenance.
- Vous obtenez un gros blob de versions externes dans votre projet, ce qui signifie qu'une transition de version majeure (par exemple, un changement de mangulation pourrait nuire à votre bibliothèque d'exécution, des changements d'ABI comme un changement d'alignement) pourrait nécessiter un certain travail. Notez que cela s'applique au compilateur ET à la bibliothèque d'exécution versionnée en externe (parties de la bibliothèque d'exécution). Et les compilateurs multiples multiplient ce phénomène. Ce n'est pas si grave pour le C en tant que backend car dans le cas où vous vous connectez directement à (lire : pariez sur) un backend, comme être un frontend gcc/llvm.
- Dans de nombreuses langues qui suivent cette voie, on voit les cismes s'infiltrer dans la langue principale. Bien sûr, vous n'y trouverez pas votre compte, mais vous pouvez vous en passer. se se laisser tenter :-)
- Fonctionnalité du langage qui ne correspond pas directement au langage C standard (comme les procédures imbriquées), et d'autres choses qui nécessitent une manipulation de la pile) sont difficiles.
- En cas de problème, les utilisateurs seront confrontés à des erreurs de compilateur ou d'éditeur de liens au niveau C qui sortent de leur champ d'expérience. Les analyser et se les approprier est pénible, surtout avec de multiples compilateurs et versions.
Notez que le point 4 signifie également que vous devrez investir du temps pour que les choses continuent à fonctionner lorsque les projets externes évolueront. C'est du temps qui n'est généralement pas consacré à votre projet, et comme le projet est plus dynamique, les versions multiplateformes nécessiteront beaucoup d'ingénierie de version supplémentaire pour tenir compte des changements.
En bref, d'après ce que j'ai vu, bien qu'une telle démarche permette un démarrage rapide (obtenir un générateur de code raisonnable gratuitement pour de nombreuses architectures), il y a des inconvénients. La plupart d'entre eux sont liés à la perte de contrôle et au mauvais support Windows de projets centrés sur *nix comme gcc (LLVM est trop récent pour en dire plus sur le long terme, mais leur rhétorique ressemble beaucoup à celle de gcc il y a dix ans). Si un projet dont vous dépendez fortement garde une certaine orientation (comme GCC qui passe à win64 terriblement lentement), alors vous êtes coincé avec lui.
Tout d'abord, décidez si vous voulez un support sérieux pour les systèmes non *nix (OS X étant plus unixy), ou seulement un compilateur Linux avec un palliatif mingw pour Windows ? Beaucoup de compilateurs ont besoin d'un support Windows de premier ordre.
Deuxièmement, quel doit être le degré de finition du produit ? Quel est le public visé ? S'agit-il d'un outil pour le développeur open source qui peut gérer une chaîne d'outils de bricolage, ou voulez-vous cibler un marché de débutants (comme de nombreux produits tiers, par exemple RealBasic) ?
Ou voulez-vous vraiment fournir un produit complet pour les professionnels avec une intégration profonde et des chaînes d'outils complètes ?
Ces trois orientations sont valables pour un projet de compilateur. Demandez-vous quelle est votre orientation principale, et ne supposez pas que d'autres options seront disponibles avec le temps. Par exemple, évaluez où en sont les projets qui ont choisi d'être un frontend GCC au début des années quatre-vingt-dix.
Essentiellement, la méthode Unix consiste à élargir le champ d'application (maximiser les plates-formes).
Les suites complètes (comme VS et Delphi, ce dernier ayant récemment commencé à prendre en charge OS X et ayant pris en charge Linux dans le passé) vont en profondeur et tentent de maximiser la productivité. Les suites complètes (comme VS et Delphi, qui ont récemment commencé à supporter OS X et ont supporté linux dans le passé) vont en profondeur et tentent de maximiser la productivité.
Les projets de tiers sont moins clairs. Ils s'adressent davantage aux programmeurs indépendants et aux boutiques de niche. Ils disposent de moins de ressources en matière de développement, mais les gèrent et les concentrent mieux.
4 votes
L'une des réponses est que C ne peut pas vous donner un accès direct aux ressources clés de la machine. Essayez de manipuler le pointeur de pile en C vanille.
10 votes
Je ne suis pas d'accord pour clore cette question. Il y a des arguments clairs contre la compilation en C, mais je ne peux pas les donner maintenant.
0 votes
GCC est LE pire compilateur connu de l'humanité.