Article de reference

ML (langage de programmation)

{{Cite book |last=Gordon |first=M. |title=Edinburgh LCF: A Mechanized Logic of Computation |last2=Milner |first2=R. |last3=Wadsworth |first3=C. P. |date=1979 |publisher=Springer...

métalangage développé pour le démonstrateur de théorèmes LCF d'Édimbourg dans les années 1970. C'est un langage fonctionnel statiquement typé , doté d' une inférence de types polymorphes de type Hindley-Milner , et d'autres fonctionnalités telles que les exceptions et les variables mutables . La conception de ML dans LCF a directement inspiré la famille ML ultérieure (notamment Standard ML , Caml et leurs dérivés) et a influencé le développement ultérieur des langages fonctionnels.

Robin Milner dès son arrivée à l'Université d'Édimbourg en 1973, avec l'aide des assistants de recherche Lockwood Morris et Malcolm Newey, tous deux postdoctorants de Stanford recrutés par Milner. Michael Gordon , Christopher Wadsworth et d'autres doctorants ont rejoint l'équipe de recherche en 1975. Historiquement, ML a été conçu pour développer des tactiques de preuve dans le démonstrateur de théorèmes LCF et succéder à la version précédente, Stanford LCF , en s'efforçant de résoudre les problèmes liés à l'utilisation de l'espace mémoire et à l'extensibilité des preuves. ML servait à la fois de métalangage (d'où son nom) et de langage de commandes ( REPL ) pour le système LCF . PPLAMBDA , un langage conceptuellement combinant le calcul des prédicats du premier ordre et le lambda-calcul polymorphe simplement typé , était le langage sous-jacent dans lequel les énoncés de théorèmes étaient construits plus directement.

Parallèlement au développement de ML, Milner rédigea en 1978 l'article « A theory of type polymorphism in programming » , qui exposait les concepts de typage optimal d'un programme dans le contexte d'un système de types polymorphes (génériques). Il utilisa ML comme étude de cas pour illustrer les théorèmes développés et souligna les défis théoriques rencontrés lors du développement, défis qui restaient à résoudre. La conception de la première version de ML fut finalisée, puis documentée dans l'ouvrage « Edinburgh LCF » de 1979 , coécrit par Milner, Gordon et Wadsworth.

Après la création d'Edinburgh LCF et la publication de l'ouvrage éponyme, l'intérêt pour le langage s'est accru et plusieurs implémentations, présentant de légères variations de conception et de fonctionnalités, ont été développées par différents acteurs. Luca Cardelli a créé Cardelli ML , ou VAX ML , qui est finalement devenu un dialecte autonome adapté à l'informatique générale, spécifié dans l'article ML sous Unix . Gérard Huet, à l' Inria, a entrepris le portage du code source de Stanford Lisp vers divers autres dialectes de Lisp dans le cadre du « Projet Formel ». Le portage vers Franz Lisp a été poursuivi par Larry Paulson , dont la version a finalement été baptisée Cambridge LCF . Cette version du LCF a ensuite été mise à jour pour utiliser une version préliminaire de Standard ML et est disponible sur GitHub .

L'intérêt et l'enthousiasme suscités par ML, LCF et d'autres technologies connexes, comme le langage de programmation Hope , à l'époque, suite à la publication d' Edinburgh LCF et à d'autres développements, ont conduit à la tenue d'une réunion intitulée « ML, LCF et Hope » en novembre 1982. Les inquiétudes liées à la fragmentation de la conception et de l'implémentation, susceptible d'entraîner des doublons, ont été soulevées lors de cette réunion. Bien que Milner se soit montré ouvert à l'expérimentation, des discussions et des réunions ultérieures ont eu lieu entre Bernard Sufrin et Milner, au cours desquelles Sufrin a incité Milner à unifier la conception de ML. Ces échanges ont été ultérieurement cités dans la deuxième version de la proposition de Milner pour Standard ML.

Aperçu

ISWIM , un langage décrit comme un « lambda-calcul avec du sucre syntaxique » . ML a été conçu avec un système de typage statique fort permettant à l'utilisateur de définir des types abstraits avec polymorphisme paramétrique , vérifiés à la compilation . Il disposait également d'une inférence de types automatique, ce qui lui conférait la facilité d'utilisation des langages dynamiques de l'époque, tels que Lisp ou POP-2, en s'affranchissant du besoin d'annotations de types explicites

Exemples

Les exemples suivants sont tirés directement du LCF d'Édimbourg et offrent un aperçu de la syntaxe et des fonctionnalités de ML. Le Les liaisons sont introduites avec `\bind` comparées par motif à gauche.

curryfiées : passer un paramètre à la fonction renverra une fonction qui acceptera le second, et ainsi de suite. Les fonctions récursives requièrent `.` `cons`Les variables mutables sont déclarées avec `mutable` des alias de types plus simples . Voici un type abstrait récursif qui définit un arbre binaire avec quelques opérations de base :

(*, **) tree) comptree = - : ((** # (*, **) tree # (*, **) tree) -> (*, **) tree) istip = - : ((*, **) tree -> bool) tipof = - : ((*, **) tree -> *) labelof = - : ((*, **) tree -> **) sonsof = - : ((*, **) tree -> ((*, **) tree # (*, **) tree))"}},"i":0}}]
 (*, **) tree) comptree = - : ((** # (*, **) tree # (*, **) tree) -> (*, **) tree) istip = - : ((*, **) tree -> bool) tipof = - : ((*, **) tree -> *) labelof = - : ((*, **) tree -> **) sonsof = - : ((*, **) tree -> ((*, **) tree # (*, **) tree))" 
  1. absrectype (*, **) arbre = * + ** # (*, **) arbre # (*, **) arbre
  2. avec tiptree x = abstree(inl x)
  3. et comptree (y, t1, t2) = abstree(inr(y, t1, t2))
  4. et istip t = isl(reptree t)
  5. et tipof t = outl(reptree t) ? failwith `tipof`
  6. et labelof t = fst(outr(reptree t)) ? failwith `labelof`
  7. et fils de t = snd(outr(reptree t)) ? failwith `sonsof`;;
tiptree = - : (* -> (*, **) arbre) comptree = - : ((** # (*, **) arbre # (*, **) arbre) -> (*, **) arbre) istip = - : ((*, **) arbre -> booléen) tipof = - : ((*, **) arbre -> *) labelof = - : ((*, **) arbre -> **) fils de = - : ((*, **) arbre -> ((*, **) arbre # (*, **) arbre))

Dans les définitions d'opérations (le box` pour encadrer les valeurs et les types somme (unions étiquetées) et les types produit (tuples), `sum`

Plus d articles de Worldlex Wiki

Revenez a l index pour explorer davantage de pages sur l histoire, la science, la culture, la geographie et la societe en francais.

Explorer l index