web-dev-qa-db-fra.com

LLVM vs GCC pour le développement iOS

Dans le dernier SDK iOS, Apple fournit trois options de compilation: GCC, LLVM avec Clang et LLVM-GCC. Je comprends plus ou moins ce que ces 3 signifient, ce que sont LLVM et Clang, et ainsi de suite. Ce que je ne sais pas, c'est ce que cela signifie dans la pratique pour les développeurs d'iPhone. Lequel de ceux-ci dois-je utiliser à ce stade, à partir de janvier 2011? Le LLVM est-il suffisamment mature pour que je puisse l'utiliser en toute sécurité sans tomber sur des bogues trop souvent? Le passage à LLVM présente-t-il d'autres inconvénients? Si tel est le cas, l'avantage en termes de vitesse les surpasse-t-il? Y a-t-il d'autres raisons de passer à la vitesse?

48
Kuba Suder

pdate: Parce que les gens trouvent toujours cette réponse, je pense que je devrais fournir une mise à jour appropriée. À présent, j'espère qu'il est clair que Clang est absolument la voie à suivre lors de la programmation, Clang étant le compilateur par défaut dans les nouvelles versions de Xcode et prenant en charge ARC et les constructions de langage nouvelles et à venir (tableau et index de dictionnaire, littéraux, etc.) . Il n'y a presque plus de raison de compiler avec GCC, et pour les bases de code utilisant ARC et de nouvelles fonctionnalités, l'utilisation de GCC standard n'est plus pertinente ou possible (LLVM-GCC peut prendre en charge ces fonctionnalités, mais il ne fournit aucun avantage sur Clang maintenant que Clang est complètement stable).


À l'heure actuelle (avec LLVM-2.0 inclus dans la version bêta de Xcode 4.0), LLVM est suffisamment mature pour l'utilisation du code de production. Il compile un peu plus rapidement que GCC et produit un code plus rapide, alors utilisez-le chaque fois que vous le pouvez (à peu près, essayez d'éviter GCC si quelque chose de mieux est disponible). L'installation standard de Xcode 3.2.5 contient LLVM-1.6 (pas la dernière), donc je recommanderais soit d'exécuter des tests de vitesse pour voir s'il y a une différence notable entre GCC et LLVM, soit de compiler Clang à partir de la source et d'obtenir la dernière version.

Essentiellement, il n'y a plus besoin de GCC, LLVM + Clang est plus que suffisant.

37
Itai Ferber

Ok, je pense qu'aucune des réponses ci-dessous ne raconte toute l'histoire, alors voici ma réponse à ma question:

  • LLVM compile le code plus rapidement que GCC, peut créer du code qui s'exécute plus rapidement, et l'interface frontale Clang fournit des messages d'erreur plus précis que GCC - il y a donc certainement des raisons de changer;

  • cela dit, la version fournie avec le dernier Xcode stable (LLVM 1.6) n'est pas encore 100% stable, vous pouvez rencontrer quelques bugs mineurs si vous n'avez pas de chance. Donc, si vous voulez être sûr, vous devez soit compiler le dernier LLVM (2.0) à partir de la source, soit vous en tenir à GCC pour les prochains mois;

  • dans quelques mois, probablement lorsque Apple publiera Xcode 4, LLVM 2.0 sera la version livrée avec Xcode par défaut, et nous devrions tous pouvoir y basculer en toute sécurité.

Merci à tous ceux qui ont répondu, n'hésitez pas à me corriger si je me trompe.

18
Kuba Suder

J'ai une application qui semble planter au lancement sur l'iPhone d'origine exécutant iOS 3.1.3 lorsqu'elle est compilée avec LLVM 2.0, mais fonctionne très bien avec LLVM-GCC. Je soutiens de nouveau à iOS 3.1 donc c'est fatal. Je ne sais pas s'il y a une interaction entre LLVM 2.0 et un code spécifique que j'ai, mais il semble préférable d'éviter LLVM si vous devez prendre en charge iOS 3.x, sauf si vous pouvez tester en profondeur sur les appareils hérités.


Mise à jour: Il semble que le problème soit lié au matériel de l'appareil plutôt qu'à la version iOS. Les appareils iOS de 1ère et 2ème génération semblent être affectés: iPhone d'origine, iPhone 3G et iPod Touch de 1ère et 2ème génération. Je pense que cela signifie qu'il est limité aux architectures ARMv6.

En outre, l'exécution d'une version de débogage via le débogueur de Xcode fonctionne correctement, contrairement aux versions de version installées via iTunes. Il peut donc s'agir d'une interaction entre l'architecture du processeur et le niveau d'optimisation avec LLVM 2.0.

Mais en tout cas, évitez pour l'instant;)

9
Daniel Dickison

Une autre raison majeure de passer à Clang est des messages d'erreur plus précis (plages de numéros de colonne et de ligne) et lisibles.

4
Nicholas Riley

Lors de la dernière WWDC10, ils ont tenu à encourager les développeurs à utiliser le compilateur LLVM le plus récent. J'oublie le tract exact qu'ils ont couvert en détail - l'un des "nouveaux dans Xcode". Fondamentalement, ils suggèrent d'utiliser LLVM-2.0 lorsque cela est possible, sinon LLVM-GCC et d'éviter complètement GCC seul.

Si vous êtes un développeur iOS enregistré, vous pouvez voir la plupart des sessions gratuitement sur http://developer.Apple.com/videos/wwdc/2010/

3
Paul Alexander