web-dev-qa-db-fra.com

Quelles sont les différences entre SML et OCaml?

Qu'est-ce qui distingue les deux dialectes ML?

98
Nathan

Il y a beaucoup de différences, certaines techniques, d'autres sociopolitiques. J'ai essayé de mettre les différences les plus importantes en premier.

  • SML est un langage avec une définition et une norme. Il est stable (et en fait a été gelé pour ne pas pouvoir évoluer). Objective Caml est une implémentation contrôlée par un petit groupe à l'INRIA. Elle continue d'évoluer. (IMO l'évolution est bien gérée.)

  • SML a de nombreuses implémentations; Caml n'en a qu'un.

  • Objective Caml possède un certain nombre de fonctionnalités supplémentaires, parmi lesquelles les plus importantes sont probablement les objets et les variantes polymorphes.

  • Les deux langues ont des modèles de types d'enregistrement 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 champ en commun. Cette bizarrerie peut rendre le portage de SML vers Caml un peu délicat.

  • Il existe quelques 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 des fonctions est une primitive de niveau supérieur en 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 fonctions Caml List ne sont pas sûres pour les 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é si le type ty s'unifie avec le type e. En SML, e : ty n'est accepté que si le type ty est une instance du type e. Cette distinction rend l'annotation dans Caml beaucoup moins utile dans la 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 sensible entre les interfaces (appelées types de modules ou signatures ) et implémentations (concrètes) (appelées modules ou structures ) que SML. En SML, presque tout se passe 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.

  • En SML, les opérateurs arithmétiques sont surchargés pour s'appliquer aux données à virgule flottante et aux données entières. À Caml, les opérateurs ne sont pas surchargés; les opérateurs à virgule flottante sont signalés par un point supplémentaire.

  • En SML, le programmeur peut contrôler la priorité et l'associtivité 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 avec commentaire éditorial, vous pouvez également consulter page de comparaison d'Adam Chlipala .

156
Norman Ramsey

Pour plus de détails sur les différences syntaxiques mentionnées par Norman Ramsey, voici quelques pages Web:

31
bk1e