Mercury

llenguatge de programació
Per a altres significats, vegeu «Mercury (desambiguació)».

Mercury[1] és un llenguatge de programació lògic-funcional dirigit a aplicacions del món real. Està desenvolupat a la Universitat de Melbourne sota la supervisió de Zoltan Somogyi. La primera versió va ésser desenvolupada per Fergus Henderson, Thomas Conway i Zoltan Somogyi i va ser editada l'abril del 1995.

Infotaula de llenguatge de programacióMercury
Tipusllenguatge de programació, llenguatge de programació funcional, llenguatge de programació orientat a objectes, purely functional programming language (en) Tradueix i llenguatge de programació multiparadigma Modifica el valor a Wikidata
Data de creació8 abril 1995 Modifica el valor a Wikidata
DesenvolupadorUniversitat de Melbourne Modifica el valor a Wikidata
Paradigma de programaciólogic programming (en) Tradueix, programació orientada a objectes, programació funcional, programació multiparadigma i purely functional programming (en) Tradueix Modifica el valor a Wikidata
Darrera versió estable20.06.1 () Modifica el valor a Wikidata
Influenciat perProlog, Haskell i Hope Modifica el valor a Wikidata
Extensió dels fitxersm Modifica el valor a Wikidata
Codi fontCodi font Modifica el valor a Wikidata
LlicènciaGNU General Public License Modifica el valor a Wikidata
Etiqueta d'Stack ExchangeEtiqueta Modifica el valor a Wikidata
Pàgina webmercurylang.org Modifica el valor a Wikidata

CaracterístiquesModifica

Mercury té diverses característiques adreçades a una millor enginyeria de software. És compilat i no interpretat. Presenta un sofisticat i estricte sistema de tipus i modes. Els seus autors proclamen que aquestes característiques, combinades amb la natura abstracta de la programació lògica i la divisió en mòduls, faciliten l'escriptura ràpida de programes fiables.

Mercury és més pur i més declaratiu que Prolog, car no té les instruccions extra-lògiques de Prolog tal com "cut" (que evita el "backtracking") i l'entrada/sortida imperativa. Això permet una millor optimització dels programes però fa que la codificació d'algorismes seqüencials sigui més complicada. Degut a les optimitzacions, els programes escrits en Mercury són significativament més ràpids que els equivalents escrits en Prolog.

Mercury està disponible per a la majoria de plataformes Unix, Mac OS X, i MS-Windows.

Programes notables escrits en Mercury inclouen el compilador Mercury, la base de dades deductiva Aditi i el programa de formateig Prince XML.

RerefonsModifica

Mercury té diversos rerefons de compilació (ang.:back-ends), que permeten compilar codi Mercury als següents llenguatges i màquines virtuals:

  • Llenguatge C de baix nivell per a GNU Compiler Collection (GCC) (el rerefons original de Mercury).
  • Llenguatge C d'alt nivell.
  • Common Intermediate Language (IL) per a .NET (CLR).
  • Java bytecode per a JVM.
  • Assembler via el rerefons GCC.

(els tres darrers encara de qualitat incompleta)

Mercury també s'ha emprat en Aditi, una base de dades deductiva desenvolupada a la Universitat de Melbourne.

Mercury té una interfase de llenguatges forans, que permet enllaçar amb codi escrit en altres llenguatges de programació. Són els següents:

Rerefons Llenguatge(s) forans
C (both levels) C
IL IL, C# or Managed C++
Java Java

Per a altres llenguatges cal encadenar-los des dels mencionats. Tanmateix això vol dir que el codi forà pot caldre reescriure'l per als diferents rerefons, altrament la portabilitat entre rerefons es perdria.

Example: Hola mónModifica

Hola món en Mercury:

 :- module hello.

 :- interface.
 :- import_module io.
 :- pred main (io::di, io::uo) is det.           % signatura de 'main'

 :- implementation.
 main(!IO) :-                              % el prefix '!' indica variable d'estat que es desdobla en estat entrant i estat sortint
 	io.write_string("Hola, Món!\n", !IO).

Adaptat de la guia (tutorial) de Ralph Becket.[2]

La sintaxi de clàusules deriva del llenguatge Prolog

  • el separador de seqüència és la coma indicant conjunció d'objectius
  • el separador d'alternatives és el punt-i-coma indicant disjunció d'objectius
:- module hailstone.

:- interface.

:- import_module int, list.

:- func hailstone(int) = list(int).
:- pred hailstone(int::in, list(int)::out) is det.

:- implementation.

hailstone(N) = S :- hailstone(N, S).

hailstone(N, [N|S]) :-
  ( N = 1 ->       S = []
  ; N mod 2 = 0 -> hailstone(N/2, S)
  ;                hailstone(3 * N + 1, S) ).

:- end_module hailstone.

ReferènciesModifica

Enllaços externsModifica