ML

ML
Sémantika multiparadigma : funkční , imperativní , modulární
Jazyková třída programovací jazyk , procedurální programovací jazyk a funkcionální programovací jazyk
Objevil se v 1973
Autor Robin Milner a další - University of Edinburgh
Typový systém silný , statický , výstup
Dialekty Standardní ML , Caml Light , OCaml , F# [1] , LazyML
Byl ovlivněn JÁ PLAVU
ovlivnil Miranda , Haskell , Cyclone , Nemerle , C++

ML (Meta Language) je rodina striktních funkcionálních programovacích jazyků s vyvinutým parametricky polymorfním typem systému a parametrizovatelnými moduly. Systém podobného typu poprvé navrhl Roger Hindley v roce 1969 a nyní je často označován jako Hindley-Milner systém . Jazyky této rodiny nejsou z velké části čisté funkcionální jazyky, protože obsahují také imperativní instrukce (ale existují výjimky - například Manticore ). ML se vyučuje na mnoha západních univerzitách (na některých dokonce jako první programovací jazyk).

Pozadí a historie jazyka

V roce 1963 John Alan Robinson implementoval metodu pro automatické dokazování teorémů, nazvanou „ princip rozlišení “. Myšlenka této metody patří Herbranovi ; to bylo navrženo v roce 1930 . Robinson vyvinul výpočetně účinný sjednocovací algoritmus , který je základem této metody.

V roce 1969 dala Dana Scott do oběhu memorandum, které bylo oficiálně zveřejněno až v roce 1993 [2] . Memorandum navrhlo deduktivní systém Logic for Computable Functions (LCF) – „logika pro vyčíslitelné funkce“. Systém stejného jména , určený k automatizaci dokazování teorémů, byl vyvinut na počátku 70. let 20. století Robinem Milnerem a jeho spolupracovníky ve Stanfordu a Edinburghu.

První verze jazyka ML byla vyvinuta jako interní jazyk tohoto systému. Jak bylo uživatelům systému jasné, jazyk se dobře hodil jako univerzální programovací jazyk. To vedlo k následnému výskytu velkého množství jeho implementací.

Funkce

Silný a statický typový systém jazyka je založen na lambda kalkulu , ke kterému bylo přidáno silné psaní . Striktní typový systém dává prostor pro optimalizaci, takže se brzy objeví jazykový kompilátor. Systém typu Hindley-Milner má omezeně polymorfní typový systém, z něhož lze automaticky odvodit většinu typů výrazů . To umožňuje programátorovi explicitně nedeklarovat typy funkcí, ale udržovat silnou kontrolu typu.

ML je interaktivní jazyk. Každý zadaný příkaz je analyzován, zkompilován a proveden a hodnota vyplývající z provedení příkazu je spolu s jeho typem vrácena uživateli. Jazyk podporuje zpracování výjimek.

Příklady

Faktorový výpočet v ML:

fun fac ( n ) = pokud n = 0 pak 1 jinak n * fac ( n- 1 );

Dobrým příkladem vyjadřovací schopnosti ML je implementace ternárních vyhledávacích stromů :

zadejte klíč = klíč . ord_key type item = Klíč . ord_key seznam datových typů set = LEAF | NODE of { key : key , lt : set , eq : set , gt : set } val empty = LEAF výjimka již přítomna fun member (_, LEAF ) = false | člen ( h::t , NODE { klíč , lt , eq , gt }) = ( klíč případu . porovnat ( h , klíč ) z ROVNOU => člen ( t , ekv ) | MENŠÍ => člen ( h::t , lt ) | VĚTŠÍ => člen ( h::t , gt ) ) | člen ([], NODE { klíč , lt , eq , gt }) = ( klíč případu . porovnat ( klíč . sentinel , klíč ) ROVNOU => true | MENŠÍ => člen ([], lt ) | VĚTŠÍ = > člen ([], gt ) ) fun insert ( h::t , LEAF ) = NODE { key = h , eq = insert ( t , LEAF ), lt = LEAF , gt = LEAF } | insert ([], LEAF ) = NODE { key = Key . sentinel , eq = LIST , lt = LIST , gt = LIST } | insert ( h::t , NODE { key , lt , eq , gt }) = ( case Key . porovnání ( h , key ) of ROVNÁ SE => NODE { key = key , lt = lt , gt = gt , eq = insert ( t , eq )} | LESS => NODE { key = key , lt = insert ( h::t , lt ), gt = gt , eq = eq } | GREATER => NODE { key = key , lt = lt , gt = vložit ( h::t , gt ), eq = eq } ) | insert ([], NODE { key , lt , eq , gt }) = ( case Key . Compare ( Key . sentinel , key ) of EQUAL => raise Již přítomno | LESS => NODE { key = key , lt = insert ([ ], lt ), gt = gt , eq = eq } | VĚTŠÍ => UZEL { klíč = klíč , lt = lt , gt = vložit ([], gt ), eq = eq } ) fun add ( l , n ) = vložit ( l , n ) popisovač JižPresent => n

Pro úlohu hledání řetězce ve slovníku kombinuje ternární vyhledávací strom bleskovou rychlost prefixových stromů s paměťovou efektivitou binárních stromů. Implementace ML je kompaktní a samodokumentující díky použití algebraických typů , porovnávání vzorů , pravidlu „ poslední výraz v řetězci spustitelných souborů je výsledkem celé funkce “ a schopnosti vytvářet objekty agregačních typů bez předchozích deklarací . Vyznačuje se také prokázanou správností  - zejména eliminací úniků paměti charakteristických pro C / C++ ; nebo riziko chyb ve zdrojovém kódu, které vedou k zacyklení programu a lavině spotřebovávající paměť, která je charakteristická pro dynamicky typované jazyky.

Systém typu Hindley-Milner poskytuje jazyky s vysokým potenciálem pro optimalizaci, takže snižování složitosti a zlepšování stability programů je „zdarma“ (bez ztráty efektivity), za předpokladu, že optimalizační kompilátor (např. OCaml nebo MLton ) je k dispozici.

Viz také

Poznámky

  1. Jazyk Ml Archivováno 10. října 2015 na Wayback Machine , c2.com
  2. Dana S. Scottová. " Typově teoretická alternativa k ISWIM, CUCH, OWHY Archivováno 11. listopadu 2020 na Wayback Machine ". Theoretical Computer Science , 121 :411–440, 1993. Komentovaná verze rukopisu z roku 1969.

Odkazy