stringtranslate.com

Mercurio (lenguaje de programación)

Mercury es un lenguaje de programación de lógica funcional diseñado para usos del mundo real. La primera versión fue desarrollada en el Departamento de Informática de la Universidad de Melbourne por Fergus Henderson, Thomas Conway y Zoltan Somogyi, bajo la supervisión de Somogyi, y se publicó el 8 de abril de 1995.

Mercury es un lenguaje de programación lógica puramente declarativo . Está relacionado con Prolog y Haskell . [2] Cuenta con un sistema de tipos polimórfico, estático y fuerte , y un sistema de modos y determinismo fuerte.

La implementación oficial, Melbourne Mercury Compiler, está disponible para la mayoría de las plataformas Unix y similares a Unix , incluidas Linux , macOS y Windows .

Descripción general

Mercury se basa en el lenguaje de programación lógica Prolog . Tiene la misma sintaxis y los mismos conceptos básicos, como el algoritmo de resolución de cláusula definida lineal selectiva (SLD). Se puede considerar un subconjunto puro de Prolog con tipos y modos sólidos. Como tal, a menudo se lo compara con su predecesor en cuanto a características y eficiencia en tiempo de ejecución.

El lenguaje está diseñado utilizando principios de ingeniería de software . A diferencia de las implementaciones originales de Prolog, tiene una fase de compilación separada , en lugar de ser interpretado directamente. Esto permite detectar una gama mucho más amplia de errores antes de ejecutar un programa. Cuenta con un sistema de tipos y modos estáticos estrictos [2] y un sistema de módulos.

Al utilizar información obtenida en tiempo de compilación (como tipo y modo), los programas escritos en Mercury suelen tener un rendimiento significativamente más rápido que los programas equivalentes escritos en Prolog. [3] [4] Sus autores afirman que Mercury es el lenguaje lógico más rápido del mundo, por un amplio margen. [2]

Mercury es un lenguaje puramente declarativo , a diferencia de Prolog , ya que carece de declaraciones Prolog extralógicas como !(cut) y entrada/salida imperativa (E/S). Esto permite un análisis estático avanzado de programas y la optimización de programas , incluida la recolección de basura en tiempo de compilación , [5] pero puede hacer que ciertas construcciones de programación (como un cambio sobre una serie de opciones, con un valor predeterminado [ dudosodiscutir ] ) sean más difíciles de expresar. Si bien Mercury permite una funcionalidad impura, sirve principalmente como una forma de llamar a código de idioma extranjero. Todo código impuro debe marcarse explícitamente. Las operaciones que normalmente serían impuras (como entrada/salida ) se expresan utilizando construcciones puras en Mercury usando tipos lineales , al enhebrar un valor mundial ficticio a través de todo el código relevante.

Entre los programas escritos en Mercury se encuentran el compilador Mercury y el formateador Prince XML . La empresa de software ODASE también ha utilizado Mercury para desarrollar su plataforma de desarrollo de software centrada en ontologías, ODASE. [6]

Back-ends

Mercury tiene varios back-ends que permiten compilar el código de Mercury en varios lenguajes, incluidos:

Nivel de producción

Pasado

Mercury también cuenta con una interfaz en otros idiomas, lo que permite vincular código en otros idiomas (según el back-end elegido) con el código de Mercury. Son posibles los siguientes idiomas extranjeros:

Luego, se puede interactuar con otros idiomas llamándolos desde estos idiomas. Sin embargo, esto significa que es posible que sea necesario escribir el código en otro idioma varias veces para los distintos backends, ya que de lo contrario se perderá la portabilidad entre backends.

El back-end más comúnmente utilizado es el back-end C original de bajo nivel.

Ejemplos

Hola Mundo :

 :-  módulo  hola .  :-  interfaz .  :-  import_module  io .  :-  pred  main ( io : :di ,  io : :uo )  es  det . :-  implementación .  main (! IO )  :-  io . write_string ( "Hola, mundo!\n" ,  ! IO ).

Calculando el décimo número de Fibonacci (de la forma más obvia): [7]

 :-  módulo  fib .  :-  interfaz .  :-  import_module  io .  :-  pred  main ( io : :di ,  io : :uo )  es  det .  :-  implementación .  :-  import_module  int . :-  func  fib ( int )  =  int .  fib ( N )  =  ( si  N  =<  2  entonces  1  de lo contrario  fib ( N  -  1 )  +  fib ( N  -  2 )). principal (! IO )  :-  io . write_string ( "fib(10) = " ,  ! IO ),  io . write_int ( fib ( 10 ),  ! IO ),  io . nl (! IO ).  % En su lugar, podría utilizar io.format("fib(10) = %d\n", [i(fib(10))], ! IO).

!IOes una "variable de estado", que es un azúcar sintáctico para un par de variables a las que se les asignan nombres concretos en la compilación; por ejemplo, lo anterior se simplifica a algo como:

 principal ( IO0 ,  IO )  :-  io . write_string ( "fib(10) = " ,  IO0 ,  IO1 ),  io . write_int ( fib ( 10 ),  IO1 ,  IO2 ),  io . nl ( IO2 ,  IO ).

Calendario de lanzamiento

El esquema de nombres de las versiones estables fue de 0.1 a 0.13 para las primeras trece versiones estables. En febrero de 2010, el proyecto Mercury decidió nombrar cada versión estable utilizando el año y el mes de la versión. Por ejemplo, 10.04 es para una versión realizada en abril de 2010.

A menudo también hay una instantánea periódica de la versión del sistema de desarrollo del día (ROTD).

Compatibilidad con IDE y editor

Véase también

Referencias

  1. ^ "Versión 22.01.8". 8 de septiembre de 2023. Consultado el 18 de septiembre de 2023 .
  2. ^ abc El Proyecto Mercury - Motivación
  3. ^ El Proyecto Mercury - Puntos de referencia
  4. ^ Somogyi, Zoltan; Henderson, Fergus; Conway, Thomas (octubre-diciembre de 1996). "El algoritmo de ejecución de Mercury: un lenguaje de programación lógica puramente declarativo eficiente". Journal of Logic Programming . 29 (1–3). Mercurylang.org: 17–64. CiteSeerX 10.1.1.46.9861 . doi :10.1016/S0743-1066(96)00068-4 . Consultado el 30 de agosto de 2008 . 
  5. ^ Mazur, Nancy (mayo de 2004). Recolección de basura en tiempo de compilación para el lenguaje declarativo Mercury (PDF) (Tesis). Universidad Católica de Lovaina.
  6. ^ ODASE
  7. ^ Adaptado del tutorial Mercury de Ralph Becket

Enlaces externos