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).
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í.
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.
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 => nPro ú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.
Programovací jazyky | |
---|---|
|