Na ses maande van ontwikkeling word die LLVM 21.1.0-projekvrystelling aangebied. Dit ontwikkel gereedskap (samestellers, optimiseerders en kodegenerators) wat programme in intermediêre bitkode van RISC-agtige virtuele instruksies (laevlak virtuele masjien met 'n multivlak-optimaliseringstelsel) saamstel. Die gegenereerde pseudokode kan omgeskakel word na masjienkode vir 'n gegewe teikenplatform of deur 'n JIT-samesteller gebruik word om masjieninstruksies direk tydens programuitvoering te vorm. Gebaseer op LLVM-tegnologieë, ontwikkel die projek die Clang-samesteller, wat die C-, C++- en Objective-C-programmeertale ondersteun. Beginnende met die 18.x-tak, het die projek oorgeskakel na 'n nuwe weergawenommergenereringskema, waarvolgens die nul-vrystelling ("N.0") tydens die ontwikkelingsproses gebruik word, en die eerste stabiele weergawe met die nommer "N.1" voorsien word.
Verbeterings in Clang 21 sluit in:
- C++ verwante kenmerke:
- In analogie met GCC, is die vermoë om konstante uitdrukkings in assembler-invoegsels wat deur die "asm"-richtlijn gedefinieer word, te gebruik, geïmplementeer: int foo() { asm((std::string_view("nop")) ::: (std::string_view("memory"))); }
- Het uitgebreide variante van "new" en "delete" uitdrukkings bygevoeg wat die "std::type_identity" argument ondersteun ", waardeur jy inligting kan spesifiseer oor die tipe voorwerp waarvoor geheue toegeken of vrygestel word.
- Die vermoë bygevoeg om lambda-funksies te evalueer wat gestruktureerde bindings tydens kompilering vaslê in die konteks van 'n konstante uitdrukking.
- Kenmerke wat verband hou met die toekomstige C++2c (C++26) standaard:
- Gestruktureerde bindings ondersteun nou die "..." sintaksis om pakke te spesifiseer wat die oorblywende aantal elemente in die toewysingsvolgorde vasvang. auto [x,y,z] = f(); // veranderlikes x, y, z sal die drie elemente bevat wat deur f( teruggegee word). auto [...xs] = f(); // pakket xs sal alle elemente bevat wat deur f( teruggegee word). auto [x, ...rest] = f(); // x sal die eerste element bevat, en rest sal die res bevat. auto [x, y, ...rest] = f(); // x sal die eerste element bevat, y sal die tweede bevat, en rest sal die derde bevat. auto [x, ...rest, z] = f(); // x sal die eerste bevat, rest sal die tweede bevat, en z sal die derde bevat.
- Ondersteuning vir "Triviale Herlokeerbaarheid" van tipes is bygevoeg, wat die beweging van voorwerpe van 'n gegewe tipe optimaliseer deur hulle in die geheue te kloon sonder om konstruktors of destruktors te roep. Die memberwise_trivially_relocatable en memberwise_replaceable eienskappe word vir klasse geïmplementeer, en die trivially_relocate_at en trivially_relocate funksies word bygevoeg vir lae-vlak beweging van een of meer voorwerpe.
- Vermoë om gestruktureerde binding te gebruik as 'n voorwaarde in as- en skakelstellings.
- Geïmplementeerde ondersteuning vir die koppeling van die hooffunksie aan 'n globale module en die definisie van die hooffunksie in benoemde modules.
- Vermoëns wat ontwikkel word vir die toekomstige C2y-standaard:
- Het ongedefinieerde gedrag reggestel wanneer void-uitdrukkings in sommige kontekste gebruik word, soos "(void)(void)1;".
- Dit is toegelaat om nie 'n bronkodelêer met 'n nuwe reëlkarakter te eindig nie.
- Nuwe voorvoegsels vir oktale letterlikes bygevoeg — 0o en 0O, sowel as oktale en heksadesimale ontsnappingsreekse "\o{…}" en \x{…}. Ondersteuning vir oktale letterlikes 0xxx is afgekeur. Byvoorbeeld, "0o123" en "\o{123}" in plaas van "0123".
- Die "_Countof"-operateur is bygevoeg om die aantal elemente in 'n skikking te bepaal. Die koplêer stdcountof.h is ook bygevoeg, wat 'n variant van die "countof"-makro definieer wat via "_Countof" geïmplementeer word.
- Vermoëns gedefinieer in die C23 C-standaard:
- Dit word toegelaat om etikettipes (struct, union, enum) binne dieselfde vertaaleenheid te herdefinieer indien die herhaalde definisies struktureel ekwivalent is (dieselfde aantal lede, dieselfde tipes en etiketname).
- Vereenvoudigde gebruik van variadiese lyste. Toegelaat om 'n enkele variadiese parameter in 'n tipenaam te gebruik.
- GCC-versoenbare ingeboude "__builtin_c23_va_start()" bygevoeg om diagnostiese gedrag vir die va_start() makro in C23-modus te verbeter.
- In MSVC-kompileerderversoenbaarheidsmodus word die inlyn-spesifiseerder toegelaat wanneer 'n funksietipe via typedef verklaar word, byvoorbeeld, "typedef int inline Foo(int);"
- Die "beperk"-kwalifiseerder word toegelaat vir skikkingtipes met wyserelemente.
- Nuwe samestellerwaarskuwings:
- "-Wdefault-const-init-var" en "-Wdefault-const-init-field" — identifiseer const-gemerkte veranderlikes en velde wat sonder eksplisiete initialisering gedefinieer is.
- "-Wimplicit-void-ptr-cast" - uitvoer wanneer daar 'n implisiete omskakeling van tipe "void*" na 'n ander wysertipe is.
- "-Wc++-sleutelwoord" - uitvoer wanneer "C++" sleutelwoorde as identifiseerders in "C" gebruik word.
- "-Wc++-hidden-decl" - bespeur die gebruik van etikettipes wat sigbaar is in "C" maar nie sigbaar is in "C++" nie as gevolg van omvangbeperkings.
- "-Wimplicit-int-enum-cast" - bespeur implisiete omskakelings in C-kode van heelgetaltipes na opsommingtipes wat onversoenbaar is met "C++".
- "-Wtentative-definition-compat" - diagnosties vir tentatiewe definisies in C met veelvuldige definisies wat onversoenbaar is met C++.
- "-Wunterminated-string-initialization" en "-Wc++-unterminated-string-initialization" — bespeur situasies van inisialisering vanaf 'n stringletterlike waarin die skeier met die nulkode nie behoue kan bly nie. Die "nonstring"-attribuut is bygevoeg om velde en veranderlikes in C-kode te merk wat nie 'n finale nulkarakter benodig nie.
- "-Wjump-misses-init" - diagnostiek van 'n sprong deur goto of switch/case wat die initialisering van 'n plaaslike veranderlike oorslaan.
- "-Wundef-true" - Waarsku oor die gebruik van die waarde "true" in die C-voorverwerker sonder om dit te definieer.
- "-Wnrvo" - diagnostiek van gemiste NRVO (Benaming Return Value Optimization).
- Nuwe samestellervlae:
- "-fprofile-continuous" - aktiveer deurlopende sinchronisasie van die profiel na die lêer.
- "-ftime-report-json" - voer samestellingstydinligting in JSON-formaat uit.
- "-ignore-pch" - deaktiveer voorafgekompileerde opskrifte.
- "-fthinlto-distributor" en "-Xthinlto-distributor" - vir die gebruik van DTLTO (Geïntegreerde Verspreide ThinLTO).
- "-static-libclosure" - vir statiese skakeling van die Blocks-looptyduitbreiding op die Windows-platform.
- Uitgebreide diagnostiese en statiese analise-instrumente, nuwe kontroles bygevoeg (meer as honderd diagnosties-verwante verbeterings).
- Verbeterde backends vir ARM-, Aarch64-, AMDGPU-, x86-, RISC-V-, LoongArch-, MIPS- en PowerPC-argitekture. Eksperimentele assemblerondersteuning vir Qualcomm uC-, Andes- en SiFive-uitbreidings is by die RISC-V-backend gevoeg.
Bron: opennet.ru
