Réponses:
Il y a beaucoup de différences, certaines techniques, d'autres sociopolitiques. J'ai essayé de mettre en avant les différences les plus importantes.
SML est un langage avec une définition et un standard. Il est stable (et en fait a été gelé donc il ne peut pas évoluer). Objective Caml est une implémentation contrôlée par un petit groupe de l'INRIA. Il continue d'évoluer. (OMI, l'évolution est bien gérée.)
SML a de nombreuses implémentations; Caml n'en a qu'un.
Objective Caml a un certain nombre de fonctionnalités supplémentaires, parmi lesquelles les plus importantes sont probablement des objets et des variantes polymorphes.
Les deux langues ont des modèles de types d'enregistrements radicalement différents. En bref, dans Caml, les noms des champs d'enregistrement doivent être uniques, alors qu'en SML, deux types d'enregistrement différents dans la même portée peuvent avoir des noms de champs en commun. Cette bizarrerie peut rendre le portage de SML vers Caml un peu délicat.
Il existe de nombreuses différences syntaxiques.
Les bibliothèques et les fonctions standard sont radicalement différentes. La bibliothèque Caml est très impérative, tandis que la bibliothèque de base standard SML est plus fonctionnelle. Par exemple, la composition de fonctions est une primitive de niveau supérieur dans SML; cela ne fait pas partie de la bibliothèque Caml. La bibliothèque de chaînes Caml ne fournit pas de fonction de repli (du moins pas à partir de la version 3.08). Les implémentations de nombreuses List
fonctions Caml ne sont pas sûres pour de très longues listes; ils font sauter la pile.
Les systèmes de types sont subtilement différents: dans Caml, une annotation de type sur une expression e : ty
est acceptée si le type ty
s'unifie avec le type de e
. En SML, e : ty
n'est accepté que si le type ty
est une instance du type de e
. Cette distinction rend l'annotation dans Caml beaucoup moins utile en pratique, car il est impossible d'utiliser une annotation de type pour insister sur le fait qu'une expression est polymorphe.
Caml a une relation beaucoup plus saine et sensée entre les interfaces (appelées types de modules ou signatures ) et les implémentations (concrètes) (appelées modules ou structures ) que SML. En SML, presque tout est permis et vous devez vous fier au programmeur pour établir de bonnes conventions. Dans Caml, de bonnes conventions sont établies et appliquées par le compilateur.
Dans SML, les opérateurs arithmétiques sont surchargés pour s'appliquer aux données à virgule flottante et entière. Dans Caml, les opérateurs ne sont pas surchargés; les opérateurs à virgule flottante sont notés avec un point supplémentaire.
En SML, le programmeur peut contrôler la priorité et l'associbilité des opérateurs d'infixe. Dans Caml, ceux-ci sont déterminés par le premier caractère du nom de l'opérateur. Cette restriction limite les avantages de pouvoir définir votre propre notation d'infixe.
Pour une analyse plus détaillée complète avec un commentaire éditorial, vous pouvez également consulter la page de comparaison d'Adam Chlipala .
e : 'a . ty(a)
est possible et significative.
Pour plus de détails sur les différences syntaxiques mentionnées par Norman Ramsey, voici quelques pages Web:
OCaml ajoute des fonctionnalités d'orientation des objets et présente quelques différences de syntaxe mineures.