2011-01-03 18 views
46

En el iOS SDK más reciente, Apple ofrece tres opciones de compilación: GCC, LLVM con Clang y LLVM-GCC. Entiendo más o menos lo que significan estos 3, qué son LLVM y Clang, y así sucesivamente. Lo que no sé es qué significa esto en la práctica para los desarrolladores de iPhone. ¿Cuál de estos debería usar en este momento, a partir de enero de 2011? ¿El LLVM es lo suficientemente maduro como para poder usarlo de forma segura sin tropezar con insectos con demasiada frecuencia? ¿Cambiar a LLVM tiene alguna otra desventaja? Si lo hace, ¿la ventaja de la velocidad los supera? ¿Hay alguna otra razón para cambiar excepto la velocidad?LLVM frente a GCC para el desarrollo de iOS

+0

+1 por Nice Pregunta. –

Respuesta

37

Actualización: Debido a que la gente todavía están encontrando esta respuesta, me siento como si debiera proporcionar una actualización adecuada. Por ahora, espero que esté claro que Clang es absolutamente el camino a seguir cuando se programa, con Clang siendo el compilador predeterminado en las versiones más nuevas de Xcode y soportando ARC y construcciones de lenguaje nuevas y futuras (matriz y subíndices de diccionarios, literales, etc.) . Ya casi no hay ninguna razón para compilar con GCC, y para las bases de código que usan ARC y nuevas características, usar GCC simple ya no es relevante o posible (LLVM-GCC puede admitir estas características, pero no proporciona ninguna ventaja sobre Clang ahora que Clang está completamente estable).


Por ahora (con LLVM-2,0 incluido en el beta Xcode 4.0), LLVM es lo suficientemente maduro para uso código de producción. Se compila un poco más rápido que GCC y produce código más rápido, así que úsalo siempre que puedas (más o menos, trata de evitar GCC si hay algo mejor disponible). La instalación estándar de Xcode 3.2.5 contiene LLVM-1.6 (no es la última), así que recomendaría ejecutar algunas pruebas de velocidad para ver si hay una diferencia notable entre GCC y LLVM, o compilar Clang desde el origen y obtener la última versión.

Básicamente, ya no hay necesidad de GCC, LLVM + Clang es más que suficiente.

+0

Entonces, si estoy ejecutando Xcode 3 y no quiero compilar desde el código fuente, ¿LLVM + GCC es la mejor opción? –

+1

No, simplemente quédate con LLVM-1.6 y estarás bien. De nuevo, no hay ninguna razón para usar GCC en absoluto, incluso si se combina con LLVM. –

+1

Aún no había llegado, he visto y he escuchado hablar de problemas importantes en el código generado por LLVM (tuvimos una falla en el envío de aplicaciones que solo se resolvió moviendo el compilador de GCC, por recomendación de Apple). Posiblemente un lanzamiento más y estará listo para el horario de máxima audiencia ... –

3

Durante la última versión de la WWDC10, se esforzaron por alentar a los desarrolladores a utilizar el compilador LLVM más actual. Olvidé el tratado exacto que lo cubrieron en detalle: uno de los "nuevos en Xcode". Básicamente sugieren usar LLVM-2.0 cuando sea posible, de lo contrario LLVM-GCC y evitar GCC solo por completo.

Si usted es un desarrollador registrado iOS, puede ver la mayor parte de las sesiones libres en http://developer.apple.com/videos/wwdc/2010/

+4

Sin embargo, resultó que después de eso, algunas personas (incluyéndome a mí) encontraron algunos errores realmente extraños de la compilación solo de LLVM. No a menudo, pero fue suficiente para volver a GCC para todas las presentaciones de la tienda de aplicaciones. Todavía uso LLVM para compilaciones de depuración. Creo que a principios de este año, LLVM probablemente será lo suficientemente estable como para usarlo para envíos. –

4

Otra razón importante para cambiar a Clang es más precisa (columna & rangos de números de línea) y mensajes de error legibles.

18

Ok, creo que ninguna de las respuestas a continuación cuentan toda la historia, así que aquí está mi opinión sobre una respuesta a mi pregunta:

  • LLVM compila el código más rápido que el CCG, puede crear código que se ejecuta más rápido, y la interfaz de Clang proporciona mensajes de error más precisos que GCC, por lo que definitivamente hay motivos para cambiar;

  • Dicho esto, la versión que se proporciona con el último Xcode estable (LLVM 1.6) no es 100% estable aún, puede tener algunos errores menores si no tiene suerte. Por lo tanto, si desea estar seguro, debe compilar el último LLVM (2.0) de la fuente o adherirse a GCC durante los próximos meses;

  • en unos meses, probablemente cuando Apple lanza Xcode 4, LLVM 2.0 será la versión que se envía con Xcode de forma predeterminada, y entonces todos deberíamos poder cambiar a ella de manera segura.

Gracias a todos los que respondieron, no dude en corregirme si tengo algo mal.

+0

Decir que LLVM genera código puede que funcione más rápido de lo que GCC simplemente es engañoso sin indicadores suficientes para los puntos de referencia generales del código. –

+0

Acabo de agregar una respuesta para reunir los diferentes puntos de vista y argumentos a favor y en contra de las otras respuestas: la parte sobre LLVM que produce código más rápido proviene de la respuesta de Itai Ferber anterior. Wikipedia también tiene alguna información: http://en.wikipedia.org/wiki/LLVM –

+1

LLVM puede compilar código rápidamente, pero no se garantiza que el código que se ejecuta más rápido. Sé con certeza que GCC puede ejecutar hasta más de 190 pases de compilación (incluidos los pases de optimización en front end y back end) para generar un ejecutable, que es una de las razones por las que GCC tarda tanto tiempo en compilar el código. –

9

Tengo una aplicación que parece bloquearse en el lanzamiento en el iPhone original que ejecuta iOS 3.1.3 cuando se compila con LLVM 2.0, pero funciona perfectamente con LLVM-GCC. Apoyo back to iOS 3.1 así que esto es fatal. No estoy seguro de si hay una interacción entre LLVM 2.0 y algún código específico que tengo, pero parece mejor evitar LLVM si necesita soportar iOS 3.x a menos que pueda probar a fondo en dispositivos heredados.


Actualización: Parece que el problema es con el hardware del dispositivo en lugar de la versión de iOS. Los dispositivos iOS de 1ª y 2ª generación parecen verse afectados: iPhone original, iPhone 3G y iPod touch de 1ª y 2ª generación. Creo que esto significa que está limitado a las arquitecturas ARMv6.

Además, ejecutar una compilación de depuración a través del depurador de Xcode funciona bien, mientras que las compilaciones de lanzamiento instaladas a través de iTunes no funcionan. Por lo tanto, podría tratarse de una interacción entre la arquitectura de la CPU y el nivel de optimización con LLVM 2.0.

Pero en cualquier caso, evite por ahora;)

+0

Tuvimos errores extraños al igual que este, ya sea en un iPhone de primera generación (3.1.2) y iPod touch de 2da generación (4.2.1). Tuve que volver a LLVM-GCC en Xcode 4.0.1 – nobre

+1

Sí, correlacionando otros informes de fallos, parece que estaba limitado a dispositivos con una CPU de primera generación: iPhone original, iPhone 3G y iPod Touch de 1ra y 2da generación . Si no me equivoco, creo que esto podría ser un problema con ARMv6 vs ARMv7.Otro dato interesante: ejecutar una compilación de depuración a través del depurador de Xcode funciona bien en todos los casos, solo es un problema cuando se instala una compilación de lanzamiento a través de iTunes; esto parece sugerir que tiene algo que ver con la optimización del código. –

+1

El problema no solo se produce en la versión de lanzamiento, sino que también se ocupa de la depuración con la optimización activada. Agregar GCC_THUMB_SUPPORT a su configuración de compilación y configurarlo en NO ayudará con este problema – iKiR

Cuestiones relacionadas