¿Cuáles son las diferencias entre SML y OCaml?
(3)
Hay muchas diferencias, algunas técnicas, otras sociopolíticas. Intenté poner diferencias más importantes primero.
SML es un lenguaje con una definición y un estándar. Es estable (y de hecho ha sido congelado por lo que no puede evolucionar). Objetivo Caml es una implementación controlada por un pequeño grupo en INRIA. Continúa evolucionando. (IMO la evolución se maneja bien)
SML tiene muchas implementaciones; Caml tiene solo uno.
Objetivo Caml tiene una serie de características adicionales, entre las cuales las más prominentes son probablemente objetos y variantes polimórficas.
Los dos idiomas tienen modelos de tipos de registro dramáticamente diferentes. En resumen, 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 portar de SML a Caml sea un poco complicado.
Hay bastantes diferencias sintácticas.
Las bibliotecas y las funciones estándar son radicalmente diferentes. La biblioteca Caml es muy imperativa, mientras que la Biblioteca SML Standard Basis es más funcional. Por ejemplo, la composición de funciones es una primitiva de nivel superior en SML; no es parte de la biblioteca Caml. La biblioteca de cadenas 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 funciones de la
List
Caml no son seguras para listas muy largas; ellos explotan la pila.Los sistemas de tipo son sutilmente diferentes: en Caml, se acepta una anotación de tipo en una expresión
e : ty
si el tipoty
unifica con el tipo dee
. En SML,e : ty
solo se acepta si el tipoty
es una instancia del tipo dee
. Esta distinción hace que la anotación en Caml sea mucho menos útil en la práctica, porque es imposible usar 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 las interfaces (llamadas tipos de módulos o firmas ) y las implementaciones (concretas) (llamadas módulos o estructuras ) que SML. En SML casi todo vale y tienes 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 aplicar tanto a datos de coma flotante como a datos enteros. En Caml, los operadores no están sobrecargados; los operadores de coma flotante se anotan con un punto extra.
En SML, el programador puede controlar la precedencia y la asociatividad de los operadores de infijo. En Caml, estos están determinados por el primer carácter del nombre del operador. Esta restricción limita los beneficios de poder definir tu propia notación infija.
Para un análisis más detallado completo con comentarios editoriales, también puede consultar adam.chlipala.net/mlcomp .
¿Qué diferencia a los dos dialectos ML?
OCaml agrega características de orientación a objetos y tiene algunas diferencias menores de sintaxis.
Para obtener detalles sobre las diferencias sintácticas que mencionó Norman Ramsey, aquí hay un par de páginas web:
- adam.chlipala.net/mlcomp : tiene buenas explicaciones de las diferencias, y los iconos "prácticos" contra "puros" también son divertidos
- Estándar ML y Objetivo Caml, uno al lado del otro