2009-03-31 9 views

Répondre

141

Il y a beaucoup de différences, certaines techniques, d'autres sociopolitiques. J'ai essayé de mettre en premier des différences 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 à l'INRIA. Il 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 a un certain nombre de fonctionnalités supplémentaires, parmi lesquelles les plus importantes sont probablement des objets et des variantes polymorphes.

  • Les deux langages ont des modèles de types d'enregistrements radicalement différents. Brièvement, dans Caml, les noms des champs d'enregistrement doivent être uniques, alors qu'en SML, deux types d'enregistrements 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 compliqué.

  • 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, alors que la bibliothèque standard SML est plus fonctionnelle. Par exemple, la composition de fonction est une primitive de niveau supérieur dans SML; ça ne fait pas partie de la bibliothèque Caml. La bibliothèque de chaînes Caml ne fournit pas de fonction de pli (du moins pas à partir de la version 3.08). Les implémentations de nombreuses fonctions Caml List ne sont pas sécurisées pour les très longues listes; ils soufflent la pile.

  • Les systèmes de type sont subtilement différents: En Caml, une annotation de type sur une expression e : ty est acceptée si le type tyunifie avec le type de 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 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 sain et sensible entre les interfaces (appelé types de modules ou signatures) implémentations et (béton) (appelés modules ou structures) que SML. En SML, à peu près tout se passe et vous devez compter sur le programmeur pour établir de bonnes conventions. Dans Caml, de bonnes conventions sont établies et appliquées par le compilateur.

  • En langage 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. Dans Caml, les opérateurs ne sont pas surchargés; les opérateurs à virgule flottante sont notés avec un point supplémentaire.

  • En langage SML, le programmeur peut contrôler la priorité et l'associbilité des opérateurs infixes. Dans Caml, ils 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 regarder Adam Chlipala's comparison page.

+2

très instructif! mon +1 pour ça. –

+4

Vous avez oublié l'égalité (sans restriction et dangereuse dans OCaml vs SML), les variables de type non-généralisées ('_a dans OCaml), printf, l'interprétation des noms de fichiers dans OCaml, beaucoup plus dans stdlib d'OCaml . Vous avez écrit interface deux fois quand vous vouliez dire autre chose (implémentation?) La deuxième fois. –

+1

et or-modèles et gardes dans la correspondance de modèle. –

-4

OCaml ajoute des fonctions d'orientation d'objet et présente des différences de syntaxe mineures.

Questions connexes