Nim

Nim
Nyelvóra programozási nyelv, behúzott nyelv [ d] , lefordított programozási nyelv és metaprogramozási nyelv [d]
Megjelent 2008
Szerző Andreas Rumpf [d] [1]
Fájlkiterjesztés _ .nimvagy.nims
Kiadás
Befolyásolt Modula-3 , Object Pascal , Ada , C++ , Python , Lisp , Oberon és C#
Engedély MIT engedély [3]
Weboldal nim-lang.org
OS platformközi

A Nim (korábban Nimrod ) egy statikusan tipizált programozási nyelv , amely támogatja az eljárási , objektumorientált , funkcionális és általános programozási stílusokat.

A fejlesztők szerint egyesíti a Lisp erejét, a Python egyszerűségét és tisztaságát , valamint a C nagy teljesítményét . A Lisp-től örökölt nyelv fontos jellemzője volt egy absztrakt szintaxisfa (AST) felvétele a nyelvi specifikációba, amely lehetővé teszi egy erőteljes makrórendszer támogatását, és ezért kényelmes eszközt biztosít tartomány-specifikus nyelvek létrehozásához ( DSL-ek) .

Előzmények és alkalmazás

A Nim-et 2004 -ben hozta létre Andreas Rumpf ( németül:  Andreas Rumpf ). A nyelv három alapvető elvét, amelyeket "3E"-ként említünk, (prioritási sorrendben):

A fejlesztés eredetileg Object Pascalon ( Free Pascal fordító ) történt. Az első verzió, amely képes volt lefordítani magát (vagyis a fordítót magában a Nimben írták át), 2008. augusztus 22-én adták ki (0.6.0-s verzió). Ekkorra Rumpfhoz számos önkéntes csatlakozott, akik részt vettek a nyelv tervezésében és fejlesztésében.

A nyelvi fordító a Nim nyelven írt kódot C- , C++ -, Objective-C- vagy JavaScript -be alakítja [4] , majd meghívja a megfelelő nyelv fordítóját vagy értelmezőjét. Meglehetősen nagyszámú C és C++ fordító támogatott, a gyakorlatban a C-re fordítást leggyakrabban a hatékonyság (a C fordítók optimalizálásának köszönhetően ) és a hordozhatóság miatt választják. A C kód hordozhatósága viszont lehetővé teszi a Nim programok futtatását Linuxon , BSD -n , macOS -en , Windowson és sok más operációs rendszeren .

Szintaxis és paradigmatika

A Nim a Pythonhoz hasonlóan a behúzást használja blokk-elválasztóként (az úgynevezett kötelező behúzási szabály ), bár a blokkokat kulcsszavakkal is el lehet választani az előfeldolgozóendX szűrőkben (szintaktikai wrapper ). A nyelv részben nem érzékeny a kis- és nagybetűkre (csak az azonosítók első betűjének kis- és nagybetűjét veszik figyelembe). Meglehetősen szokatlan jellemző, hogy az azonosítók aláhúzásjeleit figyelmen kívül hagyja.

A nyelv kötelező és procedurálisként is használható , de támogatja az objektumorientált , funkcionális és általános programozási stílusokat is .

Az öröklődő , túlterhelt , polimorfizmusú és többszörös továbbítású (multimethods) objektumok objektumorientált programozást tesznek lehetővé . A szövegközi szintaktikai cukor az objektum-orientált stílus és a hívási láncok felé tolódik : funct(a, b)helyébe a.funct(b).

A metaprogramozást sablonok, makrók, feltételes fordítás, fordítási idejű függvény-végrehajtás (CTFE) támogatja . A Nim lehetővé teszi egyéni utasítások létrehozását.

A nyelvnek számos magas szintű típusa van, a közönséges karakterláncoktól és tömböktől a szekvenciákig, halmazokig, sorokig , enumokig és így tovább. Előfordulhat, hogy az alacsony szintű rendszeradatokat nem kezelik, de a kupacban létrehozott objektumok többségét a szemétgyűjtő karbantartja , ami megszabadítja a programozót a legtöbb memóriakezelési probléma alól. Nem nyomkövető szemétgyűjtőt használ, lusta referenciaszámlálással és jelző algoritmussal a körkörös hivatkozások észlelésére . Dolgoznak más típusú memóriakezeléseken is – az ARC-n, amely RAII - val referenciák számlálását és a mozgatási szemantikát végzi , valamint az ORC-n, amely az ARC kiegészítője egy körkörös referenciagyűjtővel. Használhatja a Boehm szemétgyűjtőt is , vagy teljesen megtagadhatja a szemétszállítást.

A Nim egy modulmechanizmust is támogat a független könyvtárak vagy csomagok elkülönítésére. A Nim szabványkönyvtár rendelkezik funkciókkal az I/O végrehajtásához, az operációs rendszerrel való interakcióhoz, a karakterláncokkal való munkához (támogatja a unicode , a reguláris kifejezéseket és az RW nyelvtanokat különböző elemzőkkel), a parancssori opciókkal való munkavégzéshez, a különféle fájlformátumok (például XML vagy CSV).

Interakció más nyelvekkel

A C Application Binary Interface (ABI) ugyanúgy támogatott, mint a C Standard Library , beleértve a meglévő kódokat és könyvtárakat. A Nim támogatja a C függvények és a Windows könyvtárakból származó függvények hívási konvencióit ( a dynlib modul lehetővé teszi a dinamikus könyvtárak funkcióinak elérését (fájlok .dll , .so , .dylib ). Ezen kívül az ABI C ++ és az Objective C támogatott , valamint a JavaScript -szel való integráció .

Így a nyelv számos könyvtárhoz kötődik, a rendszerkönyvtáraktól ( POSIX , Windows) a DBMS -könyvtárakig ( MySQL , PostgreSQL , SQLite , ODBC ), valamint a szkriptnyelvektől (Python, Lua , Tcl ) a grafikus könyvtárakig. ( OpenGL , Kairó , SDL ).

A GTK , X11 , IUP és Windows API összerendelések támogatása megvalósult, a libcurl , libzip és PCRE összerendelések is hasznosak .

Példák

A megadott kódpéldák a Nim 1.4.4-re vonatkoznak. A szintaxis és a szemantika változhat a jövőbeli verziókban [5] .

Programkód Hello, World! Nim számára:

echo ( "Hello, world!" ) # A zárójelek elhagyhatók echo "Hello, world!"

Az stdout.write() függvényen keresztül is lehetséges.

stdout . write ( "Helló világ! \n " )

Húr megfordítása:

proc reverse ( s : string ): string = result = "" # implicit eredményváltozó az i -hez a visszaszámlálásban ( s . high , 0 ): eredmény . add s [ i ] let str1 = "Fordítsa meg ezt!" echo "Fordítva: " , fordított ( str1 )

Az egyik szokatlanabb tulajdonság az implicit változó result. A Nimben minden olyan eljárásnak, amely értéket ad vissza, van implicit eredményváltozója. Azt az értéket tárolja, amelyet a függvény visszaad. Az iterátort a ciklusban forhívják meg . Ha egy iterátort kihagyunk, a fordító elemenkénti iterátorokat próbál használni, vagy ha ilyen van definiálva a megadott típushoz. countdownitemspairs (в зависимости от числа переменных в for),

A Nim támogatja a típuskövetkeztetést:

let hello = "Hello, world!" # A típus nem kötelező # Maga a fordító is képes következtetni a proc doWork ( valami : auto ) eljárás argumentumtípusaira és visszatérési értékeire: auto = eredmény = valami + valami echo doWork ( 5 ) # 10. kimenet

Az azonosítók Unicode karakterekből állhatnak:

proc hello ( név : string ) = echo ( "Hello, " , name , "!" ) helló ( "Férfi" )

Példa a Nim metaprogramozására sablonok használatával:

sablon genType ( név , mezőnév : nem gépelt , mezőtípus : typedesc ) = típusnév = objektum mezőnév : mezőtípus genType ( teszt , foo , int ) var x = Teszt ( foo : 4566 ) echo ( x . foo ) # 4566

A sablon genTypea fordítási időben lefut, és létrehoz egy Test.

A következő program bemutatja az FFI használatát a meglévő C kód meghívására.

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

A példában a szabványos C könyvtárból egy függvényt printfimportálunk a Nim-be, majd használjuk [6] .

Jegyzetek

  1. 1 2 https://github.com/nim-lang/nim
  2. https://nim-lang.org/blog/2022/09/27/version-168-released.html
  3. GitHub  (angol) – 2007.
  4. Nim háttér  integráció . nim-lang.org. Hozzáférés dátuma: 2017. június 17. Az eredetiből archiválva : 2016. december 29.
  5. Nim kód példák a Rosetta Code-nál . Hozzáférés dátuma: 2017. január 20. Az eredetiből archiválva : 2017. március 7.
  6. Mi a különleges Nimben? . Hook Race (2015. január 1.). Letöltve: 2017. január 20. Az eredetiből archiválva : 2017. május 28..

Irodalom

nyolc részben

Linkek