Was sind die Unterschiede zwischen SML und OCaml? [geschlossen]


Antworten:


157

Es gibt viele Unterschiede, einige technische, andere gesellschaftspolitische. Ich habe versucht, wichtigere Unterschiede an die erste Stelle zu setzen.

  • SML ist eine Sprache mit einer Definition und einem Standard. Es ist stabil (und wurde tatsächlich eingefroren, damit es sich nicht entwickeln kann). Objective Caml ist eine Implementierung, die von einer kleinen Gruppe bei INRIA kontrolliert wird. Es entwickelt sich weiter. (IMO wird die Evolution gut gemanagt.)

  • SML hat viele Implementierungen; Caml hat nur einen.

  • Objective Caml verfügt über eine Reihe zusätzlicher Funktionen, von denen wahrscheinlich Objekte und polymorphe Varianten die bekanntesten sind.

  • Die beiden Sprachen haben dramatisch unterschiedliche Modelle von Datensatztypen. Kurz gesagt, in Caml müssen die Namen von Datensatzfeldern eindeutig sein, während in SML zwei verschiedene Datensatztypen im selben Bereich möglicherweise gemeinsame Feldnamen haben. Diese Eigenart kann das Portieren von SML nach Caml etwas schwierig machen.

  • Es gibt einige syntaktische Unterschiede.

  • Die Bibliotheken und Standardfunktionen unterscheiden sich dramatisch. Die Caml-Bibliothek ist sehr wichtig, während die SML Standard Basis Library funktionaler ist. Beispielsweise ist die Funktionszusammensetzung ein Grundelement der obersten Ebene in SML. Es ist nicht Teil der Caml-Bibliothek. Die Caml-String-Bibliothek bietet keine Fold-Funktion (zumindest nicht ab Version 3.08). Die Implementierung vieler Caml- ListFunktionen ist für sehr lange Listen nicht sicher. Sie sprengen den Stapel.

  • Die Typsysteme unterscheiden sich geringfügig: In Caml wird eine Typanmerkung für einen Ausdruck e : tyakzeptiert, wenn der Typ mit dem Typ von ty übereinstimmte . e : tyWird in SML nur akzeptiert, wenn der Typ tyeine Instanz des Typs von ist e. Diese Unterscheidung macht die Annotation in Caml in der Praxis viel weniger nützlich, da es unmöglich ist, eine Typanmerkung zu verwenden, um darauf zu bestehen, dass ein Ausdruck polymorph ist.

  • Caml hat eine viel vernünftigere und vernünftigere Beziehung zwischen Schnittstellen (als Modultypen oder Signaturen bezeichnet ) und (konkreten) Implementierungen (als Module oder Strukturen bezeichnet ) als SML. In SML ist so ziemlich alles möglich und man muss sich auf den Programmierer verlassen, um gute Konventionen zu etablieren. In Caml werden vom Compiler gute Konventionen festgelegt und durchgesetzt.

  • In SML werden arithmetische Operatoren überladen, um sie sowohl auf Gleitkomma- als auch auf Ganzzahldaten anzuwenden. In Caml sind die Bediener nicht überlastet. Gleitkommaoperatoren werden mit einem zusätzlichen Punkt versehen.

  • In SML kann der Programmierer die Priorität und Zuordnung von Infix-Operatoren steuern. In Caml werden diese durch das erste Zeichen des Operatornamens bestimmt. Diese Einschränkung schränkt die Vorteile der Definition Ihrer eigenen Infix-Notation ein.

Eine detailliertere Analyse mit redaktionellen Kommentaren finden Sie auch auf der Vergleichsseite von Adam Chlipala .


4
Sie haben die Gleichheit (uneingeschränkt und unsicher in OCaml gegenüber sicheren, aber eingeschränkten Gleichheitstypen in SML), nicht verallgemeinerte Typvariablen ('_a in OCaml), printf, Interpretation von Dateinamen als Modulnamen in OCaml und weitaus mehr Currying in OCamls stdlib vergessen. Sie haben die Schnittstelle zweimal geschrieben, als Sie das zweite Mal etwas anderes (Implementierung?) Bedeuteten.
JD

1
und OCamls Or-Patterns und Guards beim Pattern Matching.
JD

1
Beachten Sie, dass die Einschränkung der Nützlichkeit von Typanmerkungen in 3.12 etwas verringert wurde, wo Anmerkungen e : 'a . ty(a)möglich und sinnvoll sind.

4
Sie machen die wichtige Bemerkung: "Caml Bibliothek ist sehr wichtig". Dies scheint die gesamte Philosophie zu durchdringen, bis zu dem Punkt, dass eine parallele Implementierung auf Multicore-Hardware sehr schwierig bis unmöglich zu sein scheint. Im Gegensatz dazu gibt es mindestens zwei parallele SMLs: Mlton und Poly / ML.
Makarius

2
In Bezug auf Ihren dritten Punkt erfordern Datensatznamen in OCaml keine Eindeutigkeit mehr.
PatJ


-3

OCaml fügt Objektorientierungsfunktionen hinzu und weist einige geringfügige Syntaxunterschiede auf.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.