Pas një gjashtë muajsh zhvillimi, është publikuar lëshimi i projektit LLVM 21.1.0, që zhvillon mjetin e punës (kompajlerët, optimizuesit dhe gjeneratorët e kodit), i cili përkthehet në një kod ndërmjetës RISC-ngjashëm që përmban instrukcione virtuale (një makinë virtuale me një sistem shumë-niveli optimizimi). Kodi i gjeneruar mund të konvertohet në kod makine për një platformë të caktuar ose të përdoret nga kompajleri JIT për të formësuar instrukcione makine direkt gjatë ekzekutimit të programit. Në bazë të teknologjive LLVM, projekti zhvillon kompajlerin Clang, i cili mbështet gjuhët programuese C, C++ dhe Objective-C. Duke filluar nga dega 18.x, projekti ka kaluar në një skemë të re të emërtimit të versioneve, në përputhje me të cilën lëshimi zero ("N.0") përdoret në procesin e zhvillimit, dhe versioni i parë stabil është i shoqëruar me numrin "N.1".
Përmirësime në Clang 21:
- Mundësi të lidhura me C++:
- Si në GCC, është realizuar mundësia e përdorimit të shprehjeve konstante në pjesët asambleshës, të definuara nga direktiva "asm": int foo() { asm((std::string_view("nop")) ::: (std::string_view("memory"))); }
- Shtuar opcionet e zgjeruara për shprehjet "new" dhe "delete", që mbështesin argumentin "std::type_identity<T>", përmes të cilit mund të jepet informata në lidhje me tipin e objektit, për të cilin ndahet ose lirohet memoria.
- Shtuar mundësia e llogaritjes së funksioneve lambda, që kapin lidhjet e strukturuara (structured binding), në fazën e kompajlimit në kontekstin e shprehjes konstante.
- Mundësi të lidhura me standardin e ardhshëm C++2c (C++26):
- NĂ« lidhjet e strukturuara Ă«shtĂ« shtuar mundĂ«sia e pĂ«rdorimit tĂ« sintaksĂ«s «âŠÂ» pĂ«r treguesit (pack), qĂ« kapin numrin e mbetur tĂ« elementeve nga sekuenca e caktuar. auto [x,y,z] = f(); // nĂ« variablat x, y, z do tĂ« regjistrohen tre elemente, qĂ« kthehen nga f(). auto [âŠxs] = f(); // nĂ« paketĂ«n xs do tĂ« regjistrohen tĂ« gjitha elementet, qĂ« kthehen nga f(). auto [x, âŠrest] = f(); // NĂ« x do tĂ« regjistrohet elementi i parĂ«, ndĂ«rsa nĂ« rest â elementĂ«t e tjerĂ«. auto [x, y, âŠrest] = f(); // NĂ« x do tĂ« regjistrohet elementi i parĂ«, nĂ« y â i dyti, ndĂ«rsa nĂ« rest â i treti. auto [x, âŠrest, z] = f(); // nĂ« x â i pari, nĂ« rest â i dyti, nĂ« z â i treti.
- Shtohet mbështetje për "lëvizshmërinë triviale" të tipave (Trivial Relocatability), duke lejuar optimizimin e lëvizjeve të objekteve të këtij tipi përmes klonimit të tyre në memorie pa thirrjen e konstruktoreve ose destruktoreve. Për klasat janë zbatuar pronat memberwise_trivially_relocatable dhe memberwise_replaceable, dhe për lëvizjen në nivel të ulët të një ose disa objekteve janë shtuar funksionet trivially_relocate_at dhe trivially_relocate.
- Mundësia e aplikimit të lidhjes së strukturuar (structured binding) si kusht në operatorët if dhe switch.
- Mbështetje për lidhjen e funksionit main me modulin global dhe definimin e funksionit main në modula me emra.
- Mundësi të zhvilluara për standardin e ardhshëm C2y:
- Eliminimi i sjelljes së paqëndrueshme kur përdoren shprehje me tipin void në disa kontekste, për shembull, "(void)(void)1;".
- Lejohet që file me kodin burimor të mos përfundojë me simbolin e linjës së re.
- Shtuar prefiks tĂ« rinj pĂ«r literat octal â 0o dhe 0O, si dhe sekuencat e ikjes octal dhe hexadecimale "\o{âŠ}" dhe \x{âŠ}. MbĂ«shtetje pĂ«r literat octal 0xxx Ă«shtĂ« shpallur si e vjetruar. PĂ«r shembull, "0o123" dhe "\o{123}" nĂ« vend tĂ« "0123".
- Shtuar operatorin "_Countof" për të përcaktuar numrin e elementeve në një array. Gjithashtu shtuar skedari header stdcountof.h, që përcakton një variant të makros "countof", të realizuar përmes "_Countof".
- Mundësi të përcaktuar në standardin C23:
- Lejohet te ridëgjohet tag-ndypes (struct, union, enum) brenda një blloku translacioni, nëse përcaktimet e përsëritura janë strukturore që i përngjajnë (numri i antarëve, llojet dhe emrat e tag-ëve janë identike).
- Përdorimi i listave me numër të ndryshueshëm argumentesh (variadic) është thjeshtuar. Lejohet përdorimi i një parametri variativ të vetëm në emrin e tipit.
- Shtuar funksioni i integruar "__builtin_c23_va_start()", që përmirëson sjelljen e diagnostikimit për makron va_start() në modalitetin C23.
- Në modalitetin e pajtueshmërisë me kompajlerin MSVC lejohet përdorimi i specifikatorit inline kur shpallet tipi i funksionit përmes typedef, për shembull, "typedef int inline Foo(int);"
- Lejohet përdorimi i kualifikatorit "restrict" për tipet e array-ve me elemente tregues.
- Paralajmërimet e reja të kompajlerit:
- "-Wdefault-const-init-var" dhe "-Wdefault-const-init-field" â identifikimi i variablave dhe fushave tĂ« shĂ«nuara me const, qĂ« janĂ« pĂ«rcaktuar pa inicializim tĂ« qartĂ«.
- "-Wimplicit-void-ptr-cast" â shfaqet kur ka njĂ« konvertim tĂ« paqartĂ« nga tipin "void*" nĂ« njĂ« tip tjetĂ«r tregues.
- "-Wc++-keyword" â shfaqet kur pĂ«rdoren fjalĂ« kyçe "C++" si identifikues nĂ« "C".
- "-Wc++-hidden-decl" â identifikon pĂ«rdorimin e llojeve tĂ« tageve, qĂ« janĂ« tĂ« dukshme nĂ« "C", por nuk janĂ« tĂ« dukshme nĂ« "C++" pĂ«r shkak tĂ« kufizimit tĂ« fushĂ«s sĂ« dukshmĂ«risĂ«.
- "-Wimplicit-int-enum-cast" â identifikon konvertimet e paqarta nĂ« kodin C nga tipet e numrave nĂ« tipin enumeracion, qĂ« janĂ« tĂ« papajtueshĂ«m me "C++".
- "-Wtentative-definition-compat" â diagnostika e pĂ«rcaktimeve tĂ« pĂ«rkohshme nĂ« "C" me pĂ«rcaktime tĂ« shumta, qĂ« janĂ« tĂ« papajtueshme me "C++".
- "-Wunterminated-string-initialization" dhe "-Wc++-unterminated-string-initialization" â identifikimi i situatave tĂ« inicializimit nga njĂ« literale string, ku nuk mund tĂ« ruhet ndarĂ«si me kodin zero. PĂ«r tĂ« shĂ«nuar fushat dhe variablat nĂ« kodin C, qĂ« nuk kĂ«rkojnĂ« simbolin e fundit tĂ« zeros, Ă«shtĂ« shtuar atributi "nonstring".
- "-Wjump-misses-init" â diagnostika e kalimit pĂ«rmes goto ose switch/case, qĂ« anashkalon inicializimin e njĂ« variabli lokal.
- "-Wundef-true" â paralajmĂ«ron pĂ«r pĂ«rdorimin e vlerĂ«s "true" nĂ« preprocesorin C pa e definuar atĂ«.
- "-Wnrvo" â diagnostika e NRVO tĂ« munguar (Named Return Value Optimization).
- Flagjet e reja të kompajlerit:
- «-fprofile-continuous» â aktivizimi i sinkronizimit tĂ« vazhdueshĂ«m tĂ« profilit nĂ« skedarin.
- «-ftime-report-json» â dalja e tĂ« dhĂ«nave pĂ«r kohĂ«n e kompilimit nĂ« formatin JSON.
- «-ignore-pch» â çaktivizimi i titujve tĂ« parakomplikuar.
- «-fthinlto-distributor» dhe «-Xthinlto-distributor» â pĂ«r tĂ« aplikuar DTLTO (Integriteti i Distribuuar ThinLTO).
- «-static-libclosure» â pĂ«r lidhjen statike tĂ« zgjerimeve runtime Blocks nĂ« platformĂ«n Windows.
- Mjetet e diagnostikimit dhe analizës statike janë zgjeruar, duke shtuar kontrolle të reja (më shumë se njëqind përmirësime lidhur me diagnostikimin).
- Këto janë përmirësuar për arkitat ARM, Aarch64, AMDGPU, x86, RISC-V, LoongArch, MIPS dhe PowerPC. Në backendin për RISC-V është shtuar përkrahje eksperimentale për assembler për [[https://llvm.org/docs/RISCVUsage.html zgjerimet e Qualcomm uC, Andes dhe SiFive.
Burimi: opennet.ru
