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 Listfonctions 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 : tyest acceptée si le type tys'unifie avec le type de e. En SML, e : tyn'est accepté que si le type tyest 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.
Vous avez oublié l'égalité (non restreinte et non sécurisée en OCaml vs les types d'égalité sûrs mais restreints en SML), les variables de type non généralisées ('_a en OCaml), printf, l'interprétation des noms de fichiers comme noms de modules dans OCaml, beaucoup plus curry dans la bibliothèque stdlib d'OCaml. Vous avez écrit l'interface deux fois alors que vous vouliez dire autre chose (implémentation?) La deuxième fois.
JD
1
et les modèles or et gardes d'OCaml dans la correspondance de modèles.
JD
1
Notez que la limitation de l'utilité des annotations de type a été quelque peu allégée dans la version 3.12, où l'annotation e : 'a . ty(a)est possible et significative.
4
Vous faites le constat important: "La bibliothèque Caml est très impérative". Cela semble imprégner toute la philosophie, au point que la mise en œuvre parallèle sur du matériel multicœur semble être très difficile, voire impossible. En revanche, il existe au moins deux SML parallèles: Mlton et Poly / ML.
Makarius
2
Concernant votre troisième point, les noms d'enregistrement n'ont plus besoin d'unicité dans OCaml.
PatJ
31
Pour plus de détails sur les différences syntaxiques mentionnées par Norman Ramsey, voici quelques pages Web:
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 typety
s'unifie avec le type dee
. En SML,e : ty
n'est accepté que si le typety
est une 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 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 .
la source
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:
la source
OCaml ajoute des fonctionnalités d'orientation des objets et présente quelques différences de syntaxe mineures.
la source