Systémy typov

Typy

V skutočnosti sú všetky dáta v počítači reprezentované ako čísla. Napríklad aj reťazec je len číslo — adresa miesta v pamäti, na ktorom sú postupne uložené jednotlivé znaky (tiež čísla). Rôzne operácie však interpretujú tieto čísla rozdielne, keďže predpokladajú, že reprezentujú rôzne typy dát. Je preto dôležité asociovať dáta s informáciou o ich type. Táto asociácia môže byť

  • realizovaná iba počas prekladu programu — staticky — s tým, že výsledný program už informácie o typoch neobsahuje;
  • alebo uložená spolu so samotnými dátami počas behu programu — dynamicky.

Často sa používajú obidva prístupy súčasne. Napríklad Java používa informácie o typoch počas prekladu a ukladá ich aj počas behu, vďaka čomu s k týmto informáciám môžeme dostať pomocou reflexie.

Pri návrhu jazyka a jeho systému typov je potrebné urobiť množstvo technických rozhodnutí, napríklad:

  • Striktnosť alebo flexibilita: striktnejší systém môže zachytiť viac problémov ale zároveň neumožní niektoré správne konštrukcie.
  • Povinné označovanie funkcií a premenných typovými anotáciami alebo automatické odvodenie typov.
  • Nominálne alebo štrukturálne porovnávanie typov: pri nominálnom sa rozhodujeme na základe mien typov a explicitných definícií vzťahov medzi nimi (napr. Java), zatiaľ čo pri štrukturálnom prístupe sa rozhoduje na základe štruktúry typu (napr. TypeScript alebo Go).
  • Jednoduchosť a obmedzenosť alebo vyjadrovacia sila a zložitosť: napríklad typový systém jazyka Haskell umožňuje oveľa presnejšie vyjadriť množstvo podmienok a vďaka tomu overiť správnosť kódu, v porovnaní s typovým systémom jazyka C, cenou za to je však väčšia zložitosť.

Predstavme si čo by sme potrebovali, ak by sme chceli definovať typový systém pre nový programovací jazyk.

  1. Museli by sme definovať spôsob ako priradiť mená primitívnym typom a štruktúram.
  2. Ďalej by sme potrebovali určiť spôsob ako určovať príslušnosť hodnôt typom, napríklad pomocou explicitných definícií typov premenných a nejakej formy odvodenia typov (aspoň pre medzivýsledky výrazov).
  3. Potrebovali by sme aspoň základnú formu polymorfizmu — možnosti definovať, že niektoré typy sú špeciálnymi prípadmi iných typov a je možné ich použiť tam, kde sa očakáva všeobecnejší typ.
  4. Veľmi praktická by bola aj podpora parametrického polymorfizmu alebo generických typov — možnosti definovať typové parametre a v kóde používať typové premenné.

Praktická realizácia typového systému by si, samozrejme, vyžadovala doriešenia mnohých ďalších detailov. Avšak už z tohto príkladu je vidieť, že je to veľmi komplexná úloha. Hlavne vo štvrtom kroku bude nutné vyriešiť veľmi veľa zložitých problémov, ako je napríklad kovariancia a kontravariancia. Napríklad programovací jazyk Java až do verzie 5 nepodporoval generické typy. To aké zložité bolo pridať ich podporu do jazyka bez porušenia spätnej kompatibility si môžete predstaviť na základe článku, ktorý opisuje základné vlastnosti ich realizácie.

Ďalšie informácie nájdete v snímkoch prezentácie a v odporúčanej literatúre.

Literatúra

Doplňujúca literatúra