Pourquoi le clang n’est plus utilisé?

J’ai déjà fait beaucoup de programmation en C / C ++, mais aujourd’hui, cela ne représente qu’un faible pourcentage de la programmation que je fais (les langages de script sont bien mieux adaptés à beaucoup de mes tâches). J’ai travaillé sur des projets de programmation en C au cours des derniers jours et j’ai été surpris du nombre de petits détails syntaxiques que je n’oubliai pas. Ce qui est pire, c’est que cc / gcc avait généralement des messages d’erreur cryptiques ou non informatifs sur ces problèmes (désolé, je ne me souviens pas d’exemples spécifiques).

J’ai appris le compilateur de clang n’y a pas si longtemps et j’ai décidé de l’essayer. Les messages d’erreur étaient beaucoup plus clairs et m’ont aidé à identifier et à résoudre les problèmes dans ma syntaxe. Ma question est pourquoi cet outil n’est pas utilisé / mentionné plus qu’il ne l’est? Est-ce que c’est si nouveau comparé aux suspects habituels ( cc / gcc ), ou est-ce qu’il ne supporte pas les fonctionnalités qu’ils supportent, ou est-ce juste plus difficile à obtenir? J’ai du mal à croire ce dernier, car il a été installé avec les outils de développement sur mon iMac et nécessitait une seule commande ( sudo apt-get install clang ) à installer sur ma boîte Ubuntu.

Ma question est pourquoi cet outil n’est pas utilisé / mentionné plus qu’il ne l’est?

C’est probablement à cause de l’histoire et parce que les humains se comportent généralement de la même façon.

Traditionnellement, gcc est le seul compilateur réel (gratuit) qui peut être utilisé pratiquement pour comstackr des programmes C sur au moins tous les clones nix gratuits disponibles. C’est ce avec quoi pratiquement tout le système de base et le kernel de Linux, * BSD, maintenant probablement OSX, et d’autres sont compilés.

Bien que les défauts soient ici et là, cela signifie essentiellement que gcc fonctionne . Et si ce n’est pas cassé, ne le répare pas. En dehors de cela, vous avez maintenant une énorme base d’utilisateurs, il est facile d’obtenir de l’aide avec gcc, il y a beaucoup de gens qui ont utilisé gcc, qui travaillent sur gcc lui-même, etc.

Généralement, si vous voulez faire passer une énorme communauté de quelque chose d’habitude à quelque chose d’autre, il faut que «quelque chose d’autre» soit nettement «meilleur». des exemples de cela dans de nombreux domaines de la société.

clang est plus récent, certaines personnes vont simplement se méfier si elles sont à la hauteur, si elles ont des bugs, si le code produit plus lentement, etc. – il semble être humain de se méfier – de nouvelles choses font peur. Beaucoup ne connaissent même pas le clang, beaucoup ne s’en soucient pas parce qu’ils sont contents de gcc.

Bien que, si vous préférez utiliser le clang, allez-y – les messages d’erreur sont en effet “meilleurs” et plus faciles à comprendre par rapport à gcc.

Le front de clang est relativement nouveau. Par exemple, la version 2.8 d’octobre 2010 marque la fin de la prise en charge de C ++ 98/03.

Il semble probable qu’avec une maturité croissante, il y aura une adoption croissante. Par exemple, des travaux sont en cours pour rendre le système d’exploitation FreeBSD (et les autres systèmes d’exploitation BSD) construit avec clang, éliminant ainsi la dépendance à GCC / G ++.

Apple pousse la combinaison LLVM / clang. Il semble probable qu’ils cesseront de prendre en charge leur ancienne twig de chaîne d’outils GCC (basée sur 4.2) et dépendront uniquement des outils de clang pour le développement OSX / iOS.

Clang constate également une adoption croissante dans les compilateurs personnalisés pour les langages de type C (par exemple, les compilateurs de langage de shader pour OpenCL)

LLVM a été autour pendant un certain temps, mais – au moins dans mon coin de pays – il n’a pris de l’importance que très récemment, probablement en raison du fait que Apple a poussé récemment pour remplacer gcc avec Clang dans leur propre outil -chaîne.

De plus, je pense que le support C ++ n’est que récemment devenu de qualité de production. EDIT: Il semble que ce n’est même pas encore. (Voir les commentaires ci-dessous.)

Un autre facteur pourrait être que LLVM est largement soutenu par un fournisseur unique, vers lequel les développeurs non-Apple ont une méfiance innée.

Ma question est pourquoi cet outil n’est pas utilisé / mentionné plus qu’il ne l’est? Est-ce que c’est tellement nouveau par rapport aux suspects habituels…

C’est exactement la raison. Il est encore nouveau et les fonctionnalités de base sont toujours en cours de développement. Rappelez-vous que les projets existants peuvent utiliser des fonctionnalités spécifiques au compilateur – ou utiliser des bibliothèques qui le font – et les développeurs répugnent en tout cas à modifier les outils de travail pour les expérimentaux ayant des bogues inattendus ou des performances / tailles inconnues. compromis, même lorsque les nouveaux outils s’améliorent de plus en plus chaque jour.

En tant qu’élève programmeur, je trouve que c’est une aubaine totale en raison de ses messages d’erreur utiles et compréhensibles. Je l’utilise principalement pour la programmation en C, bien que je commence à évoluer en C ++ avec Clang.

Quant à savoir pourquoi il n’est pas mentionné plus, je suppose que c’est depuis que GCC est établi depuis si longtemps, pour la plupart des utilisateurs, il s’agit du compilateur. GCC pour moi fonctionne très bien, sauf pour les messages d’erreur extrêmement cryptiques qui, en tant qu’étudiant, me jettent pas mal.

Dans l’ensemble, je recommande fortement Clang pour une utilisation par les étudiants et les développeurs. Comme il s’agit maintenant du compilateur officiel d’Apple et de Xcode, j’imagine que son utilisation et la reconnaissance de son nom seront rapidement sockets en compte. FreeBSD semble l’avoir également adopté comme leur compilateur principal, mais je pense que cela aura moins d’impact sur sa popularité que son adoption par Apple.

Addendum: en raison de la concurrence de Clang, la clarté des messages d’erreur dans les pays du GCC 4.8 et 4.9 a montré une amélioration significative; Bien que je trouve toujours Clang un peu plus lucide, l’écart s’est toutefois considérablement réduit.

Aujourd’hui, clang remplace gcc dans la plupart des endroits . c’est-à-dire la plupart des systèmes d’exploitation et des dissortingbutions Linux de type NIX *. Quelques exemples montrent FreeBSD, Minix et mac (un peu évident) clang qui a basculé en tant que compilateur par défaut. Certains de mes amis aussi, quand je leur ai montré.

Cet IMHO, on dirait que certains peuples ont eu des problèmes avec, probablement dans les anciennes versions. Mais avec la version 3.0 de Clang, je n’ai aucun de ces problèmes. Comme je l’ai mentionné précédemment, je l’utilise vraiment dans tous mes nouveaux projets. Presque mon compilateur par défaut, parfois je fais make C=gcc juste pour voir comment la différence entre erreur / avertissement clang. Et clang gagner jamais. Avec de meilleures explications et faire un grand effort d’optimisation. Il inclut des suggestions pour les extensions d’utilisation (certaines sont gcc inerhid) du compilateur pour une meilleure performance dans la génération de code.

J’avais écrit une fonction sortingviale qui imprime un message d’erreur. Mais je voudrais quitter le programme après avoir imprimé le message d’erreur sur la sortie standard. Donc, je fais une modification simple, placez une exit(1) comme dernière instruction dans la fonction. Comme suit:

 void error(const char *fmt, ...) { va_list ap; va_start(ap, fmt); fprintf(stderr, "error: "); vfprintf(stderr, fmt, ap); va_end(ap); exit(1); } 

Et donc le spectacle de clang

avertissement: la fonction ‘error’ pourrait être déclarée avec l’atsortingbut ‘noreturn’ [-Wmissing-noreturn] `

(gcc ne le produit pas même avec l’ -Wall -Wextra -Wunreachable-code -O3 )

Je dis “ça a l’air gentil. Mais qu’est-ce qu’un atsortingbut” non-retour “? Je n’écouterais jamais ou clang could be declared with atsortingbute 'noreturn' à ce sujet. Je saute sur google et la recherche de clang could be declared with atsortingbute 'noreturn' clang nonreturn atsortingbute , mais oubliez-le) et j’ai trouvé this lien avec une bonne explication de ce que cet atsortingbut et le gain de performance possible que je pourrais obtenir.

Donc, je cours pour append cet atsortingbut à mon prototype de fonction (bien sûr, s’il s’agit du compilateur gcc ou clang, les macros feront la détection des trucs). Oh oui, pour moi, un petit gain de performance (bien sûr, sans rendre le code illisible), c’est une victoire.

Et ne termine pas ici, il y a un an, je fais un return dans une fonction où le provument est un switch comme traitement par défaut défini (comme dans la fonction error() ici). Mais même si, gcc clains à propos de la fonction sans valeur de retour (je suis désolé, je ne me souviens pas exactement du message d’erreur / d’avertissement) comment cela est-il possible? il n’y a plus d’instructions après le changement, s’il n’y a pas de correspondance de cas, la valeur par défaut est exécutée et les déclarations ci-dessous ne sont pas vraiment importantes. Mais clang pense différemment, comme moi, et donne un avertissement à propos de cette déclaration, en m’aidant à faire un meilleur code.

Et pour ce genre de chose très petite, j’adore le clang. (Note: je suis désolé pour mon mauvais anglais. L’anglais n’est pas mon interlocuteur en langue maternelle, mais malgré cela j’essaie de m’exprimer ici)