Nim 3.0 programmeerimiskeele arendamise protsessis areneb uus kompilaator Nimony, mille disaini alusprintsiibiks on enam-vähem ettearvatava täitmise aja saavutamine (Worst Case Execution Time, WCET). See nõue tuleneb rangelt reaalajasüsteemide suunitlusest, kus määramatud käitumised ei ole lubatavad. Selle tagajärjel välistab Nimony arhitektuur JIT-kompilaatorite ja jälgimisjaotajate (tracing garbage collectors) kasutamise, kuna nende toimingud võivad põhjustada ettearvamatuid viivitusi.
Etearvatava saavutamiseks kaardistatakse primitiivsed andmetüübid (täisarvud, sümbolid) otse seadme sõnadele ja baitidele vastavale arhitektuurile. Koondatud tüübid (struktuurid, objektid) luuakse ilma kaudse aadressimiseta (indirection), paigutades need otse virna või teiste andmestruktuuride sisse. See lähenemine minimeerib kulusid ja tagab läbipaistvama vastavuse allika koodi ja genereeritud masinkoodi vahel.
Mälu automaatse haldamise (MM) valdkonnas loob Nimony mitmekesisusest, mis on saadaval Nim 2.0-s, standardiseeritud režiimi: „mm:atomicArc“. See režiim põhineb viidete arvestusel, kasutades aatomoperatsioone, täiustatud liikumissemantiiga (move semantics) ja destruktorite kutsumisega objekti hävitamisel, mis toob lähemale lähenemise Rusti ja kaasaegse C++ praktikale.
Oluline uuendus on objekti selge eraldamine aistsükliliste ja potentsiaalselt tsükliliste vahel. Vaikimisi peetakse objekte aistsüklilisteks (.acyclic), mis on uus käitumine. Andmetüüpide puhul, mille instantsid võivad moodustada tsüklilisi linke, on vajalik selge annotatsioon pragma .cyclic. Töö käib uue tsükliliste linkide kogumise algoritmi väljatöötamise kallal, kuid selle tööstuslikuks kasutamiseks valmisoleku osas ei ole hetkel garantii. MM, mis põhineb destruktoritel, toob esile selle koostöövõime: ressursside haldust, mis nõuab vabastamist (nt failideskriptid, võrgu soketid, kanalid), integreeritakse loomulikult vastava tüübi destruktorite kaudu.
Nimony vigade käsitlemise lähenemine on läbi teinud olulisi muudatusi. Nim autor väljendab rahulolematust traditsiooniliste erandimehhanismide ja nende emuleerimise üle algebraliste andmetüüpide (sum types) kaudu. Selle asemel pakutakse välja mõiste, mis integreerib vigade oleku otse andmeobjekti sisse. Näiteks tuuakse välja: vigade esitamine sisend-väljundvoogudes spetsiaalse olekuga, NaN kasutamine ujuvkomaga numbrite jaoks või low(int) kehtetute täisarvuväärtuste jaoks. Situatsioonides, kus objekt ei suuda vigade olekut kapseldada, pakutakse välja kasutada lõime-lokaalset (thread-local) muutujat signaalimiseks.
Siiski jääb Nim'i traditsiooniline erandimehanism kehtima, kuid ühe olulise täpsustusega: igasugune protseduur, mis suudab genereerida erandi, peab nüüd olema kohustuslikult märgistatud pragma {.raises.}. See nõue on suunatud potentsiaalsete mitte-lokaalsete juhtimisüleminekute selgusele.
Alternatiivina või täiendusena võetakse kasutusele uus loetletud tüüpi ErrorCode. See tüüp on tüübikindel ja nõuab kõigi võimalike variantide põhjalikku käsitlemist (sarnane enum'i case'ile). ErrorCode on kavandatud selliselt, et see saaks esindada erinevate süsteemide ja protokollide standardseid veakoode, näiteks POSIX errno, Windows API veakoodid ja HTTP olekud. Eesmärk on ühtlustada vigade käsitlemine eri raamatukogudes ja tagada võimalus otse edastada süsteemivigu (nt „ketas on täis”) vastavatesse olekukoodidesse (nt HTTP 507) ilma täiendava teisendamiseta. ErrorCode'i kasutamine võimaldab samuti vigu käsitleda ja levitada, ilma et oleks vaja mälu kuhjata, mis on kriitilise tähtsusega mälu puudulikkuse olukordades (OOM).
Mälu ebaõnnestumise (Out of Memory, OOM) olukordade töötlemine Nimony's on rakendatud erinevalt tavalistest praktikatest, kus programm lõpetatakse avariiliselt («die on OOM»). Selle asemel pakutakse mehhanismi, mis võimaldab rakendusel jätkata tööd. Konteinerid ja mälu eraldamise toimingud, mis ei suuda taotlust täita, kutsuvad esile üle kirjutatava oomHandler'i töötleja. Vaikimisi rakendus salvestab ebaõnnestunud taotluse suuruse lõime-lokaalsetesse muutujatesse ja lubab olemasoleva tegevuse jätkemise. Aktiivse mälu puudumise seisundit saab jooksva lõime puhul kontrollida, kutsudes välja threadOutOfMem().
Arendaja võib pakkuda oma töötlust oomHandler, näiteks logimiseks või rakenduse hädaseisundisse viimiseks, kui selline käitumine on eelistatud. Oluline aspekt on viidatud objektide (ref object) loomise operatsioonide käsitlemine, mis võivad OOM tõttu ebaõnnestuda. Nimony-s võib selliste operatsioonide tulemus (näiteks läbi new või sarnaste konstruktorite) olla nil, ja kompilaator sunnib selle olukorra käsitlemist nagu valikuliselt tüüpide (Option) puhul, vältides seeläbi nullviidatud vigade tekkimist. {.raises.} annotatsiooniga protseduuride kontekstis võib nil-i tagastatav väärtus automaatselt muunduda ErrorCode.OutOfMemError-iks.
Nimony üldprogrammeermise mehhanism (generics) on võrreldes Nim 2.0-ga edasi arenenud. Peamine täiustus seisneb selles, et üldkoodi täielik tüübikontroll toimub nüüd selle määratlemise etapil, mitte ainult konkreetsete tüüpide instantsimise ajal. Oodata on, et see võimaldab avastada vigu varasemates kompileerimise etappides, pakkuda informatiivsemaid veateateid ja parandada arendustööriistade (IDE) toetust, sealhulgas koodi automaatset täiendamist.
Nimisüsteemid (concepts), mis on juba olemas Nim-is, säilitavad oma rolli statilise mehhanismina, mis kirjeldab nõudeid üldiste funktsioonide ja tüüpide parameetrite tüüpidele. Need võimaldavad formaalselt määrata, millistele operatsioonidele või omadustele peab tüüp vastama, et seda saaks kasutada antud üldises kontekstis.
Nimony püüab ühtlustada asünkroonse ja mitme lõime programmeerimise mudeleid ühes spawn konstruktsioonis. Otsus, kas spawn kaudu käivitatud ülesanne töötatakse sama lõime (asünkroonselt) või eraldi lõimes, mis tuleb basseinist (mitme lõime) välja, tehakse ajakava poolt täitmise ajal (runtime). See seab teatud nõuded spawnile edastatavatele argumentidele: need peavad olema lõimeohutud.
Konkurentsimudeli sisemine rakendus põhineb jätkudel (continuations) ning kompilaator teisendab programmi jätkede edastamise stiili (Continuation-Passing Style, CPS). Toodud on, et spawn konstruktsioon ei ole keele sisseehitatud funktsioon, vaid kompilaatori plugin.
Paralleelsus peetakse lihtsamaks ülesandeks kui konkurentsus. Puhtalt paralleelse kodeerimise kirjutamiseks, mis keskendub arvutustele (nt andmeMassiivide töötlemine), pakub Nimony spetsiaalseid konstruktsioone, nagu paralleelsed for-tsüklid, mida tähistatakse operaatoriga „||“. See võimaldab rakendada paralleelseid algoritme ilma juhtimisvoogude muutujate (flow vars) kasutamiseta, mis võib olla mugav teaduslike arvutuste või GPU programmeerimise ülesannete puhul.
Nimi metaprogrammeerimissüsteem, mis on tuntud oma makrode poolest, areneb Nimony's kompilatsioonipistikprogrammide (compiler plugins) suunas. Pistikprogrammid on kood, mis kompileeritakse natiivseteks käskudeks ja täidetakse kompilatsiooni hilisemates etappides, pärast tüübikontrolli etappi. See annab pistikprogrammidele juurdepääsu täielikule teabele tüüpide ja analüüsitava koodi semantika kohta.
Lubatud on täiustatud ja mugavamad API-d pistikprogrammide arendamiseks. NIF-i (Nimi vaheformaat) kasutamine peaks samuti lihtsustama erinevate koodimuutuste teostamist. Pistikprogrammid saavad töötada inkrementaalselt ja paralleelselt, mis suurendab kompileerimise jõudlust.
Pistikprogrammide tüübid:
- Mallipistikprogrammid (Template Plugins): Siduvad end konkreetsete mallidega ja töötlevad nendega seotud koodi.
- Modulaarpistikprogrammid (Module Plugins): Saavad sisendiks kogu mooduli AST (Abstraktne süntaksipuu) ja peavad tagastama muudetud puu. Konstruktsioon spawn on näiteks modulaarse pistikprogrammi rakendamise näide.
- Iteraatorite pistikprogrammid: Sarnanevad mallipistikprogrammidele, kuid rakenduvad iteraatoritele.
- Nominaalsete tüüpide pistikprogrammid: Võivad olla seotud konkreetsete andmetüüpidega, asendades Nim-is oleva „terminite ümberkirjutamise makrode” mehhanismi (term rewriting macros). See võimaldab rakendada optimeerimisi, nagu ajutiste objektide kõrvaldamine matriitsoperatsioonide täitmise ajal.
Nimony dokumentatsiooni jaoks on loodud sait, mis on täielikult genereeritud tehisintellekti poolt ja autor Nim on selle tõele vastavuse kontrollinud.
Allikas: opennet.ru
