Mercury (linguagem de programação) - Mercury (programming language)
Paradigma | Lógica , funcional , orientada a objetos |
---|---|
Projetado por | Zoltan Somogyi |
Desenvolvedor | Universidade de Melbourne |
Apareceu pela primeira vez | 8 de abril de 1995 |
Versão estável | 20.06.1 / 3 de novembro de 2020
|
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 |
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
- C de baixo nível para GNU Compiler Collection (GCC), o back-end original do Mercury
- C alto nível
- Java
- C #
- Erlang
Passado
- Linguagem assembly por meio do back-end do GCC
- Aditi, um sistema de banco de dados dedutivo também desenvolvido na Universidade de Melbourne . Mercury-0.12.2 é a última versão compatível com Aditi.
- Common Intermediate Language (CIL) para o .NET Framework
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
:- 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
- Desenvolvedores fornecem suporte para Vim
- Biblioteca Flycheck para Emacs
- Um plugin está disponível para o IDE Eclipse
- Um plugin está disponível para o NetBeans IDE
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