ML (Programmiersprache)
Paradigma | Multi-Paradigma: funktionalAnwesendgenerisch, Imperativ |
---|---|
Entworfen von | Robin Milner und andere am Universität von Edinburgh |
Erstmals erschienen | 1973 |
Disziplin tippen | Gefolgert, statisch, stark |
Dialekte | |
Ocaml, Standard ml, F# | |
Beeinflusst von | |
ICH SCHWIMME | |
Beeinflusst | |
Clojure, Coq, Zyklon, C ++, Ulme, F#, F*, Haskell, Idris, Kotlin, Miranda, Nemerle, Ocaml, Opa, Erlang, Rost, Scala, Standard ml |
Ml (Metasprache) ist ein allgemeiner Zweck Funktionelle Programmierung Sprache. Es ist bekannt für die Verwendung des polymorphen Hindley -Milner -Typ -System, was automatisch die zuweist Typen von den meisten Ausdrücke Ohne explizite Typ-Anmerkungen zu erfordern und die Type zu gewährleisten, gibt es einen formellen Beweis dafür, dass ein gut typisches ML-Programm keine Fehlern zum Laufzeittyp verursacht.[1] ML liefert eine Musteranpassung für Funktionsargumente. Müllsammlung, Imperative Programmierung, Call-by-Wert und Currying. Es wird in der Programmiersprache stark verwendet und ist eine der wenigen Sprachen, die vollständig spezifiziert und verifiziert werden müssen formelle Semantik. Seine Typen und Musteranpassungen machen es gut geeignet und üblicherweise verwendet, um auf anderen formalen Sprachen wie in zu arbeiten Compiler schreiben, automatisierter Theorem beweisen, und formelle Überprüfung.
Überblick
Zu den Funktionen von ML gehören ein Call-by-Wert Bewertungsstrategie, erstklassige Funktionen, automatische Speicherverwaltung durch Müllsammlung, parametrischer Polymorphismus, statische Typisierung, Geben Sie Inferenz ein, Algebraische Datentypen, Musteranpassung, und Ausnahmebehandlung. ML verwendet statischer Scoping Regeln.[2]
ML kann als als bezeichnet werden unrein Funktionelle Sprache, denn obwohl sie die funktionale Programmierung fördert, erlaubt dies, aber es erlaubt es Nebenwirkungen[3] (wie Sprachen wie Lispeln, aber anders als a rein funktionale Sprache wie zum Beispiel Haskell). Wie die meisten Programmiersprachen verwendet ML eifrige Bewertung, was bedeutet, dass alle Subexpressionen immer bewertet werden faule Bewertung kann durch die Verwendung von erreicht werden Schließungen. Somit kann man unendliche Ströme wie in Haskell erzeugen und verwenden, aber ihr Ausdruck ist indirekt.
Die Stärken von ML werden hauptsächlich in Sprachdesign und -manipulation (Compiler, Analysatoren, Theorem-Prover) angewendet, aber es handelt sich um eine allgemeine Sprache, die auch verwendet wird Bioinformatik und Finanzsysteme.
ML wurde von entwickelt von Robin Milner und andere in den frühen 1970er Jahren in der Universität von Edinburgh,[4] und seine Syntax ist inspiriert von ICH SCHWIMME. Historisch gesehen wurde ML konzipiert, um Beweistaktiken in der zu entwickeln LCF Theorem Prover (deren Sprache, pplambdaeine Kombination der Prädikat erster Ordnung und das einfach type polymorph Lambda -Kalkül, hatte ML als Metalsprang).
Heute gibt es mehrere Sprachen in der ML -Familie; Die drei prominentesten sind Standard ml (SML), Ocaml und F#. Ideen von ML haben zahlreiche andere Sprachen beeinflusst, wie wie Haskell, Zyklon, Nemerle,[5] ATS, und Ulme.[6]
Beispiele
Die folgenden Beispiele verwenden die Syntax von Standard -ML. Andere ML -Dialekte wie OCAML und F# unterscheiden sich in kleinen Arten.
Fakultät
Das Fakultät Funktion als reines ML:
Spaß FAC (0 : int) : int = 1 | FAC (n : int) : int = n * FAC (n - 1)
Dies beschreibt das Fakultät als rekursive Funktion mit einem einzelnen Beendigung von Basisfall. Es ähnelt den Beschreibungen von Faktorien in Mathematik -Lehrbüchern. Ein Großteil des ML -Codes ähnelt der Mathematik in Einrichtung und Syntax.
Ein Teil der gezeigten Definition ist optional und beschreibt die Typen dieser Funktion. Die Notation E: T kann als gelesen werden Ausdruck E hat Typ t. Zum Beispiel wird dem Argument n Typ zugewiesen ganze Zahl (int) und fAC (n: int), das Ergebnis der Anwendung von FAC auf die Ganzzahl N hat ebenfalls Typ -Ganzzahl. Die Funktion fac als Ganzes hat dann Typ Funktion von Ganzzahl zur Ganzzahl (int -> int), dh FAC akzeptiert eine Ganzzahl als Argument und gibt ein ganzzahliges Ergebnis zurück. Dank der Inferenz vom Typ können die Typanmerkungen weggelassen werden und werden vom Compiler abgeleitet. Umgeschrieben ohne die Typanmerkungen, sieht das Beispiel aus wie:
Spaß FAC 0 = 1 | FAC n = n * FAC (n - 1)
Die Funktion basiert auch auf Musteranpassungen, ein wichtiger Bestandteil der ML -Programmierung. Beachten Sie, dass Parameter einer Funktion nicht unbedingt in Klammern sind, sondern durch Leerzeichen getrennt sind. Wenn das Argument der Funktion 0 (Null) beträgt, gibt es die Ganzzahl 1 (eins) zurück. In allen anderen Fällen wird die zweite Zeile versucht. Dies ist das Rekursionund führt die Funktion erneut aus, bis der Basisfall erreicht ist.
Diese Implementierung der faktoriellen Funktion wird nicht garantiert, da ein negatives Argument eine verursacht unendliche absteigende Kette von rekursiven Anrufen. Eine robustere Implementierung würde vor der Wiederholung nach einem nicht negativen Argument wie folgt überprüfen:
Spaß Tatsache n = Lassen Spaß FAC 0 = 1 | FAC n = n * FAC (n - 1) in wenn (n < 0) dann heben Domain anders FAC n Ende
Der problematische Fall (wenn n negativ ist) zeigt eine Verwendung des Ausnahmesystems von ML.
Die Funktion kann weiter verbessert werden, indem ihre innere Schleife als ein Schreiben als geschrieben werden Schwanzanruf, so dass die Rufen Sie Stack an muss nicht im Verhältnis zur Anzahl der Funktionsaufrufe wachsen. Dies wird erreicht, indem ein zusätzlicher Hinzufügen hinzugefügt wird, Akkumulator, Parameter zur inneren Funktion. Endlich kommen wir bei
Spaß Tatsache n = Lassen Spaß FAC 0 Acc = Acc | FAC n Acc = FAC (n - 1) (n * Acc) in wenn (n < 0) dann heben Domain anders FAC n 1 Ende
Listen Sie umgekehrt auf
Die folgende Funktion kehrt um Die Elemente in einer Liste. Genauer gesagt wird eine neue Liste zurückgegeben, deren Elemente im Vergleich zur angegebenen Liste in umgekehrter Reihenfolge sind.
Spaß umkehren [] = [] | umkehren (x :: xs) = (umkehren xs) @ [x]
Diese Implementierung von Reverse, obwohl es richtig und klar ist, ist ineffizient und erfordert Quadratische Zeit Für die Ausführung. Die Funktion kann neu geschrieben werden, um in auszuführen lineare Zeit:
Spaß 'a umkehren xs : 'a aufführen = Aufführen.falten (op ::) [] xs
Insbesondere diese Funktion ist ein Beispiel für parametrische Polymorphismus. Das heißt, es kann Listen konsumieren, deren Elemente irgendeine Art haben, und Listen desselben Typs zurückgeben.
Module
Module sind das ML -System zur Strukturierung großer Projekte und Bibliotheken. Ein Modul besteht aus einer Signaturdatei und einer oder mehreren Strukturdateien. Die Signaturdatei gibt die an API implementieren (wie eine C -Header -Datei, oder Java -Schnittstelle Datei). Die Struktur implementiert die Signatur (wie eine C -Quelldatei oder eine Java -Klassendatei). Zum Beispiel definieren die folgenden arithmetischen Signatur und eine Implementierung mit rationalen Zahlen:
Unterschrift Arith = Sig Typ t val Null : t val Succ : t -> t val Summe : t * t -> t Ende
Struktur Rational : Arith = Struktur Datentyp t = Ratte von int * int val Null = Ratte (0, 1) Spaß Succ (Ratte (a, b)) = Ratte (a + b, b) Spaß Summe (Ratte (a, b), Ratte (c, d)) = Ratte (a * d + c * b , b * d) Ende
Diese werden durch den Befehl "Verwendung" in den Dolmetscher importiert. Die Interaktion mit der Implementierung ist nur über die Signaturfunktionen zulässig, beispielsweise ist es nicht möglich, ein "Ratten" -Datenobjekt direkt über diesen Code zu erstellen. Der Block "Struktur" verbirgt alle Implementierungsdetails von außen.
Die Standardbibliotheken von ML werden auf diese Weise als Module implementiert.
Siehe auch
- Standard ml und Standard -ML § Implementierungen
- Abhängig ml: Eine abhängig typisierte Erweiterung von ML
- ATS: Eine weitere Entwicklung von abhängiger ML
- Faul ml: Ein experimenteller faul bewertete ML -Dialekt von den frühen 1980er Jahren
- PAL (Programmiersprache): Eine Bildungssprache im Zusammenhang mit ML
- Ocaml: Eine "industrielle Stärke"[7] ML -Dialekt zur Implementierung verwendet Coq
- F#: Eine open-Source-plattformübergreifende Funktionssprache für die .NET Framework
- CoffeeScript und Typoskript: Metalanguages für ECMaskript
Verweise
- ^ Robin Milner. Eine Theorie des Typpolymorphismus in der Programmierung. Journal of Computer and System Sciences, 17 (3): 348–375, 1978.
- ^ Milner, Robin; Toftte, MADS (1991). "4.1 Kontexte, Umgebungen und Umfang". Kommentar zu Standard ML. Die MIT -Presse. S. 35–36. ISBN 0-262-63137-7.
- ^ Sebesta, Robert (1999). Konzepte von Programmiersprachen (4. Aufl.). Addison-Westley. p. 54. ISBN 0-201-38596-1.
- ^ Gordon, Michael J. C. (1996). "Von LCF bis Hol: eine kurze Geschichte". Abgerufen 2007-10-11.
- ^ Programmiersprache für "Spezialkräfte" von Entwicklern, Russisches Softwareentwicklungsnetzwerk: Nemerle -Projektteam, abgerufen 24. Januar, 2021
- ^ Tate, Bruce A.; Daoud, Fred; Dees, Ian; Moffitt, Jack (2014). "3. Elm". Sieben weitere Sprachen in sieben Wochen (Buchversion: P1.0-November 2014 ed.). Die pragmatischen Programmierer, LLC. S. 97, 101. ISBN 978-1-941222-15-7.
Auf Seite 101 sagt Elm Evan Czaplicki: "Ich neige dazu zu sagen" Elm ist eine ML-Familie-Sprache ", um das gemeinsame Erbe all dieser Sprachen zu erreichen." ["Diese Sprachen" bezieht sich auf Haskell, Ocaml, SML und F#]
- ^ "OCAML ist eine Programmiersprache für industrielle Stärke, die funktionale, imperative und objektorientierte Stile unterstützt.". Abgerufen am 2. Januar 2018.
Weitere Lektüre
- Die Definition von Standard MLRobin Milner, Mads Toftte, Robert Harper, MIT Press 1990; (Überarbeitete Ausgabe fügt Autor David MacQueen hinzu), MIT Press 1997, ISBN0-262-63181-4 Die Definition von Standard ML (überarbeitet).
- Kommentar zu Standard ML, Robin Milner, Mads Toftte, MIT Press 1997, ISBN0-262-63137-7.
- ML für den Arbeitsprogrammierer, Lawrence Paulson, Cambridge University Press 1991, 1996, ISBN0-521-57050-6.
- Harper, Robert (2011). Programmierung in Standard -ML (PDF). Carnegie Mellon Universität.
- Elemente der ML -Programmierung, Jeffrey D. Ullman, Prentice-Hall 1994, 1998, ISBN0-13-790387-1.
Externe Links
- Standard -ML von New Jersey, eine weitere beliebte Implementierung
- F#, eine ML -Implementierung mit dem Microsoft .NET -Framework Archiviert 2010-02-18 bei der Wayback -Maschine
- Mlton, ein Ganzprogramm optimiert Standard-ML-Compiler
- Nachfolger ML- oder sml
- Cakeml, eine Read-E-Eval-Print-Schleifenversion von ML mit formell verifizierter Laufzeit und Übersetzung zum Assembler