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) .
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 .
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).
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 .
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 10Identifiká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] .
Programovací jazyky | |
---|---|
|