ML (programovací jazyk) - ML (programming language)
![]() | tento článek potřebuje další citace pro ověření.Květen 2015) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
Paradigma | Multi-paradigma: funkční, rozkazovací způsob |
---|---|
Navrhl | Robin Milner a další v University of Edinburgh |
Poprvé se objevil | 1973 |
Psací disciplína | Odvozeno, statický, silný |
Dialekty | |
OCaml, Standardní ML, F# | |
Ovlivněno | |
JÁ PLAVU | |
Ovlivněno | |
Clojure, Coq, Cyklón, C ++, Jilm, F#, F*, Haskell, Idrisi, Kotlin, Mirando, Nemerle, OCaml, Opa, Erlang, Rez, Scala, Standardní ML |
ML („Meta jazyk“) je univerzální funkční programovací jazyk. ML má statický rozsah. Je známý pro své použití polymorfní Systém typu Hindley – Milner, který automaticky přiřadí typy většiny výrazy bez požadavku na explicitní poznámky k typu a zajišťuje bezpečnost typu - existuje formální důkaz, že dobře napsaný program ML nezpůsobuje chyby typu za běhu.[1] ML poskytuje porovnávání vzorů pro argumenty funkcí, odvoz odpadu, imperativní programování, call-by-value a kari. Používá se hojně při výzkumu programovacích jazyků a je jedním z mála jazyků, které lze zcela specifikovat a ověřit pomocí formální sémantika. Díky svým typům a přizpůsobení vzorů je vhodný a běžně používaný pro provoz v jiných formálních jazycích, například v psaní překladače, automatizované dokazování věty, a formální ověření.
Přehled
Mezi funkce ML patří volání podle hodnoty strategie hodnocení, prvotřídní funkce, automatická správa paměti prostřednictvím odvoz odpadu, parametrický polymorfismus, statické psaní, odvození typu, algebraické datové typy, porovnávání vzorů, a zpracování výjimek. ML používá statický rozsah pravidla.[Citace je zapotřebí ]
ML lze označit jako nečistý funkční jazyk, protože ačkoli podporuje funkční programování, umožňuje vedlejší efekty (jako jazyky jako Lisp, ale na rozdíl od čistě funkční jazyk jako Haskell ). Jako většina programovacích jazyků používá ML nedočkavé hodnocení, což znamená, že všechny dílčí výrazy jsou vždy hodnoceny líné hodnocení lze dosáhnout použitím uzávěry. Lze tedy vytvářet a používat nekonečné proudy jako v Haskellu, ale jejich vyjádření je nepřímé.
Silné stránky ML se většinou používají při navrhování a manipulaci jazyků (kompilátory, analyzátory, dokazující věty), ale jedná se o univerzální jazyk používaný také v bioinformatice a finančních systémech.
ML vyvinula Robin Milner a další počátkem 70. let v University of Edinburgh,[2] jehož syntaxe je inspirována JÁ PLAVU. Historicky byla ML koncipována tak, aby v USA vyvinula taktiku důkazů LCF teorém prover (jehož jazyk, pplambda, kombinace predikátový počet prvního řádu a jednoduše napsané polymorfní lambda kalkul, měl ML jako svůj metajazyk).
Dnes je v rodině ML několik jazyků; tři nejvýznamnější jsou Standardní ML (SML), OCaml a F#. Nápady z ML ovlivnily řadu dalších jazyků, jako Haskell, Cyklón, Nemerle, ATS,[Citace je zapotřebí ] a Jilm.[3]
Příklady
Následující příklady používají syntaxi Standard ML. Jiné ML dialekty jako např OCaml a F# se liší v malém.
Faktoriální
The faktoriál funkce vyjádřená jako čistý ML:
zábava fac (0 : int) : int = 1 | fac (n : int) : int = n * fac (n - 1)
To popisuje faktoriál jako rekurzivní funkci s jediným zakončovacím základním případem. Je to podobné jako s popisy faktoriálů v učebnicích matematiky. Velká část kódu ML je podobná matematice v oblasti zařízení a syntaxe.
Část uvedené definice je volitelná a popisuje typy této funkce. Zápis E: t lze číst jako výraz E má typ t. Například argumentu n je přiřazen typ celé číslo (int) a fac (n: int), výsledek použití fac na celé číslo n, má také typ integer. Funkce fac jako celek pak má typ funkce z celého čísla na celé číslo (int -> int), to znamená, že fac přijímá celé číslo jako argument a vrací celočíselný výsledek. Díky odvození typu lze anotace typu vynechat a budou odvozeny kompilátorem. Přepsán bez anotací typu, příklad vypadá takto:
zábava fac 0 = 1 | fac n = n * fac (n - 1)
Funkce také spoléhá na porovnávání vzorů, důležitou součást programování ML. Všimněte si, že parametry funkce nemusí být nutně v závorkách, ale jsou odděleny mezerami. Když je argument funkce 0 (nula), vrátí celé číslo 1 (jedna). U všech ostatních případů je vyzkoušen druhý řádek. To je rekurze, a provede funkci znovu, dokud není dosaženo základního případu.
Není zaručeno, že tato implementace faktoriální funkce skončí, protože negativní argument způsobí nekonečný sestupný řetězec rekurzivních hovorů. Robustnější implementace by před opakováním zkontrolovala nezáporný argument, a to následovně:
zábava skutečnost n = nechat zábava fac 0 = 1 | fac n = n * fac (n - 1) v -li (n < 0) pak vyzdvihnout Selhat "negativní argument" jiný fac n konec
Problematický případ (je-li n záporný) ukazuje použití ML systém výjimek.
Funkci lze dále vylepšit zapsáním její vnitřní smyčky do a ocas rekurzivní styl, takový, že zásobník volání nemusí růst v poměru k počtu volání funkcí. Toho je dosaženo přidáním dalšího parametru „akumulátor“ do vnitřní funkce. Nakonec dorazíme na
zábava skutečnost n = nechat zábava fac 0 dle = dle | fac n dle = fac (n - 1) (n * dle) v -li (n < 0) pak vyzdvihnout Selhat "negativní argument" jiný fac n 1 konec
Seznam obráceně
Následující funkce „převrátí“ prvky v seznamu. Přesněji vrátí nový seznam, jehož prvky jsou v opačném pořadí ve srovnání s daným seznamem.
zábava zvrátit [] = [] | zvrátit (x :: xs) = (zvrátit xs) @ [X]
Tato implementace zpětného chodu, i když je správná a jasná, je neefektivní a vyžaduje kvadratický čas k provedení. Funkci lze přepsat tak, aby se spustila v lineární čas v následujícím efektivnějším, i když méně snadno čitelném stylu:
zábava zvrátit xs = nechat zábava rev [] dle = dle | rev (hd :: tl) dle = rev tl (hd :: acc)v rev xs []konec
Tato funkce je příkladem parametrického polymorfismu. To znamená, že může využívat seznamy, jejichž prvky mají jakýkoli typ, a vrátit seznamy stejného typu.
Moduly
Moduly jsou systém ML pro strukturování velkých projektů a knihoven. Modul se skládá ze souboru podpisu a jednoho nebo více souborů struktury. Soubor podpisu určuje API které mají být implementovány (jako soubor záhlaví C nebo Rozhraní Java soubor). Struktura implementuje podpis (jako zdrojový soubor C nebo soubor třídy Java). Například následující definuje aritmetický podpis a jeho implementaci pomocí Rational čísel:
podpis ARITH =sig typ t; val nula : t; val succ : t -> t ; val součet : t * t -> t;konec
struktura Racionální : ARITH =struktur datový typ t = Krysa z int * int; val nula = Krysa(0,1); zábava succ(Krysa(A,b)) = Krysa( a + b , b ); zábava součet (Krysa(A,b), Krysa(C,d)) = Krysa(a * d + c * b , b * d) : t ;konec
Ty se importují do tlumočníka pomocí příkazu 'use'. Interakce s implementací je povolena pouze prostřednictvím funkcí podpisu, například není možné vytvořit datový objekt „Rat“ přímo prostřednictvím tohoto kódu. Blok „struktura“ skrývá všechny implementační detaily zvenčí.
Standardní knihovny ML jsou tímto způsobem implementovány jako moduly.
Viz také
- Standardní ML a jeho implementace:
- SML / NJ, implementace s rozšíření pro souběžné programování vyvinut v Univerzita Princeton a Bell Laboratories
- Moskva ML, implementace původně založená na Caml Light
- Alice ML, rozšíření Standard ML s podporou paralelního programování pomocí futures
- MLton, mocný optimalizace celého programu překladač přísně vyhovující definici
- Závislé ML, rozšíření ML se závislým psaním, které vedlo k vývoji:
- Líný ML, experimentálně líně hodnocený dialekt ML z počátku 80. let
- PAL (programovací jazyk), vzdělávací jazyk související s ML
- OCaml „průmyslová síla“[4] ML dialekt používaný k implementaci Coq věta prover
- F#, vyspělý, otevřený, multiplatformní cílení na programovací jazyk napříč platformami .SÍŤ
Reference
- ^ Robin Milner. Teorie polymorfismu typu v programování. Journal of Computer and System Sciences, 17 (3): 348–375, 1978.
- ^ Gordon, Michael J. C. (1996). „Od LCF k HOL: krátká historie“. Citováno 2007-10-11.
- ^ Tate, Bruce A .; Daoud, Fred; Dees, Ian; Moffitt, Jack (2014). "3. Jilm". Sedm dalších jazyků za sedm týdnů (Knižní verze: P1.0 - listopad 2014 ed.). Pragmatičtí programátoři, LLC. 97, 101. ISBN 978-1-941222-15-7.
Na straně 101, tvůrce jilmu Evan Czaplicki říká: „Mám sklon říkat„ jilm je jazykem rodiny ML “, abych získal společné dědictví všech těchto jazyků.“ ["tyto jazyky" odkazují na Haskell, OCaml, SML a F #.]
- ^ „OCaml je průmyslový programovací jazyk podporující funkční, imperativní a objektově orientované styly“. Citováno 2. ledna 2018.
Další čtení
- Definice standardního MLRobin Milner, Mads Tofte, Robert Harper, MIT Press 1990; (přepracované vydání přidává autora Davida MacQueena), MIT Press 1997, ISBN 0-262-63181-4.
- Komentář k Standard ML, Robin Milner, Mads Tofte, MIT Press 1997, ISBN 0-262-63137-7.
- ML pro pracovní programátor, Lawrence Paulson, Cambridge University Press 1991, 1996, ISBN 0-521-57050-6.
- Harper, Robert (2011). Programování ve standardním ML (PDF). Univerzita Carnegie Mellon.
- Prvky programování ML, Jeffrey D. Ullman, Prentice-Hall 1994, 1998, ISBN 0-13-790387-1.