Զարգացումից վեց ամիս հետո ներկայացվում է LLVM 18.1.0 նախագծի թողարկումը՝ GCC-ի հետ համատեղելի գործիքակազմ (կոմպիլյատորներ, օպտիմիզատորներ և կոդերի գեներատորներ), որը ծրագրերը կազմում է RISC-անման վիրտուալ հրահանգների միջանկյալ բիթկոդի մեջ (ցածր մակարդակի վիրտուալ մեքենա բազմամակարդակ օպտիմալացման համակարգ): Ստեղծված կեղծ կոդը կարող է JIT կոմպիլյատորը վերածել մեքենայի հրահանգների հենց ծրագրի կատարման պահին:
Սկսած 18.x ճյուղից, նախագիծը անցավ նոր տարբերակների համարակալման սխեմայի: GCC և GDB նախագծերի նման, մշակման ընթացքում այժմ օգտագործվում է զրոյական թողարկումը («N.0»), իսկ առաջին կայուն տարբերակը համարակալված է «N.1»: Փոփոխությունը թույլ է տալիս առանձնացնել մշակման փուլում գտնվող ճյուղի (հիմնական) վրա հիմնված կառուցվածքները վերջնական թողարկումներ ունեցող ճյուղի կառուցվածքներից: Օրինակ, ընթացիկ թողարկումը պատրաստելիս մշակումն իրականացվել է անկայուն LLVM 18.0 ճյուղի միջոցով, և առաջին կայուն թողարկումը թողարկվել է 18.1.0 համարի ներքո: Ապագայում, անհրաժեշտության դեպքում, ուղղիչ թողարկումները կարող են ձևավորվել յուրաքանչյուր երկու շաբաթը մեկ՝ 18.1.1, 18.1.2 և այլն համարների ներքո: Եթե ընթացիկ ճյուղում կատարվեն փոփոխություններ, որոնք խախտում են ABI-ն, թարմացումը կձևավորվի տարբերակի երկրորդ նիշի փոփոխությամբ (այսինքն՝ 18.2.0):
Clang 18-ի հիմնական բարելավումները.
- C լեզվի հետ կապված փոփոխություններ՝
- «const» դրոշակով կառուցվածքները, միությունները և զանգվածները այժմ կարող են օգտագործվել որպես հաստատուն արտահայտություններ, նման GCC-ին։
- Թվարկումները այժմ TBAA (Type Based Alias Analysis) մետատվյալներում արտացոլվում են որպես իրենց բնիկ ամբողջ թիվ տիպ, այլ ոչ թե որպես "char" տիպ։
- Ավելացվել է «counted_by» ատրիբուտի աջակցությունը, որը կարող է օգտագործվել flex զանգվածի կառուցվածքում դաշտ նշելու համար, որը նշում է flex զանգվածի տարրերի քանակը: Այս ատրիբուտը կարող է օգտագործվել clang-ում՝ բուֆերի գերբեռնվածության ստուգումների արդյունավետությունը բարելավելու համար:
- Ապագա C23 C ստանդարտում սահմանված առանձնահատկությունները՝
- Ավելացվել է «-std=c23» և «-std=gnu23» դրոշների, ինչպես նաև «__STDC_VERSION__» մակրոյի «202311L» արժեքի աջակցություն, որոնք սահմանում են C23 ստանդարտը և GNU C23 ընդլայնումները։
- Ավելացվել է «requires c23» հրահանգի աջակցությունը՝ մոդուլները C23 ստանդարտը աջակցելու համար կապելու համար։
- Ներդրվել է տիպի եզրակացության աջակցություն օբյեկտներ սահմանելիս, որը թույլ է տալիս օգտագործել «auto» դրոշը տիպի փոխարեն՝ փոփոխականների տեսակը որոշելու համար՝ հիմնվելով դրանց նախնականացման արտահայտության տեսակի վրա: Օրինակ՝ «auto y = cos(x);»:
- Ավելացված է վերնագրի ֆայլերի աջակցություն ամբողջ թվերի հաշվարկները ստուգելու մակրոներով։
- Թույլատրվում է պիտակներ տեղադրել բարդ արտահայտությունների ցանկացած վայրում։
- C23 ռեժիմով կոմպիլյացիայի ժամանակ, կոդում այլևս չի աջակցվում եռագրաֆների՝ երեք ASCII նիշերի հաջորդականությունների աջակցությունը, որոնք դիտարկվում են որպես մեկ նիշ. օրինակ՝ «#»-ի փոխարեն կարող է օգտագործվել «??=» հաջորդականությունը: Յունիկոդի գալուստով եռագրաֆների աջակցությունը դարձել է անիմաստ:
- C++20-ին առնչվող առանձնահատկություններ. այժմ հասանելի է փորձարարական աջակցություն ձևանմուշներում լրացուցիչ ոչ տիպային արգումենտային տեսակների համար, ինչպիսիք են լողացող կետային արժեքները, ցուցիչները և ենթաօբյեկտների հղումները:
- C++23 ստանդարտին վերաբերող առանձնահատկություններ. Ավելացվել է «Սա եզրակացնելու» մեխանիզմի փորձարարական աջակցությունը, որը թույլ է տալիս օգտագործել «սա» դրոշակով ձևանմուշի պարամետրեր և հնարավորություն է տալիս դասի ֆունկցիայից պարզել արտահայտության այն կատեգորիան (օրինակ՝ արդյոք այն հաստատուն է), որի համար կանչվում է այս ֆունկցիան։
- Առաջիկա C++2c ստանդարտի (C++26) հետ կապված առանձնահատկությունները՝
- Ավելացվել է մեկ շրջանակում «_» անունով մի քանի տեղապահ փոփոխականներ օգտագործելու հնարավորությունը, օրինակ՝ հետևյալ կոնստրուկտները այժմ ճիշտ են՝ struct S { int _, _; }; void func() { int _, _; } void other() { int _; // նախկինում նախազգուշացումը ցուցադրվում էր -Wunused ռեժիմում }
- Տրամադրում է տողային լիտերալներ օգտագործելու հնարավորություն այնպիսի համատեքստում, որտեղ դրանք չեն օգտագործվում նիշերի զանգվածը նախնականացնելու համար և չեն հայտնվում արդյունքում ստացված կոդում, այլ օգտագործվում են միայն կոմպիլյացիայի ընթացքում՝ ախտորոշիչ հաղորդագրությունների և նախնական մշակման համար, ինչպիսիք են՝ _Pragma, asm, extern, static_assert, [[հնացած]] և [[nodiscard]] դիրեկտիվների և ատրիբուտների պարամետրերը։
- Թվային հաշվարկներում թվարկված արժեքների անուղղակի փոխարկումները հնացել են։ int main() { enum E1 { e }; enum E2 { f }; bool b = e
Source: opennet.ru
