PĂ€rast kuuekuulist arendust on vĂ€lja antud projekt LLVM 21.1.0, mis arendab tööriistade komplekti (kompilaatorid, optimeerijad ja koodi generaatorid), genereerides programme RISC-sarnaste virtuaalsete kĂ€skluste vahepealseks bitikoodiks (madala taseme virtuaalne masin, millel on mitmetasandiline optimeerimissĂŒsteem). Genereritud pseudokood saab muuta sihtplatvormi masinkoodiks vĂ”i kasutada JIT-kompilaatoriga masinasse kĂ€skude genereerimiseks otse programmi kĂ€ivitamisel. LLVM tehnoloogiate alusel arendab projekt kompilaatorit Clang, mis toetab programmeerimiskeeli C, C++ ja Objective-C. Alates 18.x harust on projekt lĂ€inud ĂŒle uuele versioonide numbrite vormistamise skeemile, mille kohaselt kasutatakse nullversiooni (âN.0â) arendusprotsessis ja esimene stabiilne versioon kantakse numbriga âN.1â.
Clangi 21 tÀiendused:
- C++-ga seotud vÔimalused:
- Sarnaselt GCC-ga on realiseeritud vĂ”imalus kasutada konstantselt avaldusi assembleri sisendites, mis mÀÀratakse âasmâ direktiiviga: int foo() { asm((std::string_view("nop")) ::: (std::string_view("memory"))); }
- Lisatud on laiendatud "new" ja "delete" vĂ€ljendite variandid, mis toetavad argumendi "std::type_identity", mille kaudu saab nĂ€idata objekti tĂŒĂŒbi teavet, mille jaoks mĂ€lu eraldatakse vĂ”i vabastatakse.
- Lisatud on vÔimalus arvutada lambda-funktsioone, mis hÔivavad struktureeritud sidemed, kompileerimise ajal konstantselt vÀljendites.
- C++2c (C++26) tuleviku standardiga seotud vÔimalused:
- Struktureeritud sidemetes on lisatud vĂ”imalus kasutada sĂŒntaksit ââŠâ pakettide (pack) mÀÀramiseks, et haarata ĂŒlejÀÀnud elemendid mÀÀratud jĂ€rjestusest. auto [x,y,z] = f(); // muutuja x, y, z saavad kolm elementi, mis f() tagastab. auto [âŠxs] = f(); // paketti xs saavad kĂ”ik elemendid, mis f() tagastab. auto [x, âŠrest] = f(); // x-sse salvestatakse esimene element, rest-i â ĂŒlejÀÀnud. auto [x, y, âŠrest] = f(); // x-sse salvestatakse esimene element, y-sse â teine, rest-i â kolmas. auto [x, âŠrest, z] = f(); // x-sse â esimene, rest-i â teine, z-sse â kolmas.
- Lisatud tugi tĂŒĂŒpi âtriviaalne nihutatavusâ (Trivial Relocatability), mis vĂ”imaldab optimeerida objektide liikumist lĂ€bi nende kloonimise mĂ€lus ilma konstruktorite vĂ”i destruktorite kutsumiseta. Klasside jaoks on rakendatud omadused memberwise_trivially_relocatable ja memberwise_replaceable ning madala taseme nihutamiseks ĂŒhe vĂ”i mitme objekti puhul on lisatud funktsioonid trivially_relocate_at ja trivially_relocate.
- Struktureeritud sidumise rakendamise vÔimalus tingimusena if ja switch operaatorites.
- Töötatakse vÀlja tugi funktsiooni main sidumiseks globaalsetesse moodulitesse ning funktsiooni main mÀÀramiseks nimetatud moodulites.
- C2y tulevase standardi jaoks arendatavad funktsioonid:
- Eemaldatud on mÀÀramatu kĂ€itumine, kui kasutatakse void tĂŒĂŒpi vĂ€ljendeid teatud kontekstides, nĂ€iteks "(void)(void)1;".
- Koodifaili ei ole kohustatud lĂ”petama uue rea sĂŒmboliga.
- Lisatud on uued prefiksid oktaliste kirjutiste jaoks â 0o ja 0O, samuti oktalised ja heksadesimaalsed escape-jĂ€rjestused "\o{âŠ}" ja "\x{âŠ}". Oktaliste kirjutiste 0xxx toe tugi on kuulutatud vananenuks. NĂ€iteks "0o123" ja "\o{123}" asemel "0123".
- Lisatud operaator â_Countofâ, et mÀÀrata massiivi elementide arv. Samuti on lisatud pealkirja fail stdcountof.h, mis mÀÀratleb makro âcountofâ variandi, teostatud lĂ€bi â_Countofâ.
- C23 standardis mÀÀratletud funktsioonid:
- Ăksikus koostööplokis on lubatud ĂŒlekirjutada tag-tĂŒĂŒbid (struct, union, enum), kui korduv mÀÀratlemine on struktuurselt ekvivalentne (samade liikmete arv, samad tĂŒĂŒbid ja tag-nimed).
- Lihtsustatud on variadiargumentidega (variadic) loendite kasutamine. Lubatud on kasutada ĂŒhte variadi parameetrit tĂŒĂŒbi nimes.
- Lisatud GCC-ga ĂŒhilduv sisseehitatud funktsioon â__builtin_c23_va_start()â, mis tĂ€iustab diagnostika kĂ€itumist makro va_start() jaoks C23 reĆŸiimis.
- MSVC kompilaatori ĂŒhilduvusreĆŸiimis on lubatud inline spetsifikaatori kasutamine funktsiooni tĂŒĂŒbi kuulutamisel typedef kaudu, nĂ€iteks âtypedef int inline Foo(int);â.
- Lubatud on ârestrictâ kvalifikaatori kasutamine massiivi tĂŒĂŒpide jaoks, mille elemendid on nĂ€itajad.
- Uued kompilaatori hoiatused:
- â-Wdefault-const-init-varâ ja â-Wdefault-const-init-fieldâ - tuvastamine const-mĂ€rgisega muutujate ja vĂ€ljade kohta, mis on mÀÀratletud ilma selge initsialiseerimiseta.
- «-Wimplicit-void-ptr-cast» â kuvatakse, kui toimub varjatud teisendus tĂŒĂŒbist «void*» mĂ”nda teise nĂ€itajatĂŒĂŒpi.
- «-Wc++-keyword» â kuvatakse, kui kasutatakse «C++» mĂ€rksĂ”nu identifikaatoritena «C» keeles.
- «-Wc++-hidden-decl» â tuvastab, kui kasutatakse siltide tĂŒĂŒpe, mis on nĂ€htavad «C» keeles, kuid ei ole nĂ€htavad «C++» keeles ulatuspiirangute tĂ”ttu.
- «-Wimplicit-int-enum-cast» â tuvastab varjatud teisendused C-koodis tĂ€isarvutĂŒĂŒpide ja loenditĂŒĂŒpide vahel, mis ei ole «C++»-ga ĂŒhilduvad.
- «-Wtentative-definition-compat» â diagnoosib esialgsete mÀÀratluste olemasolu «C»-s, millel on mitmed mÀÀratlused, mis ei ĂŒhildu «C++»-ga.
- «-Wunterminated-string-initialization» ja «-Wc++-unterminated-string-initialization» â tuvastavad olukorrad, kus stringikirja algatamine ei vĂ”imalda nullkoodi eraldajat salvestada. C-koodis, kus vĂ€ljad ja muutujad ei vaja lĂ”pp-nullmĂ€rki, on lisatud «nonstring» atribuut.
- «-Wjump-misses-init» â diagnoosib ĂŒleminekut, mis toimub goto vĂ”i switch/case kaudu, ja jĂ€tab kohalikku muutujat algatamata.
- «-Wundef-true» â hoiatab C eelprotsessoris vÀÀrtuse «true» kasutamise eest ilma mÀÀratlemata.
- «-Wnrvo» â NRVO (Named Return Value Optimization) kadumise diagnoosimine.
- Uued kompilaatoriflagid:
- «-fprofile-continuous» â pideva profiili salvestamise sisse lĂŒlitamine faili.
- «-ftime-report-json» â kompileerimise aja andmete vĂ€ljund JSON formaadis.
- «-ignore-pch» â eelkompileeritud pealkirjade keelamine.
- «-fthinlto-distributor» ja «-Xthinlto-distributor» â DTLTO (Integrated Distributed ThinLTO) rakendamiseks.
- «-static-libclosure» â statilise sidumise jaoks Windowsi platvormil Blocks runtime laienduste jaoks.
- Diagnostikavahendeid ja staatilise analĂŒĂŒsi vahendeid on laiendatud, lisatud on uusi kontrollimisi (ĂŒle sada tĂ€iustust, mis on seotud diagnostikaga).
- Toetused arhitektuuride ARM, Aarch64, AMDGPU, x86, RISC-V, LoongArch, MIPS ja PowerPC jaoks on paranenud. RISC-V tagasisidesse on lisatud eksperimentaalne sisestamise tugi [[https://llvm.org/docs/RISCVUsage.html Qualcomm uC, Andes ja SiFive laienduste jaoks.
Allikas: opennet.ru
