Mercury es un lenguaje de programación lógica funcional creado para usos del mundo real. La primera versión fue desarrollada en la Universidad de Melbourne , Departamento de Ciencias de la Computación, por Fergus Henderson, Thomas Conway y Zoltan Somogyi, bajo la supervisión de Somogyi, y publicada el 8 de abril de 1995.
Paradigma | Lógica , funcional , orientada a objetos |
---|---|
Diseñada por | Zoltan Somogyi |
Desarrollador | Universidad de Melbourne |
Apareció por primera vez | 8 de abril de 1995 |
Lanzamiento estable | 20.06.1 / 3 de noviembre de 2020 |
Disciplina de mecanografía | Fuerte , estático , polimórfico |
Lenguaje de implementación | Mercurio |
Plataforma | IA-32 , x86-64 , ARM , Sparc64 , Java , CLI , Erlang / OTP |
SO | Multiplataforma : Unix , Linux , macOS , Solaris , FreeBSD , OpenBSD , Windows , Android |
Licencia | Compilador GPL , biblioteca estándar LGPL |
Extensiones de nombre de archivo | .metro |
Sitio web | www |
Implementaciones importantes | |
Compilador Melbourne Mercury | |
Influenciado por | |
Prólogo , esperanza , Haskell |
Mercury es un lenguaje de programación lógico puramente declarativo . Está relacionado tanto con Prolog como con Haskell . [1] Presenta un sistema de tipo fuerte, estático y polimórfico , y un sistema de determinismo y modo 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 selectiva lineal de cláusulas definidas (SLD). Puede verse como un subconjunto puro de Prolog con tipos y modos fuertes. Como tal, a menudo se compara con su predecesor en 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 modo y tipo estático estricto [1] y un sistema de módulos.
Al utilizar la información obtenida en el momento de la compilación (como el tipo y el modo), los programas escritos en Mercury suelen funcionar significativamente más rápido que los programas equivalentes escritos en Prolog. [2] [3] Sus autores afirman que Mercurio es el lenguaje lógico más rápido del mundo, por un amplio margen. [1]
Mercury es un lenguaje puramente declarativo , a diferencia de Prolog , ya que carece de declaraciones Prolog extra lógicas como !
(corte) y entrada / salida imperativa (E / S). Esto permite el análisis avanzado de programas estáticos y la optimización del programa , incluida la recolección de basura en tiempo de compilación , [4] pero puede hacer que ciertas construcciones de programación (como un cambio sobre varias opciones, con un valor predeterminado [ dudoso ] ) sean más difíciles de expresar . (Si bien Mercury permite la funcionalidad impura, esto 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 usando construcciones puras en Mercury usando tipos lineales , pasando un valor mundial ficticio a través de todo el código relevante.
Los programas notables escritos en Mercury incluyen el compilador Mercury y el formateador Prince XML . La empresa de software Mission Critical IT también ha estado utilizando Mercury desde 2000 para desarrollar aplicaciones empresariales y su plataforma de desarrollo de software basada en ontologías, ODASE. [5]
Back-extremos
Mercury tiene varios back-end, que permiten compilar código Mercury en varios idiomas, que incluyen:
Nivel de producción
- C de bajo nivel para GNU Compiler Collection (GCC), el back-end original de Mercury
- Alto nivel C
- Java
- C#
- Erlang
Pasado
- Lenguaje ensamblador a través del back-end de GCC
- Aditi, un sistema de base de datos deductivo también desarrollado en la Universidad de Melbourne . Mercury-0.12.2 es la última versión compatible con Aditi. [ cita requerida ]
- Lenguaje intermedio común (CIL) para .NET Framework
Mercury también cuenta con una interfaz de idioma extranjero, lo que permite que el código en otros idiomas (según el back-end elegido) se vincule con el código de Mercury. Son posibles los siguientes idiomas extranjeros:
Back-end | Idiomas extranjeros) |
---|---|
C (ambos niveles) | C |
Java | Java |
Erlang | Erlang |
ILLINOIS | Lenguaje intermedio común (CIL) o C # |
Luego, se pueden conectar otros idiomas llamándolos desde estos idiomas. Sin embargo, esto significa que es posible que sea necesario escribir el código de un idioma extranjero varias veces para los diferentes backends; de lo contrario, se perderá la portabilidad entre los backends.
El back-end más utilizado es el back-end C original de bajo nivel.
Ejemplos de
Hola mundo :
: - módulo hola . : - interfaz . : - módulo_importación io . : - pred principal ( 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): [6]
: - módulo fib . : - interfaz . : - módulo_importación io . : - pred principal ( io : : di , io : : UO ) es det . : - implementación . : - módulo_importación int . : - func fib ( int ) = int . fib ( N ) = ( si N = < 2 entonces 1 si no 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 usar io.format ("fib (10) =% d \ n", [i (fib (10))],! IO).
!IO
es una "variable de estado", que es azúcar sintáctica para un par de variables a las que se les asignan nombres concretos en la compilación; por ejemplo, lo anterior se desaconseja a algo como:
principal ( IO0 , IO ) : - io . write_string ( "fib (10) =" , IO0 , IO1 ), io . write_int ( fib ( 10 ), IO1 , IO2 ), io . nl ( IO2 , IO ).
Programa de lanzamiento
Los lanzamientos se nombran según el año y el mes de lanzamiento. La versión estable actual es 20.06 (30 de junio de 2020). Las liberaciones anteriores se numeraron 0.12, 0.13, etc., y el tiempo entre liberaciones estables puede ser de hasta 3 años.
A menudo también hay una versión instantánea del día (ROTD) que consta de las últimas funciones y correcciones de errores agregadas a la última versión estable.
Compatibilidad con IDE y editor
- Los desarrolladores brindan soporte para Vim
- Biblioteca Flycheck para Emacs
- Hay un complemento disponible para Eclipse IDE
- Hay un complemento disponible para NetBeans IDE
Ver también
- Curry , otro lenguaje lógico funcional
- Alice , un idioma dialectal de ML estándar
- Logtalk , lenguaje, una extensión orientada a objetos de Prolog que se compila en Prolog
- Oz / Mozart , un lenguaje multiparadigma
- Visual Prolog , lenguaje, una extensión de Prolog orientada a objetos fuertemente tipada, con una nueva sintaxis
Referencias
- ^ a b c El Proyecto Mercurio - Motivación
- ^ El proyecto Mercury - Puntos de referencia
- ^ Somogyi, Zoltan; Henderson, Fergus; Conway, Thomas (octubre-diciembre de 1996). "El algoritmo de ejecución de Mercury: un eficiente lenguaje de programación lógica puramente declarativa" . Revista de programación lógica . Mercurylang.org. 29 (1-3): 17-64. CiteSeerX 10.1.1.46.9861 . doi : 10.1016 / S0743-1066 (96) 00068-4 . Consultado el 30 de agosto de 2008 .
- ^ Mazur, Nancy (mayo de 2004). Recolección de basura en tiempo de compilación para el lenguaje declarativo Mercury (PDF) (Tesis). Katholieke Universiteit Leuven.
- ^ TI de misión crítica
- ^ Adaptado del tutorial Mercury de Ralph Becket
enlaces externos
- Página web oficial