Π Π΅Π»ΠΈΠ· Π½Π°Π±ΠΎΡ€Π° компиляторов GCC 10

ПослС Π³ΠΎΠ΄Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ Ρ€Π΅Π»ΠΈΠ· свободного Π½Π°Π±ΠΎΡ€Π° компиляторов GCC 10.1, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ выпуск Π² Π½ΠΎΠ²ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠ΅ GCC 10.x. Π’ соотвСтствии с Π½ΠΎΠ²ΠΎΠΉ схСмой Π½ΡƒΠΌΠ΅Ρ€Π°Ρ†ΠΈΠΈ выпусков, вСрсия 10.0 использовалась Π² процСссС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Π° Π½Π΅Π·Π°Π΄ΠΎΠ»Π³ΠΎ Π΄ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄Π° GCC 10.1 ΡƒΠΆΠ΅ ΠΎΡ‚Π²Π΅Ρ‚Π²ΠΈΠ»Π°ΡΡŒ Π²Π΅Ρ‚ΠΊΠ° GCC 11.0, Π½Π° Π±Π°Π·Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ сформирован ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π»ΠΈΠ· GCC 11.1.

GCC 10.1 ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»Π΅Π½ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π½ΠΎΠ²ΡˆΠ΅ΡΡ‚Π² языка C++, Ρ€Π°Π·Π²ΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… для стандарта C++20, ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡΠΌΠΈ связанными с Π±ΡƒΠ΄ΡƒΡ‰ΠΈΠΌ стандартом языка Π‘ΠΈ (C2x), Π½ΠΎΠ²Ρ‹ΠΌΠΈ оптимизациями Π² бэкСндах компилятора ΠΈ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Ρ€Π΅ΠΆΠΈΠΌΠ° статичСского Π°Π½Π°Π»ΠΈΠ·Π°. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² Ρ…ΠΎΠ΄Π΅ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ Π½ΠΎΠ²ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ рСпозитория с SVN Π½Π° Git.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ измСнСния:

  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ статичСского Π°Π½Π°Π»ΠΈΠ·Π° «-fanalyzer«, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт рСсурсоёмкий ΠΌΠ΅ΠΆΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ· ΠΏΡƒΡ‚Π΅ΠΉ выполнСния ΠΊΠΎΠ΄Π° ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Π Π΅ΠΆΠΈΠΌ способСн Π½Π° этапС компиляции Π²Ρ‹ΡΠ²Π»ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΊΠ°ΠΊ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ free() для ΠΎΠ΄Π½ΠΎΠΉ области памяти, ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… дСскрипторов, Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π½ΡƒΠ»Π΅Π²Ρ‹Ρ… ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ освобоТдённым Π±Π»ΠΎΠΊΠ°ΠΌ памяти, использованиС Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ Ρ‚.ΠΏ. ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ° для ΠΊΠΎΠ΄Π° OpenSSL ΡƒΠΆΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ Π²Ρ‹ΡΠ²ΠΈΡ‚ΡŒ ΠΎΠΏΠ°ΡΠ½ΡƒΡŽ ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ.
  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Ρ‹ ΠΌΠ΅ΠΆΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠŸΡ€ΠΎΡ…ΠΎΠ΄ IPA-SRA (мСТпроцСдурная скалярная Π·Π°ΠΌΠ΅Π½Π° ΠΎΠ±Ρ‰ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ) ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚Π°Π½ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π²ΠΎ врСмя связывания ΠΈ ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ удаляСт вычисляСмыС ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ значСния. Π’ Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ «-O2» Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° опция «-finline-functions», которая пСрСнастроСна Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ получСния Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, Ρ‡Π΅ΠΌ Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ выполнСния. УскорСна Ρ€Π°Π±ΠΎΡ‚Π° эвристики inline-развёртывания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Эвристика inline-развёртывания ΠΈ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ для прСдсказания эффСктивности ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ. Для Π‘++ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½Π° Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Π°Π½Π°Π»ΠΈΠ·Π° псСвдонимов Π½Π° основС Ρ‚ΠΈΠΏΠΎΠ².
  • Π Π°ΡΡˆΠΈΡ€Π΅Π½Ρ‹ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° этапС связывания (LTO). Π”ΠΎΠ±Π°Π²Π»Π΅Π½ Π½ΠΎΠ²Ρ‹ΠΉ исполняСмый Ρ„Π°ΠΉΠ» lto-dump для сброса ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… с Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ΠΎΠΌ LTO. Π’ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ выполняСмых ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π°Ρ… LTO обСспСчСно автоматичСскоС опрСдСлСния числа ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ запускаСмых Π·Π°Π΄Π°Ρ‡ make ΠΈ, Ссли ΠΈΡ… Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, использованиС Π² качСствС Ρ„Π°ΠΊΡ‚ΠΎΡ€Π° распараллСливания свСдСний ΠΎ числС ядСр CPU. Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сТатия Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π° LTO ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° zstd.
  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° основС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² профилирования ΠΊΠΎΠ΄Π° (PGO — Profile-guided optimization), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π° основС Π°Π½Π°Π»ΠΈΠ·Π° особСнностСй выполнСния ΠΊΠΎΠ΄Π°. Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ΠΎ сопровоТдСниС профиля Π² процСссС компиляции ΠΈ раздСлСния «Π³ΠΎΡ€ΡΡ‡Π΅Π³ΠΎ»/»Ρ…ΠΎΠ»ΠΎΠ΄Π½ΠΎΠ³ΠΎ» ΠΊΠΎΠ΄Π°. Π§Π΅Ρ€Π΅Π· ΠΎΠΏΡ†ΠΈΡŽ «-fprofile-values» Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π΄ΠΎ 4 Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ профиля, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для косвСнных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΈ прСдоставлСния Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅.
  • Для языков C, C++ ΠΈ Fortran Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° спСцификация ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования OpenACC 2.6, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π°Ρ срСдства для выноса ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ (offloading) Π½Π° GPU ΠΈ спСциализированныС процСссоры, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ NVIDIA PTX. ΠŸΠΎΡ‡Ρ‚ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° рСализация стандарта OpenMP 5.0 (Open Multi-Processing), ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅Π³ΠΎ API ΠΈ способы примСнСния ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования Π½Π° многоядСрных ΠΈ Π³ΠΈΠ±Ρ€ΠΈΠ΄Π½Ρ‹Ρ… (CPU+GPU/DSP) систСмах с ΠΎΠ±Ρ‰Π΅ΠΉ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈ Π±Π»ΠΎΠΊΠ°ΠΌΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ (SIMD). Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Ρ‚Π°ΠΊΠΈΠ΅ возмоТности ΠΊΠ°ΠΊ условныС выраТСния lastprivate, Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ scan ΠΈ loop, выраТСния order ΠΈ use_device_addr. Для OpenMP ΠΈ OpenACC Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° выноса ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ (offloading) Π½Π° GPU AMD Radeon (GCN) Ρ‡Π΅Ρ‚Π²Ρ‘Ρ€Ρ‚ΠΎΠ³ΠΎ (Fiji) ΠΈ пятого ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠΉ (VEGA 10/VEGA 20).
  • Для языков сСмСйства Π‘ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° функция «access» для описания доступа Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΌ ΠΏΠΎ ссылкС ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ, ΠΈ для связи Ρ‚Π°ΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² с цСлочислСнными Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ, содСрТащими свСдСния ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ вмСстС с «access» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ «type» для выявлСния Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ доступа ΠΈΠ· ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ записи Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π²Π½Π΅ Π³Ρ€Π°Π½ΠΈΡ† массива. Π’Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ «symver» для привязки символов Π² ELF-Ρ„Π°ΠΉΠ»Π΅ ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΌ Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌ вСрсий.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ прСдупрСТдСния:
    • «-Wstring-compare» (Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΈ «-Wextra») — ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°Π΅Ρ‚ ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ноль сравниваСтся с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ strcmp ΠΈ strncmp, эквивалСнтСным константС ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π΄Π»ΠΈΠ½Π° ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° большС Ρ‡Π΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ массива Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅.
    • «-Wzero-length-bounds» (Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΈ «-Warray-bounds») — ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°Π΅Ρ‚ ΠΎ доступС ΠΊ элСмСнтам массивов Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ пСрСзаписи Π΄Ρ€ΡƒΠ³ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ….
    • Π Π°ΡΡˆΠΈΡ€Π΅Π½Ρ‹ прСдупрСТдСния «-Warray-bounds», «-Wformat-overflow», «-Wrestrict», «-Wreturn-local-addr» ΠΈ «-Wstringop-overflow», Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΎ число ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… ситуаций Π²Ρ‹Ρ…ΠΎΠ΄Π° Π·Π° допустимыС Π³Ρ€Π°Π½ΠΈΡ†Ρ‹.
  • Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ прямого указания Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Ρ… символов Π² ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ UTF-8), Π° Π½Π΅ Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ UCN (\uNNNN ΠΈΠ»ΠΈ \UNNNNNNNN). НапримСр:

    static const int π = 3;
    int get_naïve_pi() {
    return π;
    }

  • Для языка Π‘ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° порция Π½ΠΎΠ²Ρ‹Ρ… возмоТностСй Ρ€Π°Π·Π²ΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Π² Ρ€Π°ΠΌΠΊΠ°Ρ… стандарта C2X (Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ -std=c2x ΠΈ -std=gnu2x): появилась ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° синтаксиса «[[]]» для опрСдСлСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΊΠ°ΠΊ Π² Π‘++ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, [[gnu::const]], [[deprecated]], [[fallthrough]] ΠΈ [[maybe_unused]]. Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° синтаксиса u8» для опрСдСлСния констант с символами Π² UTF-8.
    Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ макросы Π² <float.h>. Π’ strftime Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ подстановки «%OB» ΠΈ «%Ob».

  • По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для Π‘ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Ρ‘Π½ Ρ€Π΅ΠΆΠΈΠΌ «-fno-common», ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ доступа ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ….
  • Для C++ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ ΠΎΠΊΠΎΠ»ΠΎ 16 ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΈ Π½ΠΎΠ²ΡˆΠ΅ΡΡ‚Π², Ρ€Π°Π·Π²ΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Π² стандартС C++20. Π’ Ρ‚ΠΎΠΌ числС Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово «constinit»
    ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ шаблонов «ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ«. ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ шаблона, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎ врСмя компиляции ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ Π½Π°Π±ΠΎΡ€ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² шаблона. ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ логичСских нСсоотвСтствий ΠΌΠ΅ΠΆΠ΄Ρƒ свойствами Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π²Π½ΡƒΡ‚Ρ€ΠΈ шаблона, ΠΈ свойствами Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

  • Π’ G++ обСспСчСно выявлСниС Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ повСдСния, Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²-констант Ρ‡Π΅Ρ€Π΅Π· constexpr. Π‘Π½ΠΈΠΆΠ΅Π½ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти компилятором ΠΏΡ€ΠΈ вычислСнии constexpr. Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ прСдупрСТдСния «-Wmismatched-tags» ΠΈ «-Wredundant-tags».
  • ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки:
    • «-fallocation-dce» для удалСния Π»ΠΈΡˆΠ½ΠΈΡ… ΠΏΠ°Ρ€ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² «new» ΠΈ «delete».
    • «-fprofile-partial-training» для ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ для ΠΊΠΎΠ΄Π°, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ³ΠΎΠ½.
    • «-fprofile-reproducible для управлСния ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ воспроизводимости профиля.
    • «-fprofile-prefix-path» для опрСдСлСния Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° сборки ΠΈΠ· исходных тСкстов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΏΡ€ΠΈ Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΉ (для «-fprofile-generate=profile_dir» ΠΈ «-fprofile-use=profile_dir»).
  • Π’ тСкстС ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ для ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌΡ‹Ρ… ΠΎΠΏΡ†ΠΈΠΉ обСспСчСн ΠΏΠΎΠΊΠ°Π· гипСрссылок, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ этим опциям. ΠŸΠΎΠ΄ΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° URL управляСтся ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΎΠΏΡ†ΠΈΠΈ «-fdiagnostics-urls».
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ прСпроцСссора «__has_builtin«, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ наличия встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° новая встроСнная функция «__builtin_roundeven» с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΉ Π² спСцификации ISO/IEC TS 18661 Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ округлСния, ΠΏΠΎΡ…ΠΎΠΆΠ΅ΠΉ Π½Π° «round», Π½ΠΎ ΠΎΠΊΡ€ΡƒΠ³Π»ΡΡŽΡ‰Π΅ΠΉ части большС 0.5 Π²Π²Π΅Ρ€Ρ… (ΠΊ Π±ΠΎΠ»ΡŒΡˆΠ΅ΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ), мСньшС 0.5 — Π²Π½ΠΈΠ· (Π΄ΠΎ нуля), Π° Ρ€Π°Π²Π½ΠΎΠΉ 0.5 — ΠΎΡ‚Ρ‚Π°Π»ΠΊΠΈΠ²Π°ΡΡΡŒ ΠΎΡ‚ чётности прСдпослСднСй Ρ†ΠΈΡ„Ρ€Ρ‹.
  • Для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ AArch64 Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ SVE2 ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° SVE (Scalable Vector Extension), Π² Ρ‚ΠΎΠΌ числС Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Ρ‚ΠΈΠΏΠΎΠ² SVE ACLE, обСспСчСно ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π Π°ΡΡˆΠΈΡ€Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° LSE (Large System Extensions) ΠΈ TME (Transactional Memory Extension). Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ инструкции, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Π² Armv8.5-A ΠΈ Armv8.6-A, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ инструкции для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ случайных чисСл, округлСния, привязки Ρ‚Π΅Π³ΠΎΠ² ΠΊ памяти,
    bfloat16 ΠΈ умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†. Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° процСссоров
    Arm Cortex-A77,
    Arm Cortex-A76AE,
    Arm Cortex-A65,
    Arm Cortex-A65AE,
    Arm Cortex-A34 ΠΈ
    Marvell ThunderX3.

  • Для ARM32 Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ABI FDPIC (64-разрядныС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ). ΠŸΠ΅Ρ€Π΅Π΄Π΅Π»Π°Π½Π° ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° 64-разрядных цСлочислСнных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° CPU
    Arm Cortex-A77,
    Arm Cortex-A76AE ΠΈ
    Arm Cortex-M35P. Π Π°ΡΡˆΠΈΡ€Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° инструкций ACLE для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ 32-разрядныС SIMD, 16-Π±ΠΈΡ‚Π½ΠΎΠ΅ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΡƒ с фиксациСй минимально ΠΈ максимально Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ срСдства для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² DSP. Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° инструкций ACLE CDE (Custom Datapath Extension).

  • Π—Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π° гСнСрация ΠΊΠΎΠ΄Π° ΠΈ вСкторизация Π² бэкСндС для GPU AMD Π½Π° Π±Π°Π·Π΅ ΠΌΠΈΠΊΡ€ΠΎΠ°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ GCN.
  • Для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ AVR Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° XMEGA-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… устройств
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608, ATmega1609, ATmega3208, ATmega3209, ATmega4808 ΠΈ ATmega4809.

  • Для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ IA-32/x86-64 Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π½ΠΎΠ²ΠΎΠ΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ Π½Π°Π±ΠΎΡ€Π° ΠΊΠΎΠΌΠ°Π½Π΄ Intel ENQCMD (-menqcmd). Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° CPU Intel Cooperlake (-march=cooperlake, Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ISA-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ AVX512BF16) ΠΈ Tigerlake (-march=tigerlake, Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ISA-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ MOVDIRI, MOVDIR64B ΠΈ AVX512VP2INTERSECT).
  • ОбъявлСна ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΉ ΠΈ вСроятно Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½Π° Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ выпускС рСализация ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ языка HSAIL (Heterogeneous System Architecture Intermediate Language) для Π³Π΅Ρ‚Π΅Ρ€ΠΎΠ³Π΅Π½Π½Ρ‹Ρ… Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… систСм Π½Π° Π±Π°Π·Π΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ HSA.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru