Выпуск языка программирования Nim 2.2.6

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ Ρ€Π΅Π»ΠΈΠ· языка систСмного программирования Nim 2.2.6. ОбновлСниС Π²Ρ‹ΡˆΠ»ΠΎ спустя ΡˆΠ΅ΡΡ‚ΡŒ мСсяцСв послС Ρ€Π΅Π»ΠΈΠ·Π° вСрсии 2.2.4 ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ 141 ΠΊΠΎΠΌΠΌΠΈΡ‚ с исправлСниями ошибок ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡΠΌΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Nim – статичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ язык программирования с синтаксисом, Π²Π΄ΠΎΡ…Π½ΠΎΠ²Π»Ρ‘Π½Π½Ρ‹ΠΌ Python, ΠΈ возмоТностями мСтапрограммирования Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Lisp. Π―Π·Ρ‹ΠΊ компилируСтся Π² C, C++ ΠΈ JavaScript, обСспСчивая ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ C ΠΏΡ€ΠΈ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ высокоуровнСвых языков. Код ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° поставляСтся ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ MIT.

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ особСнности Nim Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ ΠΌΠΎΡ‰Π½ΡƒΡŽ систСму макросов, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… Π½Π° AST Π²ΠΎ врСмя компиляции, Ρ€Π°Π·Π²ΠΈΡ‚ΡƒΡŽ систСму ΠΎΠ±ΠΎΠ±Ρ‰Ρ‘Π½Π½ΠΎΠ³ΠΎ программирования с ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚Π°ΠΌΠΈ, ΠΌΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π΄ΠΈΡΠΏΠ΅Ρ‚Ρ‡Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ (multiple dispatch), Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… стратСгий (ARC/ORC, refc, ΠΌΠ°Ρ€ΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°-ΠΈ-ΠΏΠΎΠ΄ΠΌΠ΅Ρ‚Π°Π½ΠΈΠ΅), Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ async/await для асинхронного программирования ΠΈ FFI для простой ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ с C/C++/JavaScript. Nim позиционируСтся ΠΊΠ°ΠΊ систСмный язык, подходящий для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΡ‚ встраиваСмых систСм Π΄ΠΎ Π²Π΅Π±-сСрвСров, с Π°ΠΊΡ†Π΅Π½Ρ‚ΠΎΠΌ Π½Π° ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ, Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ памяти ΠΈ удобство Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ измСнСния:

  • ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ move-сСмантики для ΠΏΠΎΠ»Π΅ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ научился Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ примСнСния move-ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π΅ ΠΏΠΎΠ»Π΅ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π Π°Π½Π΅Π΅ конструкции Π²ΠΈΠ΄Π° Β«return obj.fieldΒ» ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΈ ΠΊ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ компилятор ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ примСняСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅: proc getField(obj: MyObject): string = return obj.field # Π’Π΅ΠΏΠ΅Ρ€ΡŒ move вмСсто copy

    Π­Ρ‚ΠΎ особСнно Π²Π°ΠΆΠ½ΠΎ для тяТёлых Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… (строки, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ с рСсурсами), Π³Π΄Π΅ устранСниС лишнСго копирования Π΄Π°Ρ‘Ρ‚ Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹ΠΉ прирост ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π±Π΅Π· измСнСния ΠΊΠΎΠ΄Π°.

  • Полная ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° closure-ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ трансформации Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ-ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ пСрСписан, Ρ‡Ρ‚ΠΎ ΠΊΠ°Ρ€Π΄ΠΈΠ½Π°Π»ΡŒΠ½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΠ»ΠΎ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ async-ΠΊΠΎΠ΄Π° с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹ критичСскиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ SIGSEGV ΠΏΡ€ΠΈ использовании try/except Π½Π΅ Π½Π° Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅: iterator problematicIterator(): int {.closure.} = for i in 0..10: try: if i == 5: raise newException(ValueError, Β«testΒ») yield i except ValueError: discard # Π Π°Π½Π΅Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΎ SIGSEGV

    Π’Π°ΠΊΠΆΠ΅ Ρ€Π΅ΡˆΠ΅Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ пробросом ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π² finally-Π±Π»ΠΎΠΊΠ°Ρ… Π²Π½ΡƒΡ‚Ρ€ΠΈ closure-ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ².

  • Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡ, связанныС с ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ
    • УстранСна Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² сборщикС мусора ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ цикличСских структур Π΄Π°Π½Π½Ρ‹Ρ…, которая ΠΌΠΎΠ³Π»Π° ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ ошибки Β«Illegal storage accessΒ». ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° сущСствовала с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° создания языка ΠΈ ΠΏΡ€ΠΎΡΠ²Π»ΡΠ»Π°ΡΡŒ ΠΏΡ€ΠΈ слоТных Π³Ρ€Π°Ρ„Π°Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² с Π²Π·Π°ΠΈΠΌΠ½Ρ‹ΠΌΠΈ ссылками.
    • Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ порядок уничтоТСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠ³ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΡŽ ΠΊ ΡƒΠΆΠ΅ освобоТдённой памяти: type Resource = object data: ptr Data Container = object resource: Resource other: OtherResource # Π’Π΅ΠΏΠ΅Ρ€ΡŒ дСструкторы Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ порядкС: # сначала other, Π·Π°Ρ‚Π΅ΠΌ resource
    • Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ ORC ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎ ΠΏΠΎΠΌΠ΅Ρ‡Π°Π» окруТСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ ΠΊΠ°ΠΊ цикличСскиС, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΎ ΠΊ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ°ΠΌ освобоТдСния памяти ΠΈΠ»ΠΈ ΡƒΡ‚Π΅Ρ‡ΠΊΠ°ΠΌ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π°Π½Π°Π»ΠΈΠ· Ρ†ΠΈΠΊΠ»ΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ.
    • Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½Π° ΡƒΡ‚Π΅Ρ‡ΠΊΠ° сокСтов Π² asyncnet ΠΏΡ€ΠΈ ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… согласования TLS-соСдинСния: proc handleClient() {.async.} = var socket = await server.accept() try: await socket.setupSSL() # ΠŸΡ€ΠΈ ошибкС здСсь socket Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ закрываСтся except SSLError: discard # Π‘ΠΎΠΊΠ΅Ρ‚ большС Π½Π΅ ΡƒΡ‚Π΅ΠΊΠ°Π΅Ρ‚
  • ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ исправлСния Π² компиляторС.
    • УстранСна рСгрСссия, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ с static-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ, ΠΏΠ΅Ρ€Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅: proc test[N: static int]() = var global {.global.}: array[N, int] global[0] += 1 echo global[0] test[5]() # Π’Ρ‹Π²ΠΎΠ΄ΠΈΠ»ΠΎ: 1 test[5]() # Π”ΠΎΠ»ΠΆΠ½ΠΎ: 2, Π½ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠ»ΠΎ: 1 (Π±Ρ‹Π»ΠΎ ΠΏΠ΅Ρ€Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ)
    • Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½Π° гСнСрация ΠΊΠΎΠ΄Π° для Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² рСкурсивных функциях, которая ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»Π° ΠΊ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΌΡƒ повСдСнию.
    • РСшСна дрСвняя ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ C-ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΈ использовании конструкторов для Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π΅Ρ€ΠΎΠ²: converter toInt(x: MyType): int = let global {.global.} = MyType() # Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π» Π½Π΅Π²Π°Π»ΠΈΠ΄Π½Ρ‹ΠΉ C-ΠΊΠΎΠ΄ result = global.value
    • УстранСно ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ компилятора ΠΏΡ€ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠ° Defect ΠΈ использовании doAssert Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… контСкстах.
  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ Π² систСмС Ρ‚ΠΈΠΏΠΎΠ²
    • Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½Π° Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° lent-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ· case/if Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ: proc getBest(a, b: string): lent string = if a.len > b.len: return a # Π Π°Π½Π΅Π΅: ошибка компиляции else: return b
    • УстранСна ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ сохранСниСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ lent-ΠΏΠΎΠ»Π΅ΠΉ Π² ΠΎΠ±ΠΎΠ±Ρ‰Ρ‘Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠ°Ρ…: type Wrapper[T] = object data: lent T proc process[T](w: Wrapper[T]) = echo w.data # Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ сохраняСтся
    • ВосстановлСна ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ result для Ρ‚ΠΈΠΏΠΎΠ² с requiresInit, которая Π±Ρ‹Π»Π° сломана Π² вСрсии 2.2: type MustInit {.requiresInit.} = object value: int proc test(): MustInit = discard # Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Π²Ρ‹Π΄Π°Ρ‘Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΎ Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ result
    • Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΎ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ нСкопируСмости (Β«.noCopyΒ») Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°: type Base {.noCopy.} = object Derived = object of Base var a: Derived var b = a # Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ
  • ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ
    • УскорСниС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Β«@Β» для Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²: устранСна критичСская дСградация ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΈ создании ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ ΠΈΠ· массивов простых Ρ‚ΠΈΠΏΠΎΠ²: let arr = [1, 2, 3, 4, 5] let s = @arr # Π‘Ρ‹Π»ΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎ
    • ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ vmgen.sameConstant: Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ускорСна компиляция Π·Π° счёт ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ сравнСния констант Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС компилятора ΠΈ сокращСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ выдСлСния памяти.
    • Π Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° cast Π² ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ большС Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅Π½ΡƒΠΆΠ½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅: let data = cast[ptr MyType](address)[] # Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π±Π΅Π· копирования
  • Backend-спСцифичныС исправлСния
    • JavaScript
      • =destroy для Π½Π΅-var Ρ‚ΠΈΠΏΠΎΠ²: исправлСна гСнСрация дСструкторов, которая Ρ€Π°Π½Π΅Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»Π° ΠΊ ошибкам компиляции.
      • cast[char] для Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ > 255: Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ выполняСтся усСчСниС, ΠΊΠ°ΠΊ Π² C-backend.
      • ΠšΠΎΠ½Ρ†Π΅ΠΏΡ‚Ρ‹ Π² varargs: устранён Π²Ρ‹Π²ΠΎΠ΄ ошибки Β«internal errorΒ» ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΠΎΠ² Π² varargs.
    • C++: ВосстановлСна L-valueness для совмСстимых Ρ‚ΠΈΠΏΠΎΠ² Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ сломано Π² рСгрСссии ΠΌΠ΅ΠΆΠ΄Ρƒ вСрсиями 2.2.2 ΠΈ 2.2.4: # nim cpp var x: CppCompatibleType takeRef(x) # Π‘Π½ΠΎΠ²Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ lvalue
    • C (refc)
      • pthread Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ…: исправлСна гСнСрация ΠΊΠΎΠ΄Π° для pthread_mutex_t с использованиСм .abi;
      • ΠžΠ±ΠΎΠ±Ρ‰Ρ‘Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ с GC-ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ: устранСна гСнСрация Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ C-ΠΊΠΎΠ΄Π° для generic-Ρ‚ΠΈΠΏΠΎΠ², содСрТащих ΡƒΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ;
  • Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина
    • Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ присваивания: мноТСствСнныС исправлСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ Π½Π° этапС компиляции.
    • Case-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ· compileTime proc: исправлСна ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΊΠ°ΠΊ static-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².
    • repr для Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… строк ΠΏΠΎΠ΄ refc: устранён RangeDefect ΠΏΡ€ΠΈ использовании repr.
  • Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡ Π² стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅
    • Π’ strutils.formatSize исправлСна Ρ€Π°Π±ΠΎΡ‚Π° с большими значСниями, Π±Π»ΠΈΠ·ΠΊΠΈΠΌΠΈ ΠΊ int64.high: echo formatSize(9223372036854775807) # Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
    • Π’ deques восстановлСна ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ повСдСния ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° items ΠΌΠ΅ΠΆΠ΄Ρƒ вСрсиями 2.0.16 ΠΈ 2.2.0.
    • Π’ lists.SinglyLinkedList.remove устранён AssertionDefect ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ элСмСнтов ΠΈΠ· односвязного списка.
    • Π’ tables.withValue исправлСно условиС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π² макросС withValue для нСизмСняСмых Ρ‚Π°Π±Π»ΠΈΡ†.
  • ΠŸΡ€Π°Π³ΠΌΡ‹ ΠΈ области видимости
    • Π’ Β«{.push raises: [].}Β» исправлСно Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ лСксичСских областСй видимости для push-ΠΏΡ€Π°Π³ΠΌ с raises.
    • Устранён эффСкт Β«ΡƒΡ‚Π΅Ρ‡ΠΊΠΈΒ» ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ pragma-Π±Π»ΠΎΠΊΠΎΠ²: {.push warning[UnusedImport]: off.} import module1 {.pop.} import module2 # ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΡ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹
  • ΠŸΡ€ΠΎΡ‡ΠΈΠ΅ Π²Π°ΠΆΠ½Ρ‹Π΅ исправлСния
    • Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ cstring: Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Π²ΡˆΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Β«<Β» ΠΈ Β«cmpΒ» для cstring.
    • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² float: Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° коррСктная ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² для чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ
    • filterIt ΠΈ rvalue: исправлСно ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ rvalue вмСсто lvalue
    • Устранён FieldDefect ΠΏΡ€ΠΈ сравнСнии ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° этапС компиляции.
    • hasCustomPragma послС копирования typedesc: восстановлСна Ρ€Π°Π±ΠΎΡ‚ΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ послС копирования дСскрипторов Ρ‚ΠΈΠΏΠΎΠ².
    • nim doc ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ поля: исправлСно использованиС ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² ΠΎΡ‚ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ для ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Ρ….

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

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ