Mercury (langage de programmation) - Mercury (programming language)

Mercure
Mercury (langage de programmation) logo.jpg
Paradigme Logique , fonctionnel , orienté objet
Conçu par Zoltan Somogyi
Développeur Université de Melbourne
Première apparition 8 avril 1995 ; Il y a 25 ans  ( 08/04/1995 )
Version stable
20.06.1 / 3 novembre 2020 ; Il y a 55 jours  ( 03/11/2020 )
Discipline de frappe Fort , statique , polymorphe
Langue d'implémentation Mercure
Plate-forme IA-32 , x86-64 , ARM , Sparc64 , Java , CLI , Erlang / OTP
OS Multiplateforme : Unix , Linux , macOS , Solaris , FreeBSD , OpenBSD , Windows , Android
Licence Compilateur GPL , bibliothèque standard
LGPL
Extensions de nom de fichier .m
Site Internet www .mercurylang .org
Principales implémentations
Melbourne Mercury Compiler
Influencé par
Prolog , Hope , Haskell

Mercury est un langage de programmation de logique fonctionnelle conçu pour des utilisations dans le monde réel. La première version a été développée à l' Université de Melbourne , département d'informatique, par Fergus Henderson, Thomas Conway et Zoltan Somogyi, sous la supervision de Somogyi, et publiée le 8 avril 1995.

Mercury est un langage de programmation logique purement déclaratif . Il est lié à la fois à Prolog et à Haskell . Il présente un système de type polymorphe solide, statique et un système de mode et de déterminisme fort.

L'implémentation officielle, le Melbourne Mercury Compiler, est disponible pour la plupart des plates- formes Unix et Unix , y compris Linux , macOS et pour Windows .

Aperçu

Mercury est basé sur le langage de programmation logique Prolog . Il a la même syntaxe et les mêmes concepts de base tels que l' algorithme de résolution sélective de clause définie linéaire (SLD). Il peut être considéré comme un pur sous-ensemble de Prolog avec des types et des modes puissants. En tant que tel, il est souvent comparé à son prédécesseur en termes de fonctionnalités et d'efficacité d'exécution.

Le langage est conçu selon les principes du génie logiciel . Contrairement aux implémentations originales de Prolog, il a une phase de compilation séparée , plutôt que d'être directement interprété. Cela permet de détecter un éventail beaucoup plus large d'erreurs avant d'exécuter un programme. Il dispose d'un système de type et de mode statique strict et d'un système de modules.

En utilisant les informations obtenues au moment de la compilation (telles que le type et le mode), les programmes écrits en Mercury fonctionnent généralement beaucoup plus rapidement que les programmes équivalents écrits en Prolog. Ses auteurs affirment que Mercure est le langage logique le plus rapide au monde, de loin.

Mercury est un langage purement déclaratif , contrairement à Prolog , car il ne dispose pas d' instructions Prolog extra-logiques telles que ! (cut) et les entrées / sorties impératives (I / O). Cela permet une analyse de programme statique avancée et une optimisation de programme , y compris la récupération de place au moment de la compilation , mais cela peut rendre certaines constructions de programmation (telles que le basculement d'un certain nombre d'options, avec une valeur par défaut) plus difficiles à exprimer. (Bien que Mercury autorise les fonctionnalités impures, cela sert principalement à appeler du code en langue étrangère. Tout code impur doit être marqué explicitement.) Les opérations qui seraient généralement impures (telles que les entrées / sorties ) sont exprimées à l'aide de constructions pures dans Mercury en utilisant types linéaires , en enfilant une valeur mondiale fictive à travers tout le code pertinent.

Les programmes notables écrits dans Mercury incluent le compilateur Mercury et le formateur XML Prince . La société de logiciels Mission Critical IT utilise également Mercury depuis 2000 pour développer des applications d'entreprise et sa plate-forme de développement logiciel basée sur l'ontologie, ODASE.

Back-ends

Mercury a plusieurs back-ends, qui permettent de compiler le code Mercury en plusieurs langues, notamment:

Niveau de production

Passé

Mercury dispose également d'une interface en langue étrangère, permettant au code dans d'autres langues (en fonction du back-end choisi) d'être lié au code Mercury. Les langues étrangères suivantes sont possibles:

Back-end Langues étrangères)
C (les deux niveaux) C
Java Java
Erlang Erlang
IL Common Intermediate Language (CIL) ou C #

D'autres langues peuvent alors être interfacées en les appelant à partir de ces langues. Cependant, cela signifie que le code en langue étrangère peut devoir être écrit plusieurs fois pour les différents backends, sinon la portabilité entre les backends sera perdue.

Le back-end le plus couramment utilisé est le back-end C de bas niveau d'origine.

Exemples

Bonjour tout le monde :

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

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

Calcul du 10e nombre de Fibonacci (de la manière la plus évidente):

 :- 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 est une "variable d'état", qui est le sucre syntaxique pour une paire de variables auxquelles sont attribués des noms concrets lors de la compilation; par exemple, ce qui précède est désucré à quelque chose comme:

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

Calendrier de sortie

Les versions sont nommées en fonction de l'année et du mois de sortie. La version stable actuelle est le 20.06 (30 juin 2020). Les versions précédentes étaient numérotées 0,12, 0,13, etc., et le temps entre les versions stables peut être aussi long que 3 ans.

Il existe souvent également une version instantanée du jour (ROTD) comprenant les dernières fonctionnalités et corrections de bogues ajoutées à la dernière version stable.

Prise en charge de l'IDE et de l'éditeur

Voir également

  • Curry , un autre langage de logique fonctionnelle
  • Alice , un langage dialectal de Standard ML
  • Logtalk , langage, une extension orientée objet de Prolog qui se compile en Prolog
  • Oz / Mozart , un langage multiparadigme
  • Visual Prolog , langage, une extension orientée objet fortement typée de Prolog, avec une nouvelle syntaxe

Références

Liens externes