Dev Compiler Geliştirme Aracı : CLANG/LLVM

Başlatan Erol YILMAZ, 09 Temmuz 2022, 22:09:21

Erol YILMAZ



CLANG/LLVM ile birlikte GCC'ye alternatif derleyici oluşturma araçları sunuyor.




CLANG/LLVM Apple tarafından çıkarılmasa da öncü kod geliştiricilerini işe alarak yapının oluşturulmasını sağlamış.

Microsoft, Apple, ARM, Segger, Microchip (XC8) gibi firmalar son zamanlarda
derleyicilerini CLANG/LLVM ile değiştirmeye başladı.





Clang'ın önemli birkaç özelliği;

Derleme sırasında kullanılan herşeyin konumunu kaydederek son derece net ve ayrıntılı hata mesajları üretebilmesi,
IDE ile daha kolay entegre olabilmesi
Lisans anlaşmasının ürünü açık kaynak kodlu olmaya zorlamamasıdır.

https://docs.microsoft.com/tr-tr/cpp/build/clang-support-msbuild?view=msvc-170

https://www.keil.com/appnotes/files/apnt_298.pdf

https://www.segger.com/news/embedded-studio-gcc-llvm-iar-and-keil-under-one-roof/

https://microchipdeveloper.com/xc8:moving-to-xc8-2-0

https://training.ti.com/webinar-introduction-ti-arm-clang-compiler?keyMatch=CLANG

Tagli

Yanlış anlamadıysam, üreticiler LLVM'ye geçerek kendi derleyicilerine özgü bazı ifadelerden ve yöntemlerden de kurtuluyorlar. Aslında bu konuda kesin bir standart yok, ancak piyasadaki baskın derleyici olan GCC'nin syntax'ına insanlar alışık ve clang/LLVM de buna uyum sağlamış. GCC ve clang birbirleri ile büyük ölçüde uyumlu. clang'in popülerliği gittikçe artıyor ve gelecekte GCC'yi geçebilir. Anlaşılan diğer derleyici üreticileri de bu ikilinin yörüngesine girecek gibi.
Gökçe Tağlıoğlu

Erol YILMAZ

#2
Evet arkadaşlar,

KEIL IDE v5.32 üzerinde her 2 derleyiciyi de seçerek kullanabiliyoruz.
Bugün STM32 Cortex M0 için aynı projeyi derleyerek değerlendirme şansım oldu.

v5.06 (orjinal ARM C Compiler)
Kod Boyutu: 15.3 Kbyte
Derleme Süresi: 6sn



v6.14.1 (Clang/LLVM C Compiler)
Kod Boyutu: 12.3 Kbyte
Derleme Süresi: 2sn


IDE'de derleyici olarak v6.14.1'e geçince Keil C Compiler'a özgü bir #pragma direktifini devre dışı bırakmam gerekti.
Bunun dışında hiçbir problem olmadan derlendi.

Görüldüğü üzere Kod Boyutu ve Derleme Süresi açısından Clang/LLVM derleyicisi bariz başarılı.

Erol YILMAZ

Önemli bir diğer özelliğe gelelim.

O da derleme zamanı tespit edilebilecek bir kod hatasına istinaden çıkartılan WARNING ve ERROR mesajlarının insancıllık seviyesi.

Gömülü kod geliştirme zaten zor bir konu...
Üzerine sanki dünyadaki bütün günahları işlemiş gibi çıkartılan WARNING ve ERROR mesajları da bizi ayrıca endişe ve kaygıya sürüklemektedir.

Bu sebeple derleyiciden, az da olsa gelecek sıcak bir mesaja muhtaç olduğunuzu görüyorum arkadaşlar:)

Yukarıdaki mesajda denediğim kodda bilinçli olarak if(xx) {yy} gibi bir ifadeden kırmızı-yaylı parantezi kaldırdım.

CLANG v6.14.1   (2 Error 1 Warning)

ARMCC v5.06     (7 Error 9 Warning) verdi.

esensoy

nasıl ekliyoruz bunu var olan keil e acaba?
En tehlikeli an "zafer" anıdır.

esensoy

Alıntı yapılan: esensoy - 11 Temmuz 2022, 09:47:03nasıl ekliyoruz bunu var olan keil e acaba?
Baktım bendeki 5.23 müş, 5.32 yükleyince gelecek sanırım
En tehlikeli an "zafer" anıdır.

kralsam

Alıntı yapılan: Tagli - 10 Temmuz 2022, 09:40:20Yanlış anlamadıysam, üreticiler LLVM'ye geçerek kendi derleyicilerine özgü bazı ifadelerden ve yöntemlerden de kurtuluyorlar. Aslında bu konuda kesin bir standart yok, ancak piyasadaki baskın derleyici olan GCC'nin syntax'ına insanlar alışık ve clang/LLVM de buna uyum sağlamış. GCC ve clang birbirleri ile büyük ölçüde uyumlu. clang'in popülerliği gittikçe artıyor ve gelecekte GCC'yi geçebilir. Anlaşılan diğer derleyici üreticileri de bu ikilinin yörüngesine girecek gibi.
Bu durumda derleyiciler de ücretli hale dönüş yapabilir gibi görünüyor.

Erol YILMAZ

#7
Alıntı yapılan: esensoy - 11 Temmuz 2022, 09:47:03nasıl ekliyoruz bunu var olan keil e acaba?




Alıntı yapılan: kralsam - 11 Temmuz 2022, 10:40:53Bu durumda derleyiciler de ücretli hale dönüş yapabilir gibi görünüyor.

CLANG/LLVM ücretsiz bu arada...
Açık kaynak kodlu.

kralsam

Açık kaynak olmaya zorlamaması bir avantaj olarak söyleyince düşündüm.

Bir kaç sorum olacak. Genelde versiyon atlarken bile çok gerilirim. Komple compiler değiştirmek daha radikal bir karar. Daha önce versiyon atlattım diye optimizasyon yüzünden bir kaç kez çalışan uygulamanın çalışmadığı olmuştu. En bariz örneği bir bootloader yazmıştım ama çalışan kod bir türlü çalışmıyordu. Sonra asm koddan problemi anlamıştık.

Özetle detaylı deneme yapma şansınız oldu mu eski projelerinizi ?

Erol YILMAZ

Öncelikle,
Compiler üreten büyük firmaların dahi bu kadar rahat Compiler değiştirip hep beraber LLVM'ye geçebildiğini düşününce LLVM'nin güvenilir ve sağlam olduğu önyargısını oluşturdu bende.

İkinci olarak sorunuza gelirsek,
Tasarımınızda, kodunuzun işleme zamanına bağlı işlemler var ve bunlar Compiler veya Optimizasyon seviyesi değiştiğinde değişiyor ise uygulamada da birşeylerin değişebileceği gayet aşikar.

Bu sebeple sadece Compiler değiştiğinde değil optimizasyon seviyesini değiştirdiğimizde bile fonksiyon testlerimizi tekrarlamalıyız.

Tagli

"Compiler backend" tam olarak ne anlama geliyor, bilen biri kısaca açıklayabilir mi? Bildiğim kadarıyla LLVM tek başına bir derleyici değil, bir "compiler backend". clang ise arka planda LLVM kullanan bir derleyici. Emin değilim ama anladığım kadarıyla Keil doğrudan clang'e geçmemiş, kendi derleyicisinde backend olarak LLVM kullanmaya başlamış. Doğru mu anlamışım?
Gökçe Tağlıoğlu

Yuunus

madem en son cikan optimization secenegi en verimli hex kodunu uretiyor, yada ben yanlis dusunuyorum, o zaman neden hala onceki opt secenekleri yeni cikan idelerde bile hala bir secenek olarak sunuluyor onu anlamiyorum.

Tagli

Yüksek seviye optimizasyon debug işlemini zorlaştırır. Duruma göre derleme süresini de uzatabilir. Ayrıca yazılımcılar bazen derleme işleminin ayrıntılarına tam olarak hakim olmak isterler. Standart -O1 gibi toplu seçeneklerin dışında, bazı ayarlar tek tek (bağımsız) olarak da değiştirilebilir. Örneğin -fno-strict-aliasing ayarı gibi.
Gökçe Tağlıoğlu

Erol YILMAZ

#13
Tagli hocam anladığım kadarı ile olay şu şekilde dönüyor.

LLVM (Back End), Compiler altyapısı olup farklı işlemciler için yürütülecek kodu üretir.

Yalnız LLVM direkt olarak C kodunu kullanamaz.

Programlama dilleri çok çeşitli olduğundan; kaynak kodların (C, C++, Ruby, Java, Ada, Basic vs vs...)
öncelikle parse edilip, hatası varsa uyarı mesajı çıkarılmış, optimize edilmiş şekilde ara bir forma dönüştürülmesi gerekmektedir.

LLVM, böylece hangi dilden geldiği önemli olmayan bu ara form kodu alıp hedeflenen işlemci için kodu üretir.

(Kaynak Kod) -> FRONT END(clang) -> (Ara form Kod) -> LLVM -> (Hex kod)

LLVM'ye C türevlerini kaynak verip, kod ürettireceksek öncesinde CLANG kullanmalıyız.

C Language: K&R C, ANSI C89, ISO C90, ISO C94 (C89+AMD1), ISO C99 (+TC1, TC2, TC3).
Objective-C Language: ObjC 1, ObjC 2, ObjC 2.1, plus variants depending on base language.
C++ Language
Objective C++ Language
OpenCL Kernel Language: OpenCL C 1.0, 1.1, 1.2, 2.0, 3.0, and C++ for OpenCL 1.0 and 2021.


Farklı bir programlama dili olarak ADA veya FORTRAN kullanacak isek,"DragonEgg" front end'i kullanmalıymışız.

Ayrıca, Swift(Front End) + LLVM(Back End) Cortex M çıktısı ile
ARM için Swift Derleyici gibi çok ilginç senaryolar mümkün görünüyor...

https://dspace.cvut.cz/bitstream/handle/10467/82498/F8-DP-2019-Dragomirecky-Alan-thesis.pdf


engerex

Mikroe'nin c/basic/pascal derleyicisi mevcut. Yakında Python da ekliyor. Anladığım kadarıyla hangi dilde kodlarsan kodla önce kendine özgü bir dile sonra asm ve hexe döndürüyor. Böylece istediği kadar dili yapıya entegre edebiliyor.