Pas six muajsh zhvillimi, u publikua versioni i projektit LLVM 18.1.0 - një mjet i pajtueshëm me GCC (kompilatorë, optimizues dhe gjenerues kodi), që compilon programe në kodin e ndërmjetëm të instrukcioneve virtuale të ngjashme me RISC (një makinë virtuale me nivele të shumta optimizimi). Kodi i gjeneruar mund të shndërrohet me ndihmën e JIT-kompilatorit në instruksione makinerike në momentin e ekzekutimit të programit.
Duke filluar nga dega 18.x, projekti kaloi në një skemë të re të formimit të numrave të versioneve. Në përputhje me projektet GCC dhe GDB, lëshimi zero («N.0») tani përdoret në procesin e zhvillimit, ndërsa versioni i parë stabil është i numëruar me «N.1». Ky ndryshim mundëson ndarjen e ndërtimeve bazuar në degën e zhvillimit (mainline) nga ndërtimet e degës me lëshime përfundimtare. Për shembull, gjatë përgatitjes së këtij lëshimi, zhvillimi u krye duke përdorur degën e paqëndrueshme LLVM 18.0, ndërsa lëshimi i parë stabil doli me numrin 18.1.0. Në të ardhmen, sipas nevojës, mund të krijohen lëshime korrektuese çdo dy javë me numrat 18.1.1, 18.1.2 etj. Në rast se bëhen ndryshime në degën aktuale që thyejnë ABI-në, përditësimi do të formohet me ndryshimin e numrit të dytë të versionit (dmth 18.2.0).
Përmirësimet kryesore në Clang 18:
- Ndryshimet e lidhura me gjuhën C:
- Strukturat, unionet dhe array-t me shenjën «const» tani mund të përdoren si shprehje konstante, në përputhje me GCC.
- Enumeracionet (enum) tani pasqyrohen në metadata TBAA (Analiza e Aliasit të Bazuar në Tip) në tipin e tyre të plotë numerik, përveç se trajtohen si tip «char».
- Shtuar mbështetje për atributin «counted_by», përmes të cilit mund të tregoni një fushë në strukturë me array fleksibël që përcakton numrin e elementeve në array-n fleksibël. Atributi mund të përdoret në clang për të përmirësuar efikasitetin e kontrolleve të daljes përtej kufirit.
- Aftësitë që do të definohen në standardin e ardhshëm të C-së C23:
- Shtuar mbështetje për flag-un «-std=c23» dhe «-std=gnu23», si dhe vlerën «202311L» për makron «__STDC_VERSION__», që përcaktojnë standardin C23 dhe zgjerimet GNU C23.
- Shtuar mbështetje për shprehjen «requires c23» për lidhjen e moduleve me mbështetje për standardin C23.
- Implementuar mbështetje për daljen e tipit gjatë përcaktimit të objekteve, që lejon përdorimin e shenjës «auto» për përcaktimin e tipit të variablave bazuar në tipin e shprehjes për inicializimin e tyre. Për shembull: «auto y = cos(x);».
- Shtuar mbështetje për skedarin e titullit me makro për kontrollin e llogaritjeve të tërë.
- Lejohet vendosja e etiketave në çdo vend brenda shprehjeve të përbëra.
- Dhe me këtë kompilim në modalitetin C23, mbështetje për trigrafët është ndërprerë në kod, sekuenca e tre ASCII-symboleve që trajtohen si një simbol, për shembull, sekuenca «??=» mund të përdorej në vend të «#». Pas shfaqjes së Unicode, mbështetja për trigrafët ka humbur kuptimin.
- Aftësitë e lidhura me standardin C++20: Implementuar mundësi eksperimentale për të përdorur në template argumente të llojeve të tjera, përveç llojeve, për shembull, letra me pikë floating, pointer dhe referenca për nënobjekte.
- Aftësitë e lidhura me standardin C++23: Shtuar mbështetje eksperimentale për mekanizmin «Deducing this», që lejon përdorimin në template të parametrave me shenjën «this» dhe i jep mundësi funksionit të klasës të dijë kategorinë e shprehjes (për shembull, nëse është një konstantë), për të cilën kjo funksion është thirrur.
- Mundësi të lidhura me standardin e ardhshëm C++2c (C++26):
- Shtuar mundësia e përdorimit të disa variablave të plotësimit me emrin «_» në një fushë të njëjtë pamjeje, për shembull, tani janë struktura të sakta: struct S { int _, _; }; void func() { int _, _; } void other() { int _; // më parë shfaqej një paralajmërim në modin -Wunused }
- Ofrohet mundësia e përdorimit të literalëve të vargut në kontekste ku ata nuk përdoren për inicializimin e një array simbolesh dhe nuk përfshihen në kodin përfundimtar, por përdoren vetëm gjatë kompilimit për mesazhe diagnostike dhe përproçesim, për shembull, si parametra të drejtimeve dhe atributeve _Pragma, asm, extern, static_assert, [[deprecated]] dhe [[nodiscard]].
- Dhe tani është pohuar si të vjetruar ekzekutimi i transformimeve të paqarta të vlerave të enumeruar në llogaritjet aritmetike. int main() { enum E1 { e }; enum E2 { f }; bool b = e
Burimi: opennet.ru
