¿Cuáles son las diferencias entre SML y OCaml? [cerrado]

Respuestas:

157

Hay muchas diferencias, algunas técnicas, otras sociopolíticas. Intenté poner primero las diferencias más importantes.

  • SML es un lenguaje con una definición y un estándar. Es estable (y de hecho se ha congelado por lo que no puede evolucionar). Objective Caml es una implementación controlada por un pequeño grupo en INRIA. Sigue evolucionando. (En mi opinión, la evolución se gestiona bien).

  • SML tiene muchas implementaciones; Caml solo tiene uno.

  • Objective Caml tiene una serie de características adicionales, entre las que las más destacadas son probablemente objetos y variantes polimórficas.

  • Los dos lenguajes tienen modelos de tipos de registros dramáticamente diferentes. Brevemente, en Caml, los nombres de los campos de registro deben ser únicos, mientras que en SML, dos tipos de registros diferentes en el mismo ámbito pueden tener nombres de campo en común. Esta peculiaridad puede hacer que la migración de SML a Caml sea un poco complicada.

  • Hay bastantes diferencias sintácticas.

  • Las bibliotecas y las funciones estándar son dramáticamente diferentes. La biblioteca Caml es muy importante, mientras que la biblioteca básica estándar SML es más funcional. Por ejemplo, la composición de funciones es una primitiva de nivel superior en SML; no forma parte de la biblioteca Caml. La biblioteca de cadenas de Caml no proporciona una función de plegado (al menos no a partir de la versión 3.08). Las implementaciones de muchas de las Listfunciones de Caml no son seguras para listas muy largas; ellos soplan la pila.

  • Los sistemas de tipos son sutilmente diferentes: en Caml, e : tyse acepta una anotación de tipo en una expresión si el tipo se ty unifica con el tipo de e. En SML, e : tysolo se acepta si el tipo tyes una instancia del tipo de e. Esta distinción hace que la anotación en Caml sea mucho menos útil en la práctica, porque es imposible utilizar una anotación de tipo para insistir en que una expresión es polimórfica.

  • Caml tiene una relación mucho más sensata y sensata entre interfaces (llamadas tipos de módulo o firmas ) e implementaciones (concretas) (llamadas módulos o estructuras ) que SML. En SML prácticamente todo vale y hay que confiar en el programador para establecer buenas convenciones. En Caml, el compilador establece y aplica buenas convenciones.

  • En SML, los operadores aritméticos están sobrecargados para aplicarlos a datos enteros y de punto flotante. En Caml, los operadores no están sobrecargados; Los operadores de punto flotante se anotan con un punto adicional.

  • En SML, el programador puede controlar la precedencia y la asociación de los operadores infijos. En Caml, estos están determinados por el primer carácter del nombre del operador. Esta restricción limita los beneficios de poder definir su propia notación infija.

Para un análisis más detallado completo con comentarios editoriales, también puede consultar la página de comparación de Adam Chlipala .

Norman Ramsey
fuente
4
Olvidó la igualdad (no restringida e insegura en OCaml frente a tipos de igualdad seguros pero restringidos en SML), variables de tipo no generalizadas ('_a en OCaml), printf, interpretación de nombres de archivos como nombres de módulos en OCaml, mucho más currying en la biblioteca estándar de OCaml. Escribió interfaz dos veces cuando se refería a otra cosa (¿implementación?) La segunda vez.
JD
1
y patrones y protectores de OCaml en combinación de patrones.
JD
1
Tenga en cuenta que la limitación sobre la utilidad de las anotaciones de tipo se ha aliviado un poco en 3.12, donde la anotación e : 'a . ty(a)es posible y significativa.
4
Haces una observación importante: "La biblioteca Caml es muy imperativa". Esto parece impregnar toda la filosofía, hasta el punto de que la implementación paralela en hardware multinúcleo parece ser muy difícil o imposible. Por el contrario, hay al menos dos SML paralelos: Mlton y Poly / ML.
Makarius
2
Acerca de su tercer punto, los nombres de registros ya no requieren unicidad en OCaml.
PatJ
-3

OCaml agrega características de orientación a objetos y tiene algunas diferencias de sintaxis menores.

Charlie martin
fuente