Nauja šiuolaikinio C++ kūrimo era
2026 m. kovo 29 d. ISO C++ standartų komitetas baigė techninį C++26 darbą Londone, pažymėdamas trejų metų kūrimo ciklo pabaigą ir pradžią, kurį daugelis ekspertų vadina reikšmingiausiu leidimu nuo C++11. Komitetas, kuriame dalyvavo 210 dalyvių, atstovaujančių 24 tautoms, išsprendė galutines tarptautines pastabas ir dabar rengia tarptautinio standarto projektą, kad būtų patvirtintas balsavimas ir paskelbtas ISO.
C++26 reiškia esminį pokytį, kaip C++ sprendžia du svarbius iššūkius, kurie jau dešimtmečius kamavo kalbą: savistabos sunkumą ir neapibrėžto elgesio paplitimą. Rezultatas yra leidimas, kuris žada padaryti C++ galingesnį, saugesnį ir prieinamesnį kūrėjams.
Keturi C++26 ramsčiai
1. Atspindys: C++ dešimtmetį apibrėžiantis raketų variklis
Reflection yra didžiausias C++ kūrimo atnaujinimas nuo šablonų išradimo. Pirmą kartą C++ gali apibūdinti save ir generuoti daugiau kodo pagal šį aprašymą.
Prieš C++26, jei norėjote suskirstyti struktūrą, generuoti derinimo išvestį arba sukurti API paketą, turėjote rankiniu būdu parašyti kiekvieno tipo kodą. Apmąstydami galite parašyti bendrąjį kodą, kuris veikia su bet kokiu tipu, automatiškai atrasdamas jo narius ir jų tipus kompiliavimo metu.
Apsvarstykite paprastą pavyzdį: struktūros suskirstymas į JSON. Prieš apmąstydami, parašykite:
struct Person {
std::string name;
int age;
std::string email;
};
// Manual serialization
json serialize(const Person& p) {
json j;
j("name") = p.name;
j("age") = p.age;
j("email") = p.email;
return j;
}
Su C++26 atspindžiu galite rašyti:
template<typename t>
json serialize(const T& obj) {
json j;
for (auto member : reflect(obj)) {
j(member.name()) = member.get(obj);
}
return j;
}
Ši funkcija veikia bet kokiam tipui ir automatiškai atranda visus narius. Tai keičia bibliotekos kūrimą, kodų generavimą ir metaprogramavimą.
Kaip savo CppCon 2025 pagrindiniame pranešime pažymėjo Herbas Sutteris: „2025 m. birželio mėn. C++ peržengė Rubikoną: jis perdavė mums savo pačių mechanizmų raktus. Pirmą kartą C++ gali apibūdinti save – ir sukurti daugiau. Pirmosios kompiliavimo laiko refleksijos funkcijos C++26 juodraštyje žymi didžiausią mūsų kalbos istorijos lūžio tašką.
2. Mažiau neapibrėžto elgesio, kad atmintis būtų saugiau
C++26 turi svarbių atminties saugos patobulinimų, kuriuos gausite tiesiog perkompiliuodami esamą C++ kodą be pakeitimų:
Nebereikia neapibrėžtos elgsenos skaitant nepainicijuotus vietinius kintamuosius
Visa ši galimų pažeidžiamumų kategorija išnyksta C++26, tiesiog perkompiliavus kodą. C++23 ir senesnėse versijose neinicializuoto vietinio kintamojo skaitymas yra neapibrėžtas – kompiliatorius gali padaryti bet ką, įskaitant saugos patikrų optimizavimą. C++26 kalboje nepainicijuoti vietiniai kintamieji pagal numatytuosius nustatymus inicijuojami nuliui, todėl šios klaidos visiškai pašalinamos.
Užgrūdinta standartinė biblioteka
C++26 suteikia pradines kelių platformų bibliotekos saugumo garantijas, įskaitant ribinę saugą dešimčiai plačiausiai naudojamų apribotų operacijų bendruose standartiniuose tipuose: vektorius, intervalas, eilutė, string_view ir kt.
Tai nėra teorinė. „Google“ šis sutvirtinimas jau buvo pritaikytas šimtams milijonų C++ kodo eilučių. Rezultatai yra nuostabūs:
- Tik penkios paslaugos visiškai atsisakė dėl patikimumo ar našumo problemų
- Smulki nesaugios prieigos API buvo naudojama tik septyniose skirtingose vietose
- Sistema jau ištaisė daugiau nei 1000 klaidų
- Numatoma, kad tai padės išvengti 1 000–2 000 klaidų per metus
- Tai sumažino gedimų dažnį visame gamybos parke 30 proc.
Visa tai su vidutinėmis našumo sąnaudomis, kurios siekia vos 0,3 % – 1 %. Tai nėra tik popierinis dizainas. Tai gamyboje patikrinta technologija, kuri dabar standartizuojama visiems.
3. Funkcinės saugos sutartys
C++26 pristato kalbos kontraktus: funkcijų deklaracijų išankstines ir posąlygas bei kalbos palaikomą tvirtinimo teiginį – visa tai yra be galo geresnė už C tvirtinimo makrokomandą.
Sutartys leidžia išreikšti savo funkcijos daromas prielaidas ir jos teikiamas garantijas:
int divide(int a, int b)
((pre: b != 0))
((post r: r == a / b))
{
return a / b;
}
Šios sutartys gali būti:
- Tikrinama vykdymo metu kūrimo metu
- Sudaryta gamybos našumui
- Statiškai analizuojama įrankiais
- Naudojamas dokumentacijai
- Integruota su įrodymo pagalbininkais
Sutarčių funkcija buvo ginčytina – kai kurie ekspertai turėjo techninių susirūpinimą dėl dizaino. Tačiau po ilgų diskusijų ir patobulinimų komitetas balsavo 114 už, 12 prieš ir 3 susilaikė, kad sutartys būtų įtrauktos į C++26. Neįprastai mažas susilaikiusiųjų skaičius rodo, kad dabar beveik visi ekspertai yra tikri dėl savo techninės nuomonės.
4. std::vykdymas (C++ async modelis)
std::vykdymas suteikia vieningą sistemą, leidžiančią išreikšti ir kontroliuoti lygiagretumą ir lygiagretumą. Tai leidžia lengviau rašyti programas, kuriose naudojamas struktūrizuotas (griežtai visą gyvenimą įdėtas) lygiagretumas ir lygiagretumas, kad būtų išvengta duomenų lenktynių.
Ši funkcija ypač vertinga didelio našumo sistemoms, kur teisingumas ir našumas yra labai svarbūs. Tačiau šiuo metu ją pritaikyti sunkiau nei daugumą C++ funkcijų, nes jai trūksta puikios dokumentacijos ir kai kurių „pirštų ir kojų pirštų“ bibliotekų. Tikėkitės puikių rezultatų iš std::execution, bet taip pat tikitės praleisti šiek tiek pradinio laiko mokydamiesi padedant ką nors, kas tai gerai išmano.
Kodėl C++26 priėmimas bus greitas
Yra dvi priežastys, dėl kurių galima tikėtis, kad C++26 pramonėje bus priimtas daug greičiau nei C++17, C++20 arba C++23:
Nepaprastas vartotojų poreikis
C++11 buvo paskutinis „didelis ir įspūdingas“ leidimas, kuriame buvo gausu funkcijų, kurias didžioji dauguma C++ kūrėjų naudotų kasdien: automatinis, diapazonas, lambdas, išmaniosios rodyklės, judėjimo semantika, gijos, mutexes. Nuo tada tolesni trejeto metų standartai turėjo keletą didelių funkcijų, tokių kaip lygiagretus STL, koncepcijos, korutinos ir moduliai, tačiau jie nebuvo tokie dideli visiems C++ kūrėjams.
C++26 palapinės atspindys ir saugos grūdinimas bus. Net jei jūsų įmonė lėtai įjungė C++20 jungiklį, greičiausiai pastebėsite, kad C++26 įjungs daug greičiau. Yra tik tiek daug didesnės paklausos vertės, todėl tai yra jaudinantis ir išskirtinai naudingas leidimas visiems, kurie naudoja C++.
Greitas kompiliatoriaus diegimas
Kuriant C++26, bet kuriuo metu GCC ir Clang jau buvo įdiegę du trečdalius C++26 funkcijų. Šiandien GCC jau svarsto, o sutartys yra sujungtos į bagažinę ir laukia išleidimo. Tai reiškia, kad jums nereikės metų laukti kompiliatoriaus palaikymo – jis jau ateina.
Kelias į C++29: dar daugiau atminties saugos
Šiame posėdyje komitetas taip pat patvirtino C++29 tvarkaraštį, kuris bus dar vienas trejų metų išleidimo ciklas. Pagrindinis dėmesys diskutuojant apie C++29 laiko tarpo medžiagą buvo toliau didinamas atminties saugumas.
Pagrindinis kalbos evoliucijos pogrupis peržiūrėjo kelių šiuo metu teikiamų pasiūlymų dėl tolesnių tipo / atminties saugos patobulinimų, įskaitant pasiūlymus toliau mažinti neapibrėžtą elgesį ir saugos profilio dokumentų rengimą, atnaujinimus. Bjarne Stroustrup P3984 tipo saugos profilis kuriamas naudojant siūlomą bendrųjų profilių sistemą.
Oliveris Huntas iš „Apple“ pristatė praktinę WebKit patirtį, kuri sustiprino daugiau nei 4 milijonus kodo eilučių, naudodama antrinių rinkinių pogrupio metodą. Rezultatai buvo nuostabūs:
- Priimta ~4 milijonai kodo eilučių
- Uždaro kelias pažeidžiamumo klases
- Dabartinė politika būtų užkirtusi kelią daugumai istorinių išnaudojimų
- Rasta ir užkirto kelią naujų ir esamų klaidų išnaudojimui
C++29 jau ruošiasi dar labiau remtis C++26 saugos patobulinimais. Tai yra esminis pokytis: C++ pereinama nuo laukinių vakarų kalbos, kurioje viskas pereinama prie saugesnės pagal numatytuosius nustatymus, kuri vis dar išlaiko nulinės pridėtinės vertės principą. Jūs nemokate už tai, ko nenaudojate, ir net kai kai kurie saugos įrenginiai yra tokie pigūs, kad jie įjungti pagal numatytuosius nustatymus, visada turite galimybę atsisakyti, kai jums reikia išnaudoti paskutinę unciją.
Ką tai reiškia C++ kūrėjams
Programų kūrėjams
Atspindėjimas ir sustiprinta standartinė biblioteka padarys jūsų kodą saugesnį ir lengviau rašomą. Mažiau laiko sugaišite svarstydami ir daugiau laiko dirbsite su verslo logika. Atminties saugos patobulinimai reiškia mažiau paslaptingų gedimų ir saugumo spragų.
Bibliotekos autoriams
Refleksija atveria visiškai naujas bendro programavimo galimybes. Galite rašyti bibliotekas, kurios veikia su bet kokiu vartotojo apibrėžtu tipu, automatiškai atrasdamos jo struktūrą. Taip bus sukurtos galingesnės, lankstesnės bibliotekos.
Sistemų programuotojams
Sutartys ir std::vykdymas suteikia naujus įrankius teisingumo savybėms išreikšti ir lygiagretumui valdyti. Sustiprinta standartinė biblioteka suteikia jums saugumo garantijas neprarandant našumo.
Saugumo žinioms organizacijoms
Dėl atminties saugos patobulinimų ir sutarčių palaikymo C++26 yra patrauklus pasirinkimas saugumui svarbioms sistemoms. Galimybė išreikšti ir patikrinti teisingumo savybes kompiliavimo metu yra neįkainojama.
Platesnė reikšmė
C++26 reiškia kalbos brandinimą. Užuot pridėję ryškių naujų funkcijų, jame pagrindinis dėmesys skiriamas pagrindinių problemų, kurios kenčia C++ dešimtmečius, sprendimams. Refleksija išsprendžia metaprogramavimo problemą. Atminties saugos patobulinimai išsprendžia saugumo problemą. Sutartys leidžia oficialiai patikrinti.
Tai leidimas, kuriame gerbiama C++ istorija, kartu stumiant ją į priekį. Tai palaiko atgalinį suderinamumą, tuo pačiu daro kalbą saugesnę ir galingesnę. Tai leidimas, kuriame sakoma: „C++ neišnyksta, o vis gerėja“.
Kalbai, kuri gyvuoja beveik 40 metų, tai yra puikus pasiekimas.
Išvada
C++26 baigtas, ir tai didelis dalykas. Atsižvelgdamas į tai, patobulinus atminties saugą, sudarant sutartis ir std::vykdymą, tai yra reikšmingiausia C++ raida nuo C++11. Komitetas pristatė leidimą, kuriame sprendžiamos tikrosios problemos, su kuriomis susiduria tikri kūrėjai, ir pateikiami gamybos metu patvirtinti sprendimai.
Tikėtis greito priėmimo. Tikėkitės naujų bibliotekų, kurios paskatins apmąstymus. Tikėkitės saugesnio ir patikimesnio C++ kodo. Ir tikėkitės, kad C++ ateinančiais dešimtmečiais išliks pasirenkama kalba kuriant didelio našumo, saugai svarbias sistemas.
Atėjo kita C++ kūrimo era.
Jei tekste radote klaidą, siųskite pranešimą autoriui pažymėdami klaidą ir paspausdami Ctrl-Enter.
Nuoroda į informacijos šaltinį