Mercury (linguagem de programação) - Mercury (programming language)

Mercúrio
Mercury (linguagem de programação) logo.jpg
Paradigma Lógica , funcional , orientada a objetos
Projetado por Zoltan Somogyi
Desenvolvedor Universidade de Melbourne
Apareceu pela primeira vez 8 de abril de 1995 ; 25 anos atrás  ( 08/04/1995 )
Versão estável
20.06.1 / 3 de novembro de 2020 ; 55 dias atrás  ( 2020-11-03 )
Disciplina de digitação Forte , estático , polimórfico
Linguagem de implementação Mercúrio
Plataforma IA-32 , x86-64 , ARM , Sparc64 , Java , CLI , Erlang / OTP
SO Plataforma cruzada : Unix , Linux , macOS , Solaris , FreeBSD , OpenBSD , Windows , Android
Licença Compilador GPL , biblioteca padrão
LGPL
Extensões de nome de arquivo .m
Local na rede Internet www .mercurylang .org
Implementações principais
Melbourne Mercury Compiler
Influenciado por
Prolog , Hope , Haskell

Mercury é uma linguagem de programação lógica funcional feita para uso no mundo real. A primeira versão foi desenvolvida na Universidade de Melbourne , departamento de Ciência da Computação, por Fergus Henderson, Thomas Conway e Zoltan Somogyi, sob a supervisão de Somogyi, e lançada em 8 de abril de 1995.

Mercury é uma linguagem de programação lógica puramente declarativa . Ele está relacionado ao Prolog e ao Haskell . Possui um sistema de tipo polimórfico, estático e forte, e um sistema de modo e determinismo forte.

A implementação oficial, o Melbourne Mercury Compiler, está disponível para a maioria Unix e Unix-like plataformas, incluindo Linux , MacOS , e para o Windows .

Visão geral

Mercury é baseado na linguagem de programação lógica Prolog . Ele tem a mesma sintaxe e os mesmos conceitos básicos, como o algoritmo de resolução de cláusulas definidas lineares seletivas (SLD). Ele pode ser visto como um subconjunto puro do Prolog com tipos e modos fortes. Como tal, é freqüentemente comparado ao seu predecessor em recursos e eficiência de tempo de execução.

A linguagem é projetada usando princípios de engenharia de software . Ao contrário das implementações originais do Prolog, ele tem uma fase de compilação separada , em vez de ser interpretado diretamente. Isso permite que uma gama muito maior de erros seja detectada antes de executar um programa. Ele apresenta um tipo estrito de sistema de modo e estático e um sistema de módulo.

Ao usar informações obtidas em tempo de compilação (como tipo e modo), os programas escritos em Mercury normalmente executam significativamente mais rápido do que programas equivalentes escritos em Prolog. Seus autores afirmam que Mercúrio é a linguagem lógica mais rápida do mundo, por uma ampla margem.

Mercúrio é uma linguagem puramente declarativa , ao contrário do Prolog , uma vez que carece de declarações Prolog extralógicas, como ! (corte) e entrada / saída imperativa (E / S). Isso permite a análise estática avançada do programa e a otimização do programa , incluindo a coleta de lixo em tempo de compilação , mas pode tornar certas construções de programação (como uma troca de várias opções, com um padrão) mais difíceis de expressar. (Embora Mercúrio permita funcionalidade impura, isso serve principalmente como uma forma de chamar o código de idioma estrangeiro. Todo código impuro deve ser marcado explicitamente.) Operações que normalmente seriam impuras (como entrada / saída ) são expressas usando construções puras em Mercúrio usando tipos lineares , encadeando um valor de mundo fictício em todo o código relevante.

Programas notáveis ​​escritos em Mercury incluem o compilador Mercury e o formatador Prince XML . A empresa de software Mission Critical IT também usa a Mercury desde 2000 para desenvolver aplicativos corporativos e sua plataforma de desenvolvimento de software Ontology-Driven, ODASE.

Back-ends

Mercury tem vários back-ends, que permitem compilar o código Mercury em várias linguagens, incluindo:

Nível de produção

Passado

O Mercury também possui uma interface de idioma estrangeiro, permitindo que o código em outros idiomas (dependendo do back-end escolhido) seja vinculado ao código do Mercury. Os seguintes idiomas estrangeiros são possíveis:

Processo interno Línguas estrangeiras)
C (ambos os níveis) C
Java Java
Erlang Erlang
IL Linguagem intermediária comum (CIL) ou C #

Outras línguas podem ser conectadas chamando-as a partir dessas línguas. No entanto, isso significa que o código de idioma estrangeiro pode precisar ser escrito várias vezes para os diferentes back-ends, caso contrário, a portabilidade entre os back-ends será perdida.

O back-end mais comumente usado é o back-end C original de baixo nível.

Exemplos

Olá mundo :

 :- module hello.
 :- interface.
 :- import_module io.
 :- pred main(io::di, io::uo) is det.

 :- implementation.
 main(!IO) :-
 	io.write_string("Hello, World!\n", !IO).

Calculando o 10º número de Fibonacci (da maneira mais óbvia):

 :- module fib.
 :- interface.
 :- import_module io.
 :- pred main(io::di, io::uo) is det.
 
 :- implementation.
 :- import_module 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).
        % Could instead use io.format("fib(10) = %d\n", [i(fib(10))], !IO).

!IO é uma "variável de estado", que é um açúcar sintático para um par de variáveis ​​às quais são atribuídos nomes concretos na compilação; por exemplo, o acima é adicionado a algo como:

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

Cronograma de lançamento

Os lançamentos são nomeados de acordo com o ano e mês de lançamento. A versão estável atual é 20.06 (30 de junho de 2020). As versões anteriores eram numeradas de 0,12, 0,13, etc., e o tempo entre as versões estáveis ​​pode ser de até 3 anos.

Freqüentemente, há também uma versão instantânea do dia (ROTD) que consiste nos recursos e correções de bugs mais recentes adicionados à última versão estável.

Suporte a IDE e editor

Veja também

  • Curry , outra linguagem lógica funcional
  • Alice , uma linguagem dialética do ML padrão
  • Logtalk , linguagem, uma extensão orientada a objetos do Prolog que compila para o Prolog
  • Oz / Mozart , uma linguagem multiparadigma
  • Visual Prolog , linguagem, uma extensão orientada a objetos fortemente tipada do Prolog, com uma nova sintaxe

Referências

links externos