Articulo de referencia

Mercurio (lenguaje de programación)

[[GNU Lesser General Public License|LGPL]] standard library"},"file ext":{"wt":".m"},"file format":{"wt":""},"website":{"wt":"{{URL|www.mercurylang.org}}"},"implementations":{"w...

Mercury es un lenguaje de programación lógica funcional diseñado para aplicaciones prácticas. La primera versión fue desarrollada en el departamento de Ciencias de la Computación de la Universidad de Melbourne por Fergus Henderson, Thomas Conway y Zoltan Somogyi, bajo la supervisión de este último, y se lanzó el 8 de abril de 1995.

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

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

Descripción general

Mercury se basa en el lenguaje de programación lógica Prolog . Posee la misma sintaxis y los mismos conceptos básicos, como el algoritmo de resolución selectiva de cláusulas definidas lineales (SLD). Puede considerarse un subconjunto puro de Prolog con tipos y modos robustos. Por ello, suele compararse con su predecesor en cuanto a funcionalidades y eficiencia de ejecución.

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

Al utilizar información obtenida en tiempo de compilación (como el tipo y el modo), los programas escritos en Mercury suelen ser significativamente más rápidos 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 sentencias extralógicas de Prolog como !(cut) y entrada/salida imperativa (E/S). Esto permite un análisis estático avanzado del programa y una optimización del programa , incluida la recolección de basura en tiempo de compilación , [ 5 ] pero puede hacer que ciertas construcciones de programación (como un switch sobre varias opciones, con un valor predeterminado ) sean más difíciles de expresar. Si bien Mercury permite funcionalidad impura, sirve principalmente como una forma de llamar a código de otro lenguaje. Todo el código impuro debe estar marcado explícitamente. Las operaciones que normalmente serían impuras (como entrada/salida ) se expresan usando construcciones puras en Mercury usando tipos lineales , enhebrando un valor mundial ficticio a través de todo el código relevante.

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

Sistemas de backend

Mercury cuenta con varios back-ends que permiten compilar el código Mercury en varios lenguajes, entre ellos:

Nivel de producción

Pasado

Mercury también cuenta con una interfaz para idiomas extranjeros, lo que permite vincular código escrito en otros lenguajes (según el backend elegido) con el código de Mercury. Los siguientes idiomas extranjeros son posibles:

Posteriormente, se puede acceder a otros lenguajes llamándolos desde estos lenguajes. Sin embargo, esto implica que el código en otros lenguajes podría tener que escribirse varias veces para los diferentes sistemas backend, ya que de lo contrario se perdería la portabilidad entre ellos.

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

Ejemplos

Hola Mundo :

:- módulo hola . :- interfaz . :- import_module io . :- pred main ( io : :di , io : :uo ) es det .:- implementación . principal (! 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 de fibra . :- interfaz . :- import_module io . :- pred main ( io : :di , io : :uo ) es det .:- implementación . :- módulo_de_importación int .:- func fib ( int ) = int . fib ( N ) = ( if N =< 2 then 1 else fib ( N - 1 ) + fib ( N - 2 )).main (! IO ) :- io . write_string ( "fib(10) = " , ! IO ), io . write_int ( fib ( 10 ), ! IO ), io . nl (! IO ). % Podría en su lugar usar io.format("fib(10) = %d\n", [i(fib(10))], !IO).

!IOes una "variable de estado", que es 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 descompone en algo como:

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

Calendario de lanzamientos

El esquema de nomenclatura 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 su lanzamiento. Por ejemplo, 10.04 corresponde a una versión lanzada en abril de 2010.

También suele haber una instantánea periódica de la versión del sistema de desarrollo del día (ROTD).

Compatibilidad con IDE y editores

  • Los desarrolladores brindan soporte para Vim.
  • Librería Flycheck para Emacs
  • Existe un complemento disponible para el IDE Eclipse.
  • Existe un complemento disponible para el IDE NetBeans.

Véase también

  • Curry , otro lenguaje de lógica funcional
  • Alice , un idioma dialectal de Standard ML
  • Logtalk , lenguaje, una extensión orientada a objetos de Prolog que se compila a Prolog.
  • Oz/Mozart , un lenguaje multiparadigma
  • Visual Prolog , lenguaje, una extensión de Prolog fuertemente tipada y orientada a objetos, con una nueva sintaxis.

Referencias

  1. "Versión 22.01.8" . 8 de septiembre de 2023. Consultado el 18 de septiembre de 2023 .
  2. 1 2 3 El Proyecto Mercurio - Motivación
  3. El Proyecto Mercurio - 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 y 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 . Recuperado 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 de Mercurio de Ralph Becket
  • Sitio web oficial