Qu'est-ce qui différencie les deux dialectes ML ?
Réponses
Trop de publicités?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 évoluer). Objective Caml est une implémentation contrôlée par un petit groupe à l'INRIA. Il continue à évoluer. (IMO l'évolution est bien gérée).
-
SML a de nombreuses implémentations ; Caml n'en a qu'une.
-
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'enregistrements radicalement différents. En bref, en 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 communs. Cette bizarrerie peut rendre le portage de SML vers Caml un peu délicat.
-
Il existe un certain nombre de 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 haut niveau dans SML ; elle ne fait pas partie de la bibliothèque Caml. La bibliothèque Caml pour les chaînes de caractères ne fournit pas de fonction fold (du moins pas depuis la version 3.08). Les implémentations de nombreuses fonctions de la bibliothèque Caml
List
ne sont pas sûres pour les listes très longues ; elles font sauter la pile. -
Les systèmes de types sont subtilement différents : en Caml, une annotation de type sur une expression
e : ty
est accepté si le typety
unifie avec le type dee
. Dans SML,e : ty
n'est accepté que si le typety
est un instance du type dee
. 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 sensée et raisonnable entre les interfaces (appelées types de modules ou signatures ) et des implémentations (concrètes) (appelées modules ou structures ) que SML. En SML, tout est permis et vous devez compter sur le programmeur pour établir de bonnes conventions. En Caml, les bonnes conventions sont établies et appliquées par le compilateur.
-
En SML, les opérateurs arithmétiques sont surchargés pour s'appliquer à la fois aux données en virgule flottante et aux données entières. En 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 précédence et l'associativité des opérateurs infixes. En Caml, celles-ci sont déterminées par le premier caractère du nom de l'opérateur. Cette restriction limite les avantages de la possibilité de définir votre propre notation infixe.
Pour plus de détails concernant les différences syntaxiques mentionnées par Norman Ramsey, voici quelques pages web :
- Comparaison entre Objective Caml et Standard ML Le site Web de la Commission européenne : a de bonnes explications sur les différences, et les icônes "pratique" et "pur" sont également amusantes.
- ML standard et Caml objectif, côte à côte