ML (Programmiersprache)

Ml
Paradigma Multi-Paradigma: funktionalAnwesendgenerisch, Imperativ
Entworfen von Robin Milner und andere am Universität von Edinburgh
Erstmals erschienen 1973; Vor 49 Jahren
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

Verweise

  1. ^ Robin Milner. Eine Theorie des Typpolymorphismus in der Programmierung. Journal of Computer and System Sciences, 17 (3): 348–375, 1978.
  2. ^ 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.
  3. ^ Sebesta, Robert (1999). Konzepte von Programmiersprachen (4. Aufl.). Addison-Westley. p. 54. ISBN 0-201-38596-1.
  4. ^ Gordon, Michael J. C. (1996). "Von LCF bis Hol: eine kurze Geschichte". Abgerufen 2007-10-11.
  5. ^ Programmiersprache für "Spezialkräfte" von Entwicklern, Russisches Softwareentwicklungsnetzwerk: Nemerle -Projektteam, abgerufen 24. Januar, 2021
  6. ^ 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#]
  7. ^ "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

Externe Links