Típuskövetkeztetés

Típuskövetkeztetés ( eng.  type inference ) - a programozásban a fordító azon képessége , hogy logikusan következtessen magának a kifejezés értékének típusára . A típuskövetkeztetési mechanizmust először az ML nyelvben vezették be , ahol a fordító mindig a kifejezés legáltalánosabb polimorf típusára következtet. Ez nemcsak a forráskód méretét csökkenti és tömörségét növeli, hanem gyakran növeli a kód újrafelhasználását [1] .

A típuskövetkeztetés a funkcionális programozási nyelvekre jellemző , bár az idők során részben az objektum-orientált nyelvekben is implementálták ( C# , D , Visual Basic .NET , Nim , C++11 , Vala , Java [a] ), ahol ez arra korlátozódik, hogy az inicializálással egy definícióban elhagyható az azonosító típusa (lásd szintaktikai cukor ). Például:

var s = "Szia, világ!" ; // Az s változó típusa (karakterláncból) az inicializálóból származik

Algoritmusok

Hindley-Milner algoritmus

A Hindley-Milner algoritmus egy kifejezéstípusú következtetési mechanizmus, amelyet a Hindley-Milner típusú rendszeren alapuló programozási nyelvekben valósítottak meg , mint például az ML (a család első nyelve), a Standard ML , OCaml , Haskell , F# , Fortress és Boo . A Nemerle nyelv ezt az algoritmust használja számos szükséges módosítással [2] .

A típuskövetkeztetési mechanizmus azon a képességen alapul, hogy egy kifejezés kiértékelésével kapott kifejezés típusára részben vagy egészben automatikusan következtethetünk. Mivel ezt a folyamatot szisztematikusan hajtják végre a programfordítás során, a fordító gyakran tud következtetni egy változó vagy függvény típusára anélkül, hogy kifejezetten meghatározná az objektumok típusát. Sok esetben az explicit típusdeklaráció elhagyható - ez megtehető meglehetősen egyszerű objektumok vagy egyszerű szintaxisú nyelvek esetén. Például a Haskell nyelvnek elég erős típuskövetkeztetési mechanizmusa van, így ebben a programozási nyelvben nem szükséges megadni a függvénytípusokat. A programozó kifejezetten megadhatja egy függvény típusát annak érdekében, hogy bizonyos adattípusokra korlátozza a használatát, vagy strukturáltabb forráskód formázáshoz.

Annak érdekében, hogy információt szerezzen a kifejezés típusának pontos megállapításához a kifejezés típusának explicit deklarációjának hiányában, a fordító vagy a benne foglalt részkifejezések típusainak (változók, függvények) explicit deklarációiból gyűjti össze ezeket az információkat. a vizsgált kifejezésben, vagy implicit információkat használ az atomi értékek típusairól. Egy ilyen algoritmus nem mindig segít meghatározni egy kifejezés típusát, különösen magasabb rendű függvények és meglehetősen összetett természetű parametrikus polimorfizmus esetén . Ezért összetett esetekben, amikor szükség van a kétértelműségek elkerülésére, ajánlatos kifejezetten megadni a kifejezések típusát.

Maga a tipizálási modell a kifejezéstípus-következtetési algoritmuson alapul, amelynek forrása a típusos λ-számításban használt kifejezéstípus-levezetési mechanizmus, amelyet 1958 -ban javasoltak H. Curry és R. Face. Továbbá Roger Hindley 1969 - ben kiterjesztette magát az algoritmust, és bebizonyította, hogy ez a kifejezés legáltalánosabb típusát eredményezi. 1978- ban Robin Milner R. Hindleytől függetlenül bebizonyította egy ekvivalens algoritmus tulajdonságait. És végül 1985 -ben Louis Damas végre megmutatta, hogy Milner algoritmusa kész, és használható polimorf típusokhoz. Ebben a tekintetben a Hindley-Milner algoritmust néha Damas-Milner algoritmusnak is nevezik .

A típusrendszert a Hindley-Milner-modell a következőképpen határozza meg:

  1. A primitív típusok kifejezéstípusok.
  2. Az α paraméteres típusú változók kifejezéstípusok.
  3. Ha és  kifejezéstípusok, akkor a típus a kifejezés típusa.
  4. A szimbólum a kifejezések egy fajtája.

Azok a kifejezések, amelyek típusai kiértékelve vannak, meglehetősen szabványos módon vannak meghatározva:

  1. A konstansok kifejezések.
  2. A változók kifejezések.
  3. Ha és  kifejezések, akkor ( ) egy kifejezés.
  4. Ha  egy változó és  egy kifejezés, akkor  egy kifejezés.

Egy típust a típus példányának nevezünk, ha van valamilyen konverzió , például:

Ebben az esetben általában azt feltételezik, hogy a típuskonverziókra korlátozások vonatkoznak, amelyek a következők:

Maga a típuskövetkeztetési algoritmus két lépésből áll - egy egyenletrendszer létrehozásából, majd ezen egyenletek későbbi megoldásából.

Egyenletrendszer felépítése

Az egyenletrendszer felépítése a következő szabályokon alapul:

  1.  - ha a kötés ben van .
  2.  — ha , hol és .
  3.  - abban az esetben , ha , hol van a hozzáadott kötéssel .

Ezekben a szabályokban a szimbólum a változók és típusaik közötti asszociációk halmaza:

Egyenletrendszer megoldása

A megszerkesztett egyenletrendszer megoldása az egyesítő algoritmuson alapul . Ez egy meglehetősen egyszerű algoritmus. Van néhány függvény , amely egy típusegyenletet vesz be bemenetként, és olyan helyettesítést ad vissza, amely az egyenlet bal és jobb oldalát azonossá teszi ("egyesíti" őket). A helyettesítés egyszerűen a változótípusok magukra a típusokra vetítése. Az ilyen helyettesítéseket különféle módon lehet kiszámítani, amelyek a Hindley-Milner algoritmus konkrét megvalósításától függenek.

Lásd még

Jegyzetek

Megjegyzések

  1. támogatás hozzáadva a Java SE 10 -hez

Források

  1. Andrew W. Appel. A Standard ML kritikája. — Princetoni Egyetem, a CS-TR-364-92 átdolgozott változata, 1992.
  2. Michal Moskal. Típus Következtetés halasztással . – 2005.


Linkek