Nemerle

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 23. ledna 2016; kontroly vyžadují 5 úprav .
Nemerle
Sémantika multiparadigma , objektově orientovaný , funkční , imperativní
Jazyková třída programovací jazyk , procedurální programovací jazyk , objektově orientovaný programovací jazyk , funkcionální programovací jazyk , multiparadigmatický programovací jazyk a jazyk využívající odsazení [d]
Typ provedení sestaven
Objevil se v 0.9.3 - 16. května 2006
Autor Vratislavská univerzita ; Michal Moskal , Kamil Skalski , Pavel Olshta a další [1]
Vývojář proudové mozky
Přípona souboru .n
Uvolnění 1.2.547.0 (09.01.2017)
Typový systém statický , přísný , auto-infer , nominální
Byl ovlivněn C# , ML , OCaml , Haskell , Lisp
Licence Ustanovení BSD-2
webová stránka nemerle.org/About/
Plošina CLI (.NET/Mono)

Nemerle  je hybridní vysokoúrovňový jazyk se statickým typováním , který kombinuje vlastnosti funkčního a objektově orientovaného programování pro platformy .NET a Mono (jazyk je kompilován do CIL a je kompatibilní s CLS ). Hlavním rysem jazyka je vyvinutý systém metaprogramování .

Historie

Vývoj jazyka Nemerle začal v roce 2003 na univerzitě ve Wroclawi ( Polsko ). Vývojový tým se skládal pouze ze tří lidí, z nichž všichni byli v době zahájení vývoje postgraduálními studenty univerzity ve Wroclawi. Michal Moskal je vedoucí týmu a autor systému odvození typů, Kamil Skalski je vývojář systému maker a rozšiřitelného parseru a Pavel Olshta je autorem generátoru kódu a implementace mechanismu porovnávání vzorů.

Název jazyka pochází od kouzelníka Nemmerleho z Čaroděje ze Zeměmořského moře od Ursuly Le Guinové .

Jazyk byl původně navržen pro platformu .NET. 12. března 2010 byla vydána první beta verze jazykového kompilátoru pro podporu aplikací běžících na .NET 3.5. Jazyk, jeho implementace a dokumentace jsou vydány pod bezplatnou licencí podobnou BSD, která umožňuje bezplatné použití pro jakýkoli účel.

První verze (verze 1.0) programovacího kitu Nemerle byla vydána 13. května 2011, v současnosti je nejnovější verze 1.2 běžící na platformě .NET 4.0. Sada, která je k dispozici ke stažení zdarma, obsahuje instalovatelný jazykový kompilátor a sadu knihoven pro vložení do Microsoft Visual Studio 2008, samostatný kompilátor (pro práci bez Visual Studia), experimentální verzi softwaru, která se integruje s Visual Studio 2010, a zdrojové kódy. Aktuální verze kompilátoru podporuje zahrnutí kódu C# 6.0 do projektu, pokud nepoužívá nebezpečný kód.

Od června 2012 se vývojový tým Nemerle stal součástí společnosti JetBrains , která bude jazyk dále rozvíjet a udržovat. [jeden]

Charakteristika jazyka

Nemerle je umístěn jako univerzální jazyk. Kombinuje několik programovacích paradigmat : objektově orientované programování , imperativní programování , funkcionální programování a metaprogramování . Díky této kombinaci konceptů je možné psát programy v Nemerle pomocí různých stylů: v imperativním přístupu bude kód podobný kódu programů C # (s výjimkou některých nuancí, například určení typu), ve funkčním přístupu bude zdrojový kód příbuzný jazykům rodiny ML (ML, OCaml, F#, Haskell), včetně jejich vlastností:

Kromě imperativních a funkčních paradigmat má Nemerle výkonný systém maker, který umožňuje uživateli přidávat do jazyka nové konstrukce a popisovat řešení problémů deklarativním stylem vytvářením vlastních doménově specifických programovacích jazyků (DSL).

Funkce

Charakteristickým rysem Nemerle, stejně jako všech Hindley-Milner typizovaných jazyků, je výkonný typ inferenčního systému .

Typový závěr def x = 1 ; // int def myList = Seznam (); // generic List[T], T by mělo být odvozeno z dalšího použití myList . přidat ( x ); // díky tomuto řádku kompilátor určí typ myList jako List[int] Všechno je výraz def x = { // ekvivalent x = 3 def y = 1 ; def z = 2 ; y + z // poslední výraz v bloku je hodnota bloku } def x = if ( DateTime . Now . DayOfWeek == DayOfWeek . Monday ) // if, using, try jsou také výrazy "Monday" else "other day" ; def x = try { Int32 . Parse ( someString ) } catch { | FormatException () => 0 ; } N- tice def k = ( 1 , "jedna" ); // k : (int * řetězec) def ( a , b ) = k ; // a = 1, b = "jedna" Shoda vzorů def výsledek = shoda ( číslo ) { | 0 => "nula" | 1 => "jedna" | x když x < 0 => "negativní" | _ => "více než jeden" } Další příklady shody vzorů

Mapování s vazbou na proměnné:

def check ( o : objekt ) { shoda ( o ) { | i je int => $"An int: $i" | s je řetězec => $"Řetězec: $(s.ToUpper())" | _ => "Objekt jiného typu" } }

Shoda pro n-tice:

zápas ( n-tice ) { | ( 42 , _ ) => "42 na první pozici" | ( _ , 42 ) => "42 na druhé pozici" | ( x , y ) => $" ( $ x, $ y )" }

Shoda regulárního výrazu :

pomocí Nemerle.Text ; shoda regulárního výrazu ( str ) { | "a+.*" => printf ( "a\n" ); | @"(?<číslo: int>\d+)-\w+" => printf ( "%d\n" , číslo + 3 ); | "(?<jméno>(Ala|Kasia))? ma kota" => shoda ( jméno ) { | Některé ( n ) => printf ( "%s\n" , n ) | Žádné => printf ( "noname?\n" ) } | _ => printf ( "výchozí\n" ); }


Typy funkcí a lokální funkce def další ( x ) { x + 1 }; def mult ( x , y ) { x * y } fibbonacci ( _ ) { | _ 0 => 0 | 1 => 1 | i => fibbonacci ( i - 1 ) + fibbonacci ( i - 2 ) } Konzole . WriteLine ( další ( 9 )); // 10 Konzole . WriteLine ( mult ( 2 , 2 )); // 4 Konzole . WriteLine ( fibbonacci ( 10 )); // 55 Metaprogramování

Nemerle umožňuje vytvářet, analyzovat a upravovat programový kód v době kompilace pomocí maker. Makra lze použít jako volání metod nebo jako nové jazykové konstrukce. Většina konstrukcí v jazyce je implementována pomocí maker (if, for, foreach, while, using atd.).

Příklad makra "if":

makro @if ( cond , e1 , e2 ) syntaxe ( "if" , "(" , cond , ")" , e1 , volitelné ( ";" ), "else" , e2 ) { /* <[ ]> // <[ ]> definuje kvaziquotové oblasti, kód v nich je převeden na Nemerleho AST, podobně jako při převodu kódu na Expression kompilátorem C# */ <[ match ( $ cond : bool ) { | pravda => $ e1 | _ => $ e2 } ]> } // Výše ​​uvedené makro zavádí do jazyka konstrukci if, def max = if ( a > b ) a else b ; // který se rozšíří na def max = match ( a > b ) { | pravda => a | _ => b }

Základní pojmy

  • Typově bezpečná „hygienická“ makra a kvazi-citování s možností rozšíření syntaxe.
  • Přítomnost lokálních funkcí ( lexikální uzávěry ). Funkce je objekt první třídy .
  • Zaručená optimalizace koncové rekurze , tj. koncová rekurze je při kompilaci vždy nahrazena smyčkou.
  • Typový závěr. Zejména je možné odvodit typy lokálních proměnných a odvodit signaturu lokálních funkcí.
  • Absence jasné hranice mezi výrokem (výrokem) a výrazem (výrazem). "Všechno je výraz". Například podmíněný příkaz může být uvnitř aritmetického výrazu. Není potřeba návratový příkaz.
  • Bloky kódu, které eliminují potřebu příkazů jako break nebo continue.
  • Algebraické datové typy, n-tice a porovnávání vzorů.
  • Zjednodušená syntaxe pro práci se seznamy . Seznam literálů.
  • Částečná aplikace operátorů a funkcí je jednoduché generování obalu pro nějakou funkci, ve kterém jsou některé parametry nahrazeny předem a některé jsou předány přímo při volání funkce.

Funkce syntaxe

Syntaxe Nemerle je velmi blízká C#, ale má řadu charakteristických rozdílů, včetně těch, které si vypůjčili z funkčních a skriptovacích jazyků. Zde jsou některé z nich:

  • Spolu s obvyklým pořadím uzavírání programových prvků (třídy, složené příkazy, těla metod) do složených závorek je podporován alternativní způsob popisu programové struktury, založený na odsazení, jako v Pythonu.
  • V deklaraci proměnných a metod je typ uveden ve stylu OCaml (obdoba Pascalu, ale bez možnosti zadat více názvů proměnných) ve tvaru "proměnná : typ".
  • Jména mohou kromě písmen, číslic a podtržítek obsahovat apostrof "'".
  • Lokální deklarace funkcí a konstant začínají na def.
  • Spolu s deklarací hlavní funkce programu zděděné z C# ve formě statické metody Main hlavní třídy programu je podporováno přímé umístění kódu do souboru bez jeho umístění do jakékoli třídy nebo metody.
  • Proměnné jsou deklarovány s modifikátorem mutable (spíše než def). Syntaxe tedy vybízí k použití neměnných objektů, což je v souladu s ideologií funkcionálního programování.
  • Vytvoření instance třídy se provádí voláním jejího konstruktoru - "ClassName(parametry konstruktoru)" bez nutnosti zadávat nové klíčové slovo (jak je zvykem v C#).
  • Příkaz using namespace include zahrnuje všechny vnořené jmenné prostory a také umožňuje přímo zahrnout konkrétní typ, což umožňuje používat jeho statické členy (například metody třídy nebo konstanty výčtu) bez kvalifikace názvu.
  • Statické třídy (třídy, které mají pouze statické metody a pole) jsou deklarovány pomocí klíčového slova module namísto class a nevyžadují statický modifikátor před každým členem třídy.
  • Jsou zavedeny dva samostatné konstrukty pro statické zjemnění a dynamické odlévání typu ( :resp :>.).
  • Standardní knihovna má typ seznamu, což je jednoduše propojený seznam. Seznamy jsou neměnné a chovají se podobně jako řetězce C#. Pro tento typ poskytuje jazyk specializovanou syntaxi, která výrazně zjednodušuje práci s ním (literály, možnost používat seznam při porovnávání vzorů).
  • Je představen typ "varianta" - obdoba algebraických typů ve funkcionálních jazycích.
  • Zavádí se typ "tuple" (tuple) - nepojmenovaná, neměnná datová struktura obsahující několik (možná heterogenních) prvků. Strukturální párování je podporováno pro n-tice. N-tice jsou užitečné, když chcete vrátit více hodnot z funkce, vlastnosti nebo jen uspořádat jakýkoli výraz.
  • Konstrukt přepínače byl nahrazen výkonnějším konstruktem shody vzorů (vypůjčeným z jazyků podobných ML).
  • Ocasní rekurze je zaručena, že ji kompilátor převede na smyčku. To vám umožňuje popisovat rekurzivní výpočty rekurzivně, bez obav, že použití rekurze povede k vyčerpání paměti. Podporováno pouze pro jednu funkci. Podpora vzájemně rekurzivních funkcí zatím nebyla implementována.
  • Neexistuje žádná speciální syntaxe (používaná v C#) pro finalizér (konstrukt "~ClassName()", protože je pro programátory obeznámené s C++ zavádějící. Finalizátor je popsán jako normální virtuální metoda Finalize() a kompilátor automaticky nevolá finalizátor nadřazené třídy.
  • Je možné deklarovat výchozí hodnoty v parametrech a volat syntaxi s explicitními názvy parametrů v libovolném pořadí.
  • Ve standardní knihovně jazyka jsou tři makra, která implementují podmíněné příkazy: if, které se liší v tom, že vyžaduje větev else, when, což je „jestliže bez jiného“, a If, což je negace toho, kdy, tzn. , „když (! podmínka) výraz“. Všechny podmíněné operátory jsou přepsány odpovídajícími makry v operátoru shody.
  • V parametrech, argumentech a názvech proměnných je povolen speciální zástupný znak "_". Je-li zadán na začátku názvu proměnné nebo na jeho místě (tj. pokud je zadáno pouze podtržítko), tento znak potlačí upozornění kompilátoru na nepoužívanou proměnnou. Použití podtržítka místo názvu lokální proměnné (například "_ = f(a, b)") umožňuje ignorovat hodnotu výpočtu (pro stejný účel můžete použít standardní ignorovací makro takto: " ignorovat (f(a, b))“). C# je automaticky ignoruje, což někdy vede k chybám. Nemerle vydá varování, pokud se výsledek výpočtu dále nepoužívá. Výše uvedená technika vám umožňuje naznačit kompilátoru, že ignorování výsledku není provedeno náhodou.
  • Téměř všechny jazykové konstrukty (kromě using, class atd.) jsou definovány jako mající hodnotu a lze je použít jako prvky výrazů. Výraz však může být typu void, což odpovídá příkazu v C#.
  • Jazyk podporuje funkcionální typ (běžný ve funkcionálních jazycích). Pomocí něj můžete popsat odkaz na danou funkci. C# používá delegáty k předávání odkazů na funkce. Nemerle je také podporuje, ale funkční typ je pohodlnější, flexibilnější a rychlejší. Nevyžaduje samostatnou deklaraci typu (jako delegát) a nemůže být multicast.
  • Jazyk podporuje částečnou aplikaci funkcí a operátorů, což umožňuje vytvářet funkce za běhu. Pokud například chcete určité funkci předat jinou funkci (například sčítací funkci), můžete částečně použít operátor sčítání. Výraz "_ + 2" vrátí funkci s jedním celočíselným argumentem a přidá k němu hodnotu 2.

Metaprogramovací nástroje

Řada jazykových vlastností zásadně odlišuje Nemerle od C#, Java, C++. Jedná se o makra a uzávěry a ve formě typičtější pro Lisp nebo jiné funkční jazyky než C++. Makrosystém umožňuje popisovat nové syntaktické konstrukce v Nemerle a používat je spolu s těmi vestavěnými. Ve skutečnosti je většina direktivních řídicích konstrukcí, včetně if, když jsou příkazy, smyčky všeho druhu, implementovány jako makra ve standardní knihovně Nemerle.

Vývojové prostředí

Kromě velkého množství podporovaných editorů, jako je emacs, vi atd. Nemerle má bezplatné plné IDE založené na prostředí Visual Studio 2008 a lze jej také integrovat s úplným sadou Visual Studio 2008 , Visual Studio 2010 , Visual Studio 2015 . Hlavní mechanismy integrace s VS jsou uvedeny v samostatné sestavě, která nezávisí na VS, takže kdo si přeje, může přidat podporu Nemerle do jiných IDE.

Viz také

Poznámky

  1. Twitter/orangy: Rozhodli jsme se přinést Nem . Získáno 23. června 2012. Archivováno z originálu 4. března 2014.

Odkazy