Nim

Nim
Kieliluokka ohjelmointikieli , sisennetty kieli [ d] , käännetty ohjelmointikieli ja metaohjelmointikieli [d]
Esiintyi 2008
Tekijä Andreas Rumpf [d] [1]
Tiedostotunniste _ .nimtai.nims
Vapauta
Vaikutettu Modula-3 , Object Pascal , Ada , C++ , Python , Lisp , Oberon ja C#
Lisenssi MIT-lisenssi [3]
Verkkosivusto nim-lang.org
OS cross-platform

Nim (entinen Nimrod ) on staattisesti kirjoitettu ohjelmointikieli , joka tukee proseduurillisia , olio- , toiminnallisia ja yleisiä ohjelmointityylejä.

Kehittäjien mukaan se yhdistää Lispin tehon, Pythonin yksinkertaisuuden ja selkeyden sekä C :n korkean suorituskyvyn . Tärkeä ominaisuus, jonka Lispistä perinyt kieli oli abstraktin syntaksipuun (AST) sisällyttäminen kielimääritykseen, jonka avulla se tukee tehokasta makrojärjestelmää ja tarjoaa siksi kätevän tavan luoda verkkoaluekohtaisia ​​kieliä ( DSL:t) .

Historia ja sovellus

Nimin loi vuonna 2004 Andreas Rumpf ( saksa:  Andreas Rumpf ). Kielen kolme perusperiaatetta, joihin viitataan nimellä "3E", otettiin (prioriteettijärjestyksessä):

Kehitys suoritettiin alun perin Object Pascalilla ( Free Pascal -kääntäjä ). Ensimmäinen versio, joka pystyi kääntämään itsensä (eli kääntäjä kirjoitettiin uudelleen itse Nimissä), julkaistiin 22. elokuuta 2008 (versio 0.6.0). Tähän mennessä Rumpfiin oli liittynyt joukko vapaaehtoisia, jotka olivat mukana kielen suunnittelussa ja kehittämisessä.

Kielenkääntäjä muuntaa Nim-kielellä kirjoitetun koodin C- , C++- , Objective-C- tai JavaScriptiksi [4] ja kutsuu sitten kääntäjän tai tulkin sopivalle kielelle. Melko suuri määrä C- ja C++-kääntäjiä on tuettu, käytännössä C-kääntäminen valitaan useimmiten tehokkuuden ( C-kääntäjien optimoinnin ansiosta ) ja siirrettävyyden vuoksi. C-koodin siirrettävyys puolestaan ​​mahdollistaa Nim-ohjelmien suorittamisen Linuxissa , BSD :ssä , macOS :ssä , Windowsissa ja monissa muissa käyttöjärjestelmissä .

Syntaksi ja paradigmatiikka

Nim, kuten Python , käyttää sisennystä lohkoerottimina (ns. pakollinen sisennyssääntö ), vaikka lohkot voidaan erottaa myös avainsanoilla esiprosessorinendX suodattimissa (syntaksikääre ). Kielessä kirjainkoolla ei ole merkitystä (ainoastaan ​​tunnisteiden ensimmäisen kirjaimen kirjainkoko otetaan huomioon). Melko epätavallinen ominaisuus on, että tunnisteiden alaviivat jätetään huomiotta.

Kieltä voidaan käyttää sekä pakottavana että proseduurina , mutta se tukee myös olio- , toiminnallisia ja yleisiä ohjelmointityylejä .

Objektit, joissa on periytymistä , ylikuormitusta , polymorfiaa ja useita lähetyksiä (monimenetelmät), mahdollistavat oliosuuntautuneen ohjelmoinnin . Inline syntaktinen sokeri ajaa kohti oliosuuntautunutta tyyliä ja kutsuketjuja: funct(a, b)korvataan a.funct(b).

Metaohjelmointia tuetaan käyttämällä malleja, makroja, ehdollista käännöstä käännösaikafunktion suorituksella (CTFE). Nim antaa sinun luoda mukautettuja lausuntoja.

Kielessä on monia korkean tason tyyppejä , tavallisista merkkijonoista ja taulukoista sekvensseihin, joukkoihin , monikkoihin , enumeihin ja niin edelleen. Matalan tason järjestelmätiedot voivat olla hallitsemattomia, mutta useimpia kasaan luotuja objekteja ylläpitää roskienkerääjä , mikä vapauttaa ohjelmoijan useimmista muistinhallintaongelmista. Se käyttää ei-seurantavaa roskankerääjää, jossa on laiska viitteiden laskeminen ja liputusalgoritmi ympyräviitteiden havaitsemiseen [ . Työskentely on myös muun tyyppisen muistinhallinnan parissa - ARC, joka laskee viitteitä RAII :lla ja siirtää semantiikkaa , ja ORC, joka on ARC:n lisäosa, johon on lisätty pyöreä viitekerääjä. Voit myös käyttää Boehm roskakoria tai kieltäytyä roskien keräämisestä kokonaan.

Nim tukee myös moduulimekanismia itsenäisten kirjastojen tai pakettien eristämiseen. Nim-standardikirjastossa on toimintoja I/O:n tekemiseen, vuorovaikutukseen käyttöjärjestelmän kanssa, merkkijonojen käsittelyyn (tukee unicodea , säännöllisiä lausekkeita ja RW-kielioppeja eri jäsentimillä), komentorivivalintojen kanssa työskentelyyn, työskentelyyn erilaisia ​​tiedostomuotoja (esimerkiksi XML tai CSV).

Vuorovaikutus muiden kielten kanssa

C - sovellusbinaariliitäntää (ABI) tuetaan yhtä hyvin kuin C-standardikirjastoa , mukaan lukien olemassa oleva koodi ja kirjastot. Nim tukee C-funktioiden ja Windows-kirjastojen funktioiden kutsumiskäytäntöjä ( dynlib- moduulin avulla voit käyttää dynaamisten kirjastojen toimintoja (tiedostot .dll , .so , .dylib ). Lisäksi tuetaan ABI C ++ :a ja Objective C :tä , sekä integrointi JavaScriptin kanssa .

Siten kielellä on sidoksia useisiin kirjastoihin järjestelmäkirjastoista ( POSIX , Windows) DBMS -kirjastoihin ( MySQL , PostgreSQL , SQLite , ODBC ) ja komentosarjakielistä (Python, Lua , Tcl ) grafiikkakirjastoihin. ( OpenGL , Kairo , SDL ).

Tuki GTK- , X11- , IUP- ja Windows API -sidoksille on otettu käyttöön, myös libcurl- , libzip- ja PCRE - sidokset ovat hyödyllisiä .

Esimerkkejä

Annetut koodiesimerkit ovat oikein Nim 1.4.4:lle. Syntaksi ja semantiikka voivat muuttua tulevissa versioissa [5] .

Ohjelmakoodi Hello, World! Nimille:

echo ( "Hei, maailma!" ) # Sulkumerkit voidaan jättää pois kaiku "Hei, maailma!"

Se on mahdollista myös stdout.write()-funktion kautta.

stdout . kirjoittaa ( "Hei, maailma! \n " )

Merkkijonojen vaihto:

proc reverse ( s : string ): merkkijono = tulos = "" # implisiittinen tulosmuuttuja i :lle lähtölaskennassa ( s . high , 0 ) : tulos . lisää s [ i ] let str1 = "Käännä tämä!" echo "Käänteinen: " , käänteinen ( str1 )

Yksi epätavallisimmista ominaisuuksista on implisiittinen muuttuja result. Jokaisella Nim-proseduurilla, joka palauttaa arvon, on implisiittinen tulosmuuttuja. Se tallentaa arvon, jonka funktio palauttaa. Iteraattoriafor kutsutaan silmukassa . Jos iteraattori jätetään pois, kääntäjä yrittää käyttää elementtikohtaisia ​​iteraattoreita tai jos sellainen on määritetty määritetylle tyypille. countdownitemspairs (в зависимости от числа переменных в for),

Nim tukee tyyppipäätelmää:

let hello = "Hei, maailma!" # Tyyppiä ei vaadita # Kääntäjä itse voi päätellä prosessin proc doWork argumenttityypit ja palautusarvot ( jotain : auto ): auto = tulos = jotain + jotain echo doWork ( 5 ) # Lähdöt 10

Tunnisteet voivat koostua Unicode-merkeistä:

proc hello ( nimi : string ) = echo ( "Hei, " , nimi , "!" ) hei ( "mies" )

Esimerkki metaohjelmoinnista Nimissä malleja käyttäen:

malli genType ( nimi , kentän nimi : kirjoittamaton , kenttätyyppi : typedesc ) = tyypin nimi = objektin kentän nimi : kenttätyyppi genType ( Test , foo , int ) var x = Testi ( foo : 4566 ) echo ( x . foo ) # 4566

Malli genTypesuoritetaan käännöshetkellä ja luo Test.

Seuraava ohjelma näyttää FFI:n käytön olemassa olevan C-koodin kutsumiseen.

proc printf ( formatstr : cstring ) {. header : "<stdio.h>" , varargs .} printf ( " %s %d \n " , " foo " , 5 )

Esimerkissä funktio tavallisesta C-kirjastosta printftuodaan Nimiin ja sitä käytetään sitten [6] .

Muistiinpanot

  1. 1 2 https://github.com/nim-lang/nim
  2. https://nim-lang.org/blog/2022/09/27/version-168-released.html
  3. GitHub  (englanniksi) - 2007.
  4. Nim-taustajärjestelmän  integrointi . nim-lang.org. Käyttöpäivä: 17. kesäkuuta 2017. Arkistoitu alkuperäisestä 29. joulukuuta 2016.
  5. Nim-koodiesimerkkejä Rosetta Codessa . Käyttöpäivä: 20. tammikuuta 2017. Arkistoitu alkuperäisestä 7. maaliskuuta 2017.
  6. Mitä erityistä Nimissä on? . Hook Race (1. tammikuuta 2015). Haettu 20. tammikuuta 2017. Arkistoitu alkuperäisestä 28. toukokuuta 2017.

Kirjallisuus

kahdeksassa osassa

Linkit