Inferență de tip

Inferență de tip ( eng.  inferență de tip ) - în programare , capacitatea compilatorului de a deduce logic tipul valorii expresiei în sine . Mecanismul de inferență de tip a fost introdus pentru prima dată în limbajul ML , unde compilatorul deduce întotdeauna cel mai general tip polimorf pentru orice expresie. Acest lucru nu numai că reduce dimensiunea codului sursă și crește concizia acestuia, dar de multe ori crește reutilizarea codului [1] .

Inferența de tip este caracteristică limbajelor de programare funcționale , deși de-a lungul timpului a fost parțial implementată în limbaje orientate pe obiecte ( C# , D , Visual Basic .NET , Nim , C++11 , Vala , Java [a] ), unde se limitează la capacitatea de a omite tipul unui identificator într-o definiție cu inițializare (vezi zahăr sintactic ). De exemplu:

var s = "Bună, lume!" ; // Tipul variabilei s (din șir) este derivat din inițializator

Algoritmi

Algoritmul Hindley-Milner

Algoritmul Hindley-Milner este un mecanism de inferență de tip expresie implementat în limbaje de programare bazate pe sistemul de tip Hindley-Milner , cum ar fi ML (primul limbaj al acestei familii), Standard ML , OCaml , Haskell , F# , Fortress și Boo . Limbajul Nemerle folosește acest algoritm cu o serie de modificări necesare [2] .

Mecanismul de inferență de tip se bazează pe capacitatea de a deduce automat, integral sau parțial, tipul unei expresii obținute prin evaluarea unei expresii. Deoarece acest proces este efectuat sistematic în timpul traducerii programului, compilatorul poate deseori deduce tipul unei variabile sau funcție fără a specifica în mod explicit tipurile acelor obiecte. În multe cazuri, declarațiile de tip explicite pot fi omise - acest lucru se poate face pentru obiecte destul de simple sau pentru limbaje cu sintaxă simplă. De exemplu, limbajul Haskell are un mecanism de inferență de tip destul de puternic, deci nu este necesar să se specifice tipurile de funcții în acest limbaj de programare. Programatorul poate specifica tipul unei funcții în mod explicit pentru a restricționa utilizarea acesteia la anumite tipuri de date sau pentru formatarea codului sursă mai structurat.

Pentru a obține informații pentru deducerea corectă a tipului unei expresii în absența unei declarații explicite a tipului acestei expresii, traducătorul fie colectează astfel de informații din declarațiile explicite ale tipurilor de subexpresii (variabile, funcții) incluse. în expresia studiată, sau folosește informații implicite despre tipurile de valori atomice. Un astfel de algoritm nu ajută întotdeauna la determinarea tipului unei expresii, mai ales în cazurile de utilizare a funcțiilor de ordin superior și a polimorfismului parametric de natură destul de complexă. Prin urmare, în cazuri complexe, când este nevoie de evitarea ambiguităților, se recomandă specificarea explicită a tipului de expresii.

Modelul de tipare în sine se bazează pe algoritmul de inferență a tipului de expresie, care are ca sursă mecanismul de derivare a tipului de expresie utilizat în λ-calcul tipizat , care a fost propus în 1958 de H. Curry și R. Face. Mai mult, Roger Hindley în 1969 a extins algoritmul în sine și a demonstrat că derivă cel mai general tip de expresie. În 1978 , Robin Milner , independent de R. Hindley, a demonstrat proprietățile unui algoritm echivalent. Și în sfârșit, în 1985 , Louis Damas a arătat în sfârșit că algoritmul lui Milner este complet și poate fi folosit pentru tipurile polimorfe. În acest sens, algoritmul Hindley-Milner este uneori numit și algoritmul Damas-Milner .

Sistemul de tip este definit în modelul Hindley-Milner după cum urmează:

  1. Tipurile primitive sunt tipuri de expresie.
  2. Variabilele de tip parametric α sunt tipuri de expresie.
  3. Dacă și  sunt tipuri de expresie, atunci tipul este tipul de expresie.
  4. Un simbol este un tip de expresii.

Expresiile ale căror tipuri sunt evaluate sunt definite într-un mod destul de standard:

  1. Constantele sunt expresii.
  2. Variabilele sunt expresii.
  3. Dacă și  sunt expresii, atunci ( ) este o expresie.
  4. Dacă  este o variabilă și  este o expresie, atunci  este o expresie.

Se spune că un tip este o instanță de tip atunci când există o conversie astfel încât:

În acest caz, de obicei se presupune că conversiile de tip sunt supuse unor restricții, care sunt următoarele:

Algoritmul de inferență de tip în sine constă din doi pași - generarea unui sistem de ecuații și soluția ulterioară a acestor ecuații.

Construcția unui sistem de ecuații

Construcția unui sistem de ecuații se bazează pe următoarele reguli:

  1.  - dacă legarea este în .
  2.  — dacă , unde și .
  3.  - în cazul în care , unde este cu obligatoriu adăugat .

În aceste reguli, un simbol este un set de asocieri între variabile și tipurile acestora:

Rezolvarea unui sistem de ecuații

Rezolvarea sistemului construit de ecuații se bazează pe algoritmul de unificare . Acesta este un algoritm destul de simplu. Există o funcție care ia o ecuație de tipuri ca intrare și returnează o substituție care face ca părțile din stânga și din dreapta ale ecuației să fie aceleași („le unifică”). Substituția este pur și simplu o proiecție a tipurilor variabile pe tipurile în sine. Astfel de substituții pot fi calculate în diferite moduri, care depind de implementarea specifică a algoritmului Hindley-Milner.

Vezi și

Note

Comentarii

  1. suport adăugat în Java SE 10

Surse

  1. Andrew W. Appel. O critică a ML standard. — Universitatea Princeton, versiunea revizuită a CS-TR-364-92, 1992.
  2. Michal Moskal. Tip Inferență cu amânare . — 2005.


Link -uri