OS X'de LLVM ve clang karşılaştırması


133

OS X'de llvm, clang ve gcc ile ilgili bir sorum var.

Llvm-gcc 4.2, llvm 2.0 ve clang arasındaki fark nedir? Hepsinin llvm üzerine inşa edildiğini biliyorum ama nasıl farklılar?

Daha hızlı derlemenin yanı sıra, llvm'nin gcc'ye göre avantajı nedir?


9
llvm yalnızca bir arka uçtur, bağımsız bir llvm derleyicisi olamaz ... bunun için gcc ve clang gibi yalnızca farklı ön uçlar vardır.
smerlin

4
@smerlin: "llvm derleyici", Apple'ın clang + llvm ticari adıdır: developer.apple.com/technologies/tools/…
Stephen Canon

Diğer ayrıntılar burada: stackoverflow.com/a/26724886/1938163
Marco A.

Yanıtlar:


201

LLVM başlangıçta "düşük seviyeli sanal makine" anlamına geliyordu, ancak artık geleneksel bir sanal makineden başka bir şey haline geldiği için artık sadece kendisini temsil ediyor. Derleyiciler ve tam zamanında derleyiciler oluşturmaya yardımcı olmak için kullanılabilecek bir dizi kitaplık ve araç ile birlikte standartlaştırılmış bir ara sunumdur. Kendi ara temsilinden başka hiçbir şeyi kendi başına derleyemez; bunu yapmak için dile özgü bir ön uca ihtiyaç duyar. İnsanlar sadece LLVM'den bahsediyorlarsa, muhtemelen sadece düşük seviyeli kitaplık ve araçları kastediyorlar. Bazı kişiler Clang veya llvm-gcc'den yanlış bir şekilde "LLVM" olarak bahsedebilir ve bu da bazı karışıklıklara neden olabilir.

llvm-gcc, GCC'nin kendi arka ucu yerine LLVM'yi kullanan değiştirilmiş bir GCC sürümüdür. Artık, GCC'yi çatallamadan aynı şeyi yapmak için GCC'nin yeni eklenti sistemini kullanan DragonEgg lehine kullanımdan kaldırıldı.

Clang, kendi ön ucunu ve arka uç olarak LLVM'yi kullanan yepyeni bir C / C ++ / Objective-C derleyicisidir. Sağladığı avantajlar, daha iyi hata mesajları, daha hızlı derleme süresi ve diğer araçların derleme sürecine bağlanmasının daha kolay bir yoludur ( LLDB hata ayıklayıcı ve Clang statik analizörü gibi ). Aynı zamanda oldukça modülerdir ve bu nedenle C, C ++ veya Objective-C kodunu analiz etmesi gereken diğer yazılımlar için bir kitaplık olarak kullanılabilir.

Bu yaklaşımların her birinin (düz GCC, GCC + LLVM ve Clang) avantajları ve dezavantajları vardır. Gördüğüm son birkaç kıyaslama seti, LLVM ve Clang önemli ölçüde daha iyi derleme süreleri verirken, GCC'nin çoğu test durumunda biraz daha hızlı kod ürettiğini gösterdi (LLVM'nin birkaçında hafif bir üstünlüğü olsa da). GCC ve GCC / LLVM kombinasyonları, çok daha fazla kodun test edilmiş olması ve C'nin GCC çeşidinde çalışması avantajına sahiptir; Yalnızca GCC'nin sahip olduğu bazı derleyiciye özel uzantılar ve standardın uygulamanın değişmesine izin verdiği ancak kodun belirli bir uygulamaya bağlı olduğu bazı yerler vardır. Büyük miktarda eski C kodu alırsanız, GCC'de çalışacağından Clang'da çalışacağından çok daha olasıdır, ancak bu zamanla gelişmektedir.


13
Bu harika yanıta eklemek için: clang aynı zamanda kod analizi, otomatik tamamlama, sözdizimi vurgulama vb. Gibi şeyler için kullanabileceğiniz bir kitaplık kümesidir (libclang). Bu, IDE'ler için çok kullanışlıdır.

5
MacOS X veya iOS için derleme yaparken, Clang'ın, Apple'ın işletim sistemi dahil tüm MacOS X ve iOS yazılımlarını oluşturmak için kullandığı yazılım olduğunu ve Clang'ın otomatik olarak, çaba harcamadan ve herkesin yapacağı şey olduğunu düşünün. yardım istemek kullanıyor. Apple, gcc 4.2'den sonra gcc'yi hiçbir zaman desteklememiştir ve artık gcc'nin herhangi bir sürümünü göndermemektedir.
gnasher729

1
@ gnasher729 Evet, bu yanıt 3 yıl önce, Apple hala llvm-gcc ve Clang'ı gönderirken, varsayılan derleyici olarak llvm-gcc ile yazılmıştır. O zamandan beri devir değişti.
Brian Campbell

54

Burada 2 farklı şey var.

LLVM, üzerine derleyiciler oluşturmayı amaçlayan bir arka uç derleyicisidir. Hedef mimariye uyarlanmış kodun optimizasyonları ve üretimi ile ilgilenir.

CLang, C, C ++ ve Objective C kodunu ayrıştıran ve LLVM için uygun bir gösterime çeviren bir ön uçtur.

llvm gcc, gcc 4.2'ye dayalı llvm tabanlı C ++ derleyicisinin ilk sürümüydü ve CLang ayrıştırabildiği her şeyi ve daha fazlasını ayrıştırabildiği için artık kullanımdan kaldırıldı.

Son olarak, CLang ve gcc arasındaki temel fark, üretilen kodda değil, yaklaşımda yatmaktadır. Gcc monolitik olsa da, CLang bir kütüphane paketi olarak inşa edilmiştir. Bu modüler tasarım, örneğin IDE veya tamamlama araçları için harika yeniden kullanım fırsatları sağlar.

Şu anda, gcc 4.6 tarafından üretilen kod genellikle biraz daha hızlı, ancak CLang açığı kapatıyor.


5

llvm-gcc-4.2, kodunuzu ayrıştırmak için GCC ön ucunu kullanır, ardından LLVM kullanarak derlenmiş çıktıyı oluşturur.

"Llvm derleyici 2.0", kodunuzu ayrıştırmak için clang ön ucunu kullanır ve LLVM kullanarak derlenmiş çıktıyı üretir. "clang" aslında bu ön yüzün adıdır, ancak genellikle bir bütün olarak derleyicinin adı olarak gelişigüzel bir şekilde kullanılır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.