ML

ML
Szemantika több paradigma : funkcionális , kötelező , moduláris
Nyelvóra programozási nyelv , procedurális programozási nyelv és funkcionális programozási nyelv
Megjelent 1973
Szerző Robin Milner és mások – Edinburghi Egyetem
Típusrendszer erős , statikus , kimenet
Dialektusok Standard ML , Caml Light , OCaml , F# [1] , LazyML
Befolyásolva ÚSZOK
befolyásolta Miranda , Haskell , Cyclone , Nemerle , C++

Az ML (Meta Language) szigorú funkcionális programozási nyelvek családja, kifejlesztett parametrikusan polimorf típusú rendszerrel és paraméterezhető modulokkal. Egy hasonló típusú rendszert először Roger Hindley javasolta 1969 - ben, és ma gyakran Hindley-Milner rendszerként emlegetik . Ennek a családnak a nyelvei többnyire nem tiszta funkcionális nyelvek, mivel kötelező utasításokat is tartalmaznak (de vannak kivételek - például a Manticore ). Az ML-t sok nyugati egyetemen oktatják (egyes esetekben még az első programozási nyelvként is).

A nyelv háttere és története

1963- ban John Alan Robinson bevezetett egy módszert a tételek automatikus bizonyítására, amelyet " felbontási elvnek " neveztek. Ennek a módszernek az ötlete Herbranhez tartozik ; 1930 -ban javasolták . Robinson kifejlesztett egy számításilag hatékony egyesítő algoritmust , amely a módszer alapja.

1969-ben Dana Scott egy memorandumot terjesztett, amelyet hivatalosan csak 1993-ban tettek közzé [2] . A memorandum a Logic for Computable Functions (LCF) deduktív rendszert javasolta – „számítható függvények logikáját”. Az 1970-es évek elején Robin Milner és munkatársai Stanfordban és Edinburgh -ban dolgoztak ki egy azonos nevű rendszert, amelyet a tételbizonyítás automatizálására terveztek .

Az ML nyelv első változatát a rendszer belső nyelveként fejlesztették ki. Amint a rendszer használói számára világossá vált, a nyelv jól használható általános célú programozási nyelvként. Ez nagyszámú megvalósításának későbbi megjelenéséhez vezetett.

Jellemzők

A nyelv erős és statikus típusrendszere a lambda-számításon alapul , amelyhez erős gépelés került . A szigorú típusrendszer teret ad az optimalizálásnak, így hamarosan megjelenik egy nyelvi fordító. A Hindley-Milner típusú rendszer korlátozottan polimorf típusú rendszerrel rendelkezik, ahol a legtöbb kifejezéstípus automatikusan következtethető . Ez lehetővé teszi, hogy a programozó ne kifejezetten deklaráljon függvénytípusokat, hanem erős típusvezérlést tartson fenn.

Az ML egy interaktív nyelv. Minden beírt utasítást elemezni, lefordítani és végrehajtani, és az utasítás végrehajtásából származó értéket a típusával együtt visszaküldi a felhasználónak. A nyelv támogatja a kivételkezelést.

Példák

Tényező számítás ML-ben:

fun fac ( n ) = ha n = 0 , akkor 1 else n * fac ( n - 1 );

Az ML kifejező erejére jó példa a hármas keresőfák megvalósítása :

type key = Key . ord_key type item = Kulcs . ord_key list datatype set = LEAF | NODE of { kulcs : kulcs , lt : beállítva , eq : beállítva , gt : beállítva } val üres = LEVÉL kivétel Már jelen van szórakoztató tag (_, LEVÉL ) = hamis | tag ( h::t , NODE { kulcs , lt , eq , gt }) = ( kisbetűs kulcs . összehasonlítása ( h , kulcs ) of EQUAL => tag ( t , eq ) | LESS => tag ( h::t , lt ) | NAGYOBB => tag ( h::t , gt ) ) | tag ([], NODE { kulcs , lt , eq , gt }) = ( kis- és nagybetű Kulcs . összehasonlítás ( Kulcs . sentinel , kulcs ) of EQUAL => igaz | LESS => tag ([], lt ) | NAGYOBB => tag ([], gt ) ) szórakoztató betét ( h::t , LEVÉL ) = CSOMÓPONT { kulcs = h , eq = beszúrás ( t , LEVÉL ), lt = LEVÉL , gt = LEVÉL } | insert ([], LEVÉL ) = CSOMÓPONT { kulcs = Kulcs . őrszem , eq = LEVÉL , lt = LEVÉL , gt = LEVÉL } | insert ( h::t , NODE { key , lt , eq , gt }) = ( kisbetűs Kulcs . összehasonlítása ( h , kulcs ) of EQUAL => NODE { kulcs = kulcs , lt = lt , gt = gt , eq = beszúrás ( t , eq )} | KEVESEBB => CSOMAG { kulcs = kulcs , lt = beszúrás ( h::t , lt ), gt = gt , eq = eq } | NAGYOBB => CSOMÓPONT { kulcs = kulcs , lt = lt , gt = beszúrás ( h::t , gt ), eq = eq } ) | insert ([], NODE { key , lt , eq , gt }) = ( kis- és nagybetű Kulcs . összehasonlítás ( Kulcs . sentinel , kulcs ) of EQUAL => raise AlreadyPresent | LESS => NODE { key = key , lt = beillesztés ([ ], lt ), gt = gt , eq = eq } | NAGYOBB => CSOMÓPONT { kulcs = kulcs , lt = lt , gt = beszúrás ([], gt ), eq = eq } ) szórakoztató add ( l , n ) = beszúrás ( l , n ) fogantyú AlreadyPresent => n

Egy karakterlánc szótárban való kereséséhez a hármas keresőfa egyesíti az előtagfák villámgyorsságát a bináris fák memóriahatékonyságával . Az ML implementáció kompakt és öndokumentáló az algebrai típusok használatának , a mintaillesztésnek , a szabálynak, hogy " a végrehajtható lánc utolsó kifejezése a teljes függvény eredménye " és az aggregált típusú objektumok előzetes deklarációk nélküli felépítésének köszönhetően. . A bizonyított helyesség is megkülönbözteti  - különösen a C / C ++- ra jellemző memóriaszivárgások kiküszöbölése ; vagy a forráskód hibáinak kockázata, amelyek a program hurkolásához és a dinamikusan tipizált nyelvekre jellemző memóriaigényes lavinához vezetnek.

A Hindley-Milner típusú rendszer nagy optimalizálási potenciállal rendelkező nyelveket biztosít, így a programok komplexitásának csökkentése és stabilitásának javítása "ingyenes" (a hatékonyság elvesztése nélkül), feltéve, hogy egy optimalizáló fordító (például OCaml vagy MLton ) ) elérhető.

Lásd még

Jegyzetek

  1. Ml Language archiválva : 2015. október 10., a Wayback Machine webhelyen , c2.com
  2. Dana S. Scott. " Az ISWIM, CUCH, OWHY típuselméleti alternatívája Archiválva : 2020. november 11. a Wayback Machine -nél ". Theoretical Computer Science , 121 :411–440, 1993. Az 1969-es kézirat annotált változata.

Linkek