Sémantika programovacích jazyků
Sémantika programovacích jazyků je v teorii programovacích jazyků obor zabývající se důsledným matematickým popisem významu programovacího jazyka. Zhodnocuje význam syntakticky platných řetězců v daném programovacím jazyce, včetně jejich výpočtu. V případě ohodnocování syntakticky neplatných řetězců, není výpočet proveden. Sémantika popisuje procesy, které řídí počítač při vykonávání programu v daném programovacím jazyce. Například tím, že popisuje vztah mezi vstupem a výstupem programu, nebo popisem jak program poběží na určité platformě, tedy vytvořením modelu výpočtu.
Statická sémantika
Statická sémantika je řešena při překladu programu, zde jsou definovány a deklarovány jednotlivá pravidla a prvky programovacího jazyka. V těchto prvcích je zahrnuta jazyková konstrukce, její typy parametrů, význam příkazů a další prvky. Statická sémantika dále kontroluje statické typy a práci s tabulkou definovaných programových symbolů.
- Staticky typované jazyky požadují uvedení datového typu u každé deklarace. Zde nelze deklarovat proměnnou, či funkci nebo objekt bez zadání datového typu.
- Všechny typové kontroly jsou prováděny staticky při překladu. Už při překladu má být každé proměnné přiřazen datový typ.
- Je možné daný datový typ přímo přetypovat. Přetypování především slouží k obcházení typových kontrol.
- Výhodou statického typování je lepší možnost odhalení typových chyb.
- Hlavní nevýhodou této metody je větší složitost programových konstrukcí, délka zdrojového kódu a tím i menší pružnost programovacího jazyka.
- K nejčastěji vyskytovaným běhovým chybám patří přetečení datového typu.
- Mezi nejznámější zástupce staticky typovaných jazyků patří Java, Ada a jazyk C.
Dynamická sémantika
Dynamická sémantika je řešena přímo za běhu programu. Dynamicky typované jazyky jsou významné v jednotlivých jazykových konstrukcí. Jaký úkon se má provést, když je v programu napsán daný příkaz nebo priorita operátorů. Dynamická sémantika je obzvlášť náročná u programovacích jazyků s rekurzivním voláním podprogramů, proto je nutné vést evidenci o volání téhož podprogramu. Z kterého se vytváří aktivační záznamy pro jednotlivá volání podprogramů a jejich následné ukládání do zásobníku.
- U dynamicky typovaných jazyků není vyžadováno uvádění datových typů v deklaracích, některé nevyžadují ani deklarace.
- Datový typ proměnné je vázáno na formu první hodnoty. Hodnota a datový typ nově vytvořené proměnné je dána výsledkem předchozího vyhodnoceného výrazu.
- Prakticky všechny typové kontroly (až na pár výjimek) probíhají dynamicky za běhu programu a zároveň probíhá automatické přetypování proměnných. Ze strany uživatele není problém kdykoliv měnit datový typ proměnné za běhu programu.
- Výhodou dynamického typování je kratší a jednodušší zdrojový kód, a tím i jeho lepší čitelnost.
- Naopak k nevýhodám patří možnost výskytu typových chyb za běhu programu.
- Mezi nejznámější zástupce dynamicky typovaných jazyků patří Python, Smalltalk, Prolog.
Silné a slabé typové kontroly
- Většina dynamický typovaných jazyků vykonává silné typové kontroly za běhu programu.
- Staticky silně typované Java, Ada a Rust.
- K staticky slabě typovaným jazykům patří například jazyk C a JavaScript (s výjimkou rozšíření asm.js).
Přehled
Obor formální sémantiky zahrnuje následující:
- Definici sémantických modelů
- Vztahy mezi odlišnými sémantickými modely
- Vztahy mezi odlišnými přístupy k významu
- Vztah mezi výpočtem a souvisejícími matematickými strukturami z oborů jako je logika, teorie množin, teorie modelů, teorie kategorií, atd.
Je úzce spjata s dalšími oblastmi IT jako jsou návrh a implementace programovacích jazyků, teorie typů, překladače a interprety, verifikace a kontrola modelů.
Přístupy
Ve formální sémantice existuje mnoho různých přístupů. Níže jsou tři nejpoužívanější:
- Denotační sémantika, kde je každá fráze jazyka interpretována jako denotace. Tyto denotace často bývají matematickými objekty, ovšem není to podmínkou. V praxi je nezbytné, aby byly denotace popsány nějakou formou matematického zápisu, která může být formalizována jako denotační metajazyk. Například denotační sémantika funkčního jazyka často překládá jazyk do teorie domén. Popis denotační sémantikou může také sloužit pro překlady z programovacího jazyka do denotačního metajazyka a být použit jako základ pro návrh překladače.
- Operační sémantika, kde je provádění jazyka popsáno přímo (nikoliv při překladu). Operační sémantika volně odpovídá interpretaci, kdy je použitý jazyk interpretu obecně matematicky formální. Operační sémantika může definována pomocí abstraktního stroje, který dává frázím význam pomocí přechodu stavů stroje. Alternativně může být operační sémantika definována pomocí syntaktických transformací na fráze samotného jazyka.
- Axiomatická sémantika, kde je frázím přiřazován význam popisem logických axiomů, vztahujícím se k nim. Axiomatická sémantika nerozlišuje mezi logickými formulemi, které ji popisují. Jejich význam je přesně to co lze dokázat pomocí nějaké logiky. Příklad axiomatické sémantiky je Hoareova logika.
Rozdíly mezi těmito třemi přístupy mohou být vágní. Ale všechny známé přístupy k formální sémantice používají tyto výše zmíněné tři techniky, nebo jejich kombinace.
Mimo volby mezi denotačním, operačním a axiomatickým přístupem, většina rozdílů ve formální sémantice vyplývá z volby podpory matematického formalismu.
Literatura
- Knihy
- Carl Gunter. Semantics of Programming Languages. MIT Press, 1992. (ISBN 0-262-07143-6)
- Robert Harper. Practical Foundations for Programming Languages. Working draft, 2006. (online, as PDF)
- Shriram Krishnamurthi. Programming Languages: Application and Interpretation. (online, as PDF)
- Mitchell, John C.. Foundations for Programming Languages.
- John C. Reynolds. Theories of Programming Languages. Cambridge University Press, 1998. (ISBN 0-521-59414-6)
- Kenneth Slonneger and Barry L. Kurtz. Formal Syntax and Semantics of Programming Languages. Addison-Wesley.
- Glynn Winskel. The Formal Semantics of Programming Languages: An Introduction. MIT Press, 1993 (paperback ISBN 0-262-73103-7)
- Robert D. Tennent (1991). Semantics of Programming Languages. Prentice-Hall.
- M. Hennessy (1990) The Semantics of Programming Languages: An Elementary Introduction. Wiley.
- H. Nielson and F. Nielson (1993) Semantics with Applications. A formal Introduction. Wiley
- Skripta
- Glynn Winskel. Denotational Semantics. University of Cambridge.
- VAVREČKOVÁ, Š. Programování překladačů. Opava: Slezská univerzita, 2008. ISBN 978-80-7248-493-5.
- VAVREČKOVÁ, Š. Sémantika [online]. 2012. Dostupné online.[nedostupný zdroj]
Reference
V tomto článku byl použit překlad textu z článku Semantics (computer science) na anglické Wikipedii.