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) .
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 .
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).
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 .
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. kimenetAz 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 ) # 4566A 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] .
Programozási nyelvek | |
---|---|
|