ከስድስት ወራት ልማት በኋላ፣ LLVM 22.1.0 ተለቋል። ፕሮግራሞችን ወደ መካከለኛ የ RISC-መሰል ምናባዊ መመሪያዎች (ባለብዙ ደረጃ የማመቻቸት ስርዓት ያለው ዝቅተኛ ደረጃ ምናባዊ ማሽን) የሚያጠናቅቁ መሳሪያዎችን (ኮምፓይለሮች፣ አመቻቾች እና የኮድ ጀነሬተሮች) ያዘጋጃል። የተፈጠረው የውሸት ኮድ ለአንድ የተወሰነ የዒላማ መድረክ ወደ ማሽን ኮድ ሊቀየር ወይም በፕሮግራም አፈፃፀም ወቅት በቀጥታ የማሽን መመሪያዎችን ለማመንጨት በሰዓቱ (JIT) ኮምፓይለር ጥቅም ላይ ሊውል ይችላል። በLLVM ቴክኖሎጂዎች ላይ በመመስረት፣ ፕሮጀክቱ የC፣ C++ እና Objective-C ፕሮግራሚንግ ቋንቋዎችን በመደገፍ የClang ኮምፓይለርን እያዘጋጀ ነው። ከ18.x ቅርንጫፍ ጀምሮ፣ ፕሮጀክቱ ወደ አዲስ የስሪት ቁጥር አሰጣጥ ዘዴ ተቀይሯል፣ በዚህም መሠረት ልቀት 0 ("N.0") በልማት ወቅት ጥቅም ላይ ይውላል፣ እና የመጀመሪያው የተረጋጋ ስሪት "N.1" ተብሎ ተቆጥሯል።
በክላንግ 22 ውስጥ ያሉ ማሻሻያዎች የሚከተሉትን ያካትታሉ:
- እንደ malloc ባሉ ልዩ መለያ ያላቸው ተግባራትን በመጠቀም የሚከናወኑ የማህደረ ትውስታ ምደባ ስራዎችን ምልክት ለማድረግ የማህደረ ትውስታ ምደባ ቶከኖች (የአደላ ቶከኖች) ድጋፍ ታክሏል። የማህደረ ትውስታ መፍሰስን መለየትን ቀላል ለማድረግ እና የነገሮችን በዓላማቸው ወይም በማሻሻያ ንድፎቻቸው ላይ በመመስረት (ለምሳሌ "ትኩስ" ከ "ቀዝቃዛ" ውሂብ ለመለየት) መመደብን ለማስቻል ያስችላል። ለማንቃት የ"-fsanitize=alloc-token" ባንዲራ ይጠቀሙ።
- ከሲ ቋንቋ ጋር የተያያዙ ባህሪያት፡
- የ"ማዘግየት" የዘገየ የአፈጻጸም ዘዴን የሚገልጽ ረቂቅ ዝርዝር መግለጫ ተግባራዊ ሆኗል፣ ይህም የአሁኑ ወሰን ሲወጣ እርምጃዎች እንዲፈጸሙ ያስችላል። "ማዘግየት" ድጋፍን ለማንቃት የ"-fdefer-ts" ባንዲራ ታክሏል።
- አብሮ የተሰራው ተግባር __builtin_stack_address() ተጨምሯል፣ ይህም በGCC ውስጥ ያለውን ተመሳሳይ ተግባር ያንፀባርቃል። ይህ ተግባር __builtin_stack_address() የሚባለውን የአሁኑ ተግባር የቁልል ቦታ እና የሚጠራቸውን ተከታይ ተግባራት የሚለይ የቁልል አድራሻን ይመልሳል።
- ለወደፊቱ የC2y መስፈርት የሚዘጋጁ ችሎታዎች፡-
- ለተሰየሙ ሉፖች ድጋፍ ታክሏል፣ ይህም ስሞችን ለሉፖች እና ለማብሪያ መግለጫዎች እንዲመድቡ ያስችልዎታል፣ ይህም ከውጪ ለመውጣት ሉፑን በግልጽ ለመግለጽ በእረፍት እና ቀጣይ መግለጫዎች ውስጥ ሊገለጽ ይችላል። outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // ወደ CONT1 continue outer ይሂዱ፤ // ወደ CONT2 // CONT1 ይሂዱ } // CONT2 }
- አብሮ የተሰራው "__COUNTER__" ማክሮ፣ ልዩ የመለያ ስሞችን ለማመንጨት የተነደፈው፣ ተዘርግቶ በመደበኛው ውስጥ ተካትቷል። ለዚህ ማክሮ የ2147483647 ጥሪዎች ገደብ ተዘጋጅቷል፤ ይህንን ገደብ ማለፍ ስህተት ይፈጥራል።
- "ውጫዊ መስመር ውስጥ" ተብለው የተገለጹ የማይንቀሳቀሱ ተግባራትን ወይም በተግባሮች ውስጥ ያሉ ተለዋዋጮችን ሲጠቀሙ ማስጠንቀቂያ (-Wstatic-in-line) ተወግዷል።
- በC23 C ደረጃ የተገለጹ ችሎታዎች፡-
- የfloat.h የራስጌ ፋይል አሁን የFLT_SNAN፣ DBL_SNAN እና LDBL_SNAN ማክሮዎችን ይደግፋል፣ እነዚህም ለfloat፣ ድርብ እና ረጅም ድርብ አይነቶች ምልክት የተደረገባቸው (በሂሳብ ስራዎች ውስጥ ጥቅም ላይ ሲውሉ ልዩነትን የሚፈጥሩ) የNaN እሴቶችን ይተገብራሉ።
- ተመሳሳይ መስኮች ቢኖራቸው ኖሮ የተለያዩ ስማቸው ያልተጠቀሰባቸው አይነቶች በተመሳሳይ የትርጉም ክፍል ውስጥ ተኳሃኝ እንደሆኑ የሚታሰቡበት ሳንካ ተስተካክሏል።
- በጥገኝነት ቅኝት ወቅት የጎደሉ የራስጌ ፋይሎችን ችላ ለማለት የሚያገለግለው "-MG" ባንዲራ ወደ "#embed" መመሪያዎች ተዘርግቷል እና አሁን በ"#embed" መመሪያ ውስጥ የተገለጸ ፋይል ሲጠፋ "ፋይሉ አልተገኘም" የሚለውን ስህተት ያደቃል።
- ከ C++ ጋር የሚዛመዱ ባህሪዎች
- በC++2c (C++26) ዝርዝር መግለጫ ውስጥ እንደተዘጋጀው በ"constexpr" አውድ ውስጥ የተዋቀሩ ማያያዣዎችን የመጠቀም ችሎታ ተጨምሯል። ይህ ማለት የቋሚ አገላለጾች ማጣቀሻዎች አሁን እራሳቸው ቋሚ አገላለጾች ሊሆኑ ይችላሉ ማለት ነው። ድጋፍ ለድርድሮች እና ለቀላል አወቃቀሮች ይተገበራል (tuples ገና አልተደገፉም)። constexpr int arr[] = {1, 2}፤ constexpr auto [x, y] = arr;
- በC++20 መስፈርት መሰረት፣ ገደቦች ከመፈተሻቸው በፊት አሁን ወደ መደበኛ ቅርፅ ይቀየራሉ፣ ይህም በፅንሰ-ሀሳብ መታወቂያዎች ውስጥ ብቻ ጥቅም ላይ በሚውሉ የአብነት ክርክሮች ውስጥ የበለጠ ትክክለኛ የምርመራ መልዕክቶችን እና የመተኪያ ስህተቶችን በአግባቡ እንዲያዙ ያስችላል።
- የንጽጽር ኦፕሬተሮች "<", ">", "<=", እና ">="" ከ "<=>" ኦፕሬተር የተዋሃዱ መሆናቸውን ለማወቅ "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" የተባሉ አብሮገነብ ተግባራትን ቤተሰብ አክሏል።
- የ"-Wincompatible-pointer-types" መለኪያ ከማስጠንቀቂያ ይልቅ ስህተት እንዲያመጣ ተቀይሯል። ወደ ቀድሞው ባህሪ ለመመለስ "-Wno-error=incompatible-pointer-types" የሚለውን አማራጭ ይጠቀሙ።
- አብሮገነብ ተግባራት __builtin_bswapg፣ __builtin_elementwise_ldexp፣ __builtin_elementwise_fshl፣ __builtin_elementwise_fshr፣ __builtin_elementwise_minnumnum፣ __builtin_elementwise_maxnumnum፣ __builtin_masked_load፣ __builtin_masked_expand_load፣ __builtin_masked_store፣ __builtin_masked_compress_store፣ __builtin_masked_gather፣ __builtin_masked_scatter እና __builtin_dedup_packን ጨምሮ ተጨምረዋል። ለምሳሌ፣ builtin_dedup_pack ከዝርዝሮች ዝርዝር ውስጥ የተባዙትን እንዲያስወግዱ ያስችልዎታል፡ MyTypeList = TypeList<__builtin_dedup_packን በመጠቀም …>; // የሚወጣው አይነት TypeList ይሆናል
- በUBSan (-fsanitize=undefined -fsanitize-trap=undefined) ያልተገለጸ ባህሪን ሲያርሙ፣ የስህተት መንስኤ መረጃ አሁን በተፈጠረው የስህተት መረጃ ውስጥ ተካትቷል። የ"-fsanitize-debug-trap-reasons" ባንዲራ በስህተት መረጃ ውስጥ ያለውን የዝርዝር ደረጃ ለመግለጽ ታክሏል። ለአጠቃላይ መግለጫዎች (ለምሳሌ፣ "ኢንቲጀር መደመር ሞልቷል") እና ዝርዝር መረጃን (ለምሳሌ፣ "በ'a + b' ውስጥ የተፈረመ የኢንቲጀር መደመር ሞልቷል") ለማካተት "መሰረታዊ" ሊዋቀር ይችላል።
- አዲስ የአቀናባሪ ባንዲራዎች ታክለዋል፡
- "-f[no-]sanitize-debug-trap-reasons" የሚለውን በመጠቀም በ"-fsanitize-trap" ሁነታ ሲጠናቀር የልዩነት ወጥመድ ምክንያቶች በስህተት መረጃ ውስጥ የተካተቱ መሆናቸውን ለመቆጣጠር ያስችላል።
- "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi", እና "-fsanitize-alloc-token-extended" የማህደረ ትውስታ ምደባ ቶከኖችን ለማስተዳደር።
- "-fmatrix-memory-layout" የማትሪክስ አይነቶችን የማህደረ ትውስታ አቀማመጥ ለመቆጣጠር (ለምሳሌ፡-ለአምድ-ዋና አምድ-ዋና አምድ፣ ለረድፍ-ዋና አምድ-ዋና አምድ)።
- ተግባራት አሁን "malloc_span" ባህሪ አላቸው፣ ይህም ከ malloc ባህሪ ጋር ተመሳሳይ ነው ነገር ግን ጠቋሚ እና መጠኑ ወይም ጠቋሚ ያለው መስክ የያዘ ስፔን-መሰል መዋቅሮችን ለሚመልሱ ተግባራት ተፈጻሚ ይሆናል።
- የህትመት ተግባርን በአገናኝ ጊዜ በስታቲስቲክስ የተገናኘ አተገባበርን በተለዋዋጭነት ለመምረጥ የ"ሞዱላር_ቅርጸት" ባህሪን አክሏል።
- የምርመራ እና የማይንቀሳቀሱ የትንታኔ መሳሪያዎች ተዘርግተዋል፣ አዳዲስ ቼኮች ተጨምረዋል (ከብዙ ደርዘን የምርመራ ማሻሻያዎች ጋር)።
- ለSSE፣ AVX እና AVX512 ቅጥያዎች ተጨማሪ ውስጣዊ ነገሮች ወደ X86 የኋላ ክፍል ተጨምረዋል። በWildcat Lake (-march=wildcatlake) እና በኖቫ ሌክ (-march=novaleke) ማይክሮአርክቴክቸርስ ላይ ተመስርተው ለIntel CPUዎች የግንባታ ሁነታዎች ተጨምረዋል።
- የAArch64 የኋላ ክፍል አሁን የAmpere Computing Ampere1C (ampere1c)፣ የArm C1-Nano (c1-nano)፣ የArm C1-Pro (c1-pro)፣ የArm C1-Premium (c1-premium) እና የArm C1-Ultra (c1-ultra) ፕሮሰሰሮችን ይደግፋል። ለFCVTZ[US]፣ FCVTN[US]፣ FCVTM[US]፣ FCVTP[US] እና FCVTA[US] መመሪያዎች ተጨማሪ አብሮገነብ ተግባራት ታክለዋል። የFunction Multi-Versioning (FMV) ድጋፍ ተረጋግጧል። ተጠቃሚዎች አሁን የተለያዩ የFunction ስሪቶችን ቅድሚያ ሊሽሩ ይችላሉ።
- ለ LoongArch32 (LA32R፣ LA32S) አርክቴክቸር ድጋፍ ታክሏል።
- ለ ARM፣ AMDGPU፣ RISC-V፣ LoongArch64፣ MIPS፣ WebAssembly እና PowerPC አርክቴክቸርዎች የተሻሻሉ የኋላ መሸፈኛዎች።
ምንጭ: opennet.ru
