Nim

Nim
Jazyková třída programovací jazyk, odsazený jazyk [ d] , kompilovaný programovací jazyk a metaprogramovací jazyk [d]
Objevil se v 2008
Autor Andreas Rumpf [d] [1]
Přípona souboru .nimnebo.nims
Uvolnění
Byl ovlivněn Modula-3 , Object Pascal , Ada , C++ , Python , Lisp , Oberon a C#
Licence licence MIT [3]
webová stránka nim-lang.org
OS multiplatformní

Nim (dříve Nimrod ) je staticky typovaný programovací jazyk , který podporuje procedurální , objektově orientované , funkční a generické programovací styly.

Podle vývojářů kombinuje sílu Lisp , jednoduchost a srozumitelnost Pythonu a vysoký výkon C. Důležitou vlastností, kterou jazyk zdědil od Lisp, bylo zahrnutí abstraktního syntaktického stromu (AST) do jazykové specifikace, což mu umožňuje podporovat výkonný systém maker, a proto poskytuje pohodlné prostředky pro vytváření doménově specifických jazyků (( DSL) .

Historie a aplikace

Nim vytvořil v roce 2004 Andreas Rumpf ( německy  Andreas Rumpf ). Byly převzaty tři základní principy jazyka označované jako „3E“ (v pořadí priority):

Vývoj byl zpočátku prováděn na Object Pascal ( kompilátor Free Pascal ). První verze, která se dokázala zkompilovat sama (tj. kompilátor byl přepsán v samotném Nimu), byla vydána 22. srpna 2008 (verze 0.6.0). V tomto okamžiku se k Rumpfovi připojila řada dobrovolníků zapojených do návrhu a vývoje jazyka.

Kompilátor jazyka převede kód napsaný v Nim do C , C++ , Objective-C nebo JavaScript [4] a poté zavolá kompilátor nebo interpret pro odpovídající jazyk. Podporováno je poměrně velké množství kompilátorů C a C++, v praxi se nejčastěji volí kompilace do C z důvodů efektivity (díky optimalizaci kompilátorů C ) a přenositelnosti. Přenositelnost kódu C zase umožňuje, aby programy Nim běžely na Linuxu , BSD , macOS , Windows a mnoha dalších operačních systémech .

Syntaxe a paradigmatika

Nim, stejně jako Python , používá odsazení jako oddělovače bloků (tzv. pravidlo povinného odsazení ), i když bloky lze v preprocesorových filtrech oddělit také klíčovými slovy (syntax wrapper endX). Jazyk částečně nerozlišuje velká a malá písmena (bere se v úvahu pouze velikost prvního písmene v identifikátorech). Poněkud neobvyklou vlastností je, že podtržítka v identifikátorech jsou ignorována.

Jazyk lze použít jako imperativní i procedurální , ale podporuje také objektově orientované , funkční a generické programovací styly .

Objekty s dědičností , přetížením , polymorfismem a vícenásobným odesláním (multimethods) umožňují objektově orientované programování . Inline syntaktický cukr tlačí směrem k objektově orientovanému stylu a řetězcům volání: funct(a, b)nahrazeno a.funct(b).

Metaprogramování je podporováno pomocí šablon, maker, podmíněné kompilace s prováděním funkce v době kompilace (CTFE). Nim vám umožňuje vytvářet vlastní výpisy.

Jazyk má mnoho typů na vysoké úrovni , od běžných řetězců a polí po sekvence, množiny, n-tice , výčty a tak dále. Nízkoúrovňová systémová data nemusí být spravována, ale většinu objektů vytvořených na haldě spravuje garbage collector , což programátora osvobozuje od většiny starostí se správou paměti. Používá nesledující garbage collector s líným počítáním referencí a algoritmem označování k detekci kruhových referencí . Pracuje se také na dalších druzích správy paměti – ARC, která provádí počítání referencí pomocí RAII a sémantiky pohybu , a ORC, což je doplněk k ARC s přidáním kruhového kolektoru referencí. Můžete také použít Boehm garbage collector nebo svoz odpadu úplně odmítnout.

Nim také podporuje modulový mechanismus pro izolaci nezávislých knihoven nebo balíčků. Standardní knihovna Nim má funkce pro provádění I/O, pro interakci s operačním systémem, pro práci s řetězci (existuje podpora pro unicode , regulární výrazy a RW gramatiky s různými parsery), pro práci s možnostmi příkazového řádku, pro práci s různé formáty souborů (například XML nebo CSV).

Interakce s jinými jazyky

C Application Binary Interface (ABI) je podporováno stejně dobře jako standardní knihovna C , včetně existujícího kódu a knihoven. Nim podporuje konvence volání funkcí C a funkcí z knihoven Windows ( modul dynlib umožňuje přístup k funkcím dynamických knihoven (soubory .dll , .so , .dylib ). Kromě toho jsou podporovány ABI C ++ a Objective C , stejně jako integrace s JavaScriptem .

Jazyk má tedy vazby na velké množství knihoven, od systémových knihoven ( POSIX , Windows) po DBMS knihovny ( MySQL , PostgreSQL , SQLite , ODBC ) a od skriptovacích jazyků (Python, Lua , Tcl ) po grafické knihovny . ( OpenGL , Káhira , SDL ).

Byla implementována podpora vazeb GTK , X11 , IUP a Windows API , užitečné jsou také vazby libcurl , libzip a PCRE .

Příklady

Uvedené příklady kódu jsou správné pro Nim 1.4.4. Syntaxe a sémantika se mohou v budoucích verzích změnit [5] .

Programový kód Hello, World! pro Nima:

echo ( "Ahoj světe!" ) # Závorky lze vynechat echo "Ahoj světe!"

Je to také možné pomocí funkce stdout.write().

stdout . napište ( "Ahoj světe! \n " )

Obrácení řetězce:

proc reverse ( s : string ): string = result = "" # implicitní výsledná proměnná pro i v odpočítávání ( s . high , 0 ): result . přidat s [ i ] let str1 = "Obrátit to!" echo "Obráceno: " , obráceně ( str1 )

Jednou z neobvyklých vlastností je implicitní proměnná result. Každá procedura v Nim, která vrací hodnotu, má implicitní výslednou proměnnou. Ukládá hodnotu, kterou funkce vrátí. Iterátorfor se volá ve smyčce . Pokud je iterátor vynechán, kompilátor se pokusí použít iterátory po prvcích, nebo pokud je pro zadaný typ nějaký definován. countdownitemspairs (в зависимости от числа переменных в for),

Nim podporuje odvození typu:

let ahoj = "Ahoj světe!" # Typ není vyžadován # Kompilátor sám dokáže odvodit typy argumentů a návratové hodnoty procedury proc doWork ( něco : auto ): auto = výsledek = něco + něco echo doWork ( 5 ) # Výstupy 10

Identifikátory se mohou skládat ze znaků Unicode:

proc ahoj ( jméno : řetězec ) = echo ( "Dobrý den, " , jméno , "!" ) ahoj ( "člověk" )

Příklad metaprogramování v Nimu pomocí šablon:

šablona genType ( name , fieldname : untyped , fieldtype : typedesc ) = type name = object fieldname : fieldtype genType ( test , foo , int ) var x = Test ( foo : 4566 ) echo ( x . foo ) # 4566

Šablona genTypese spustí v době kompilace a vytvoří soubor Test.

Následující program ukazuje použití FFI pro volání existujícího C kódu.

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

V příkladu je funkce ze standardní knihovny C printfimportována do Nimu a poté použita [6] .

Poznámky

  1. 1 2 https://github.com/nim-lang/nim
  2. https://nim-lang.org/blog/2022/09/27/version-168-released.html
  3. GitHub  (anglicky) – 2007.
  4. Integrace Nim Backend  . nim-lang.org. Datum přístupu: 17. června 2017. Archivováno z originálu 29. prosince 2016.
  5. Příklady kódu Nim na Rosetta Code . Datum přístupu: 20. ledna 2017. Archivováno z originálu 7. března 2017.
  6. Co je na Nim zvláštní? . Závod v háku (1. ledna 2015). Staženo 20. ledna 2017. Archivováno z originálu 28. května 2017.

Literatura

v osmi dílech

Odkazy