Sémantika programovacích jazyk: Syntaxe a sémantika Syntaxe a sémantika Programovací jazyky, syntaxe, sémantika, zpsoby popisu Ti hlavní charakteristiky jazyka (sémiotika) jsou: - syntax, sémantika a pragmatika jazyka formáln: Zhruba: syntaxe se zabývá formou (znaky a jejich vztahy), sémantika významem znak, pragmatika závislostí konstrukcí na nositeli Sémantika odrda sémiotiky, kde se jako znaky používají symboly abecedy písmena, sémiotika je obecnjší nauka o znakových systémech. Oblastí jejího zájmu nejsou jen jazykové znaky, ale obecn i všechny ostatní znakové systémy (piktogramy, dopravní znaky apod.). Nap. dopravní znaka je symbol, její tvar uruje kategorii, obrázek význam. Vlastní znakové systémy s pravidly gramatickými i sémantickými mají mj. umlecké obory, náboženství, hry nebo rituály. Za zakladatele moderní sémiotiky je považován americký filosof Charles Peirce (1839 1914), jenž rozdlil znaky na ikony, indexy a symboly. Sémantika je nauka o významu jednotlivých slov, morfém a jiných znak, pípadn též jejich vztahu ke skutenosti, kterou oznaují. Slovo vzniklo z eckého, séma znamená význam (nap. semafor = nosi významu). Vazbami mezi jednotlivými znaky tmito slovy se zabývá syntax. Sémantika je souástí sémiotiky, která se zabývá celými znakovými systémy. A neprázdná konená množina - abeceda jazyka. Syntaxe se zabývá vymezením formálního jazyka L A* jako podmnožiny etzc nad abecedou, které tvoí správné zápisy v daném jazyce - vty jazyka. Pívlastek formální vyjaduje nepítomnost definice významu zápis. Sémantika pak definuje pro každou syntakticky správnou vtu jazyka (syntakticky správný program p L) jeho význam. Pragmatika se u programovacího jazyka neuvažuje. Sémantika (pes jazykovou rovnost): Sémantika úzce souvisí s jazykovou rovností L L Libovolnou binární relaci L L, která má vlastnosti ekvivalence (je reflexivní, symetrická a tranzitivní), lze nazvat jazykovou rovností a považovat za definici sémantiky jazyka. Jazykovou rovností je ureno, které zápisy jsou významov ekvivalentní - mají stejný význam. Jazyková rovnost indukuje na množin L rozklad, jehož tídy pedstavují možné významy v abstraktním smyslu (až na izomorfismus). P.: Jazyk binárních zápis pirozených ísel Syntax: A = { 0, 1 }, L = A* - { e } (neprázdné etzce nad A) Karel Richta 1
Sémantika (pes jazykovou rovnost): Sémantika programovacích jazyk: Syntaxe a sémantika jazyková rovnost pro jazyk binárních zápis je nejmenší ekvivalence na L generovaná axiomem: x L. ( x x ) ( x x ) ( 0x x ), tj. = { <x,x> x L } { <0x,x> x L } Množina všech syntakticky správných binárních zápis pirozených ísel L se rozpadne na faktorovou množinu L/ [ 0 ] = { 0, 00, 000,... } [ 1 ] = { 1, 01, 001,... } [ 10 ] = { 10, 010, 0010,... },... L/ je izomorfní (jako množina) s množinou pirozených ísel Nat. Odpovídajícím morfismem je libovolné kódování (bijektivní zobrazení) k: L/ Nat, kterým lze stanovit, jaké pirozené íslo k(x) zastupuje tída ekvivalence [ x ] L/ a tedy i které pirozené íslo oznauje zápis x (a rovnž všechny zápisy ekvivalentní s x, tj. všechna y taková, že y x). Sémantika (pomocí modelu): Postupovat lze i obrácen - nejprve definovat zamýšlený model M význam jazykových konstrukcí. M pedstavuje universum význam - každý výraz jazyka oznauje nkterý prvek M (obrácen to platit nemusí). Poté uríme interpretaci výraz v M, tj. zobrazení int: L M. Jazyková rovnost je pak urena nepímo - dva výrazy jsou ekvivalentní práv tehdy, když mají stejnou interpretaci: x y int[x]== int[y], kde == M M je identita na M. Syntaxe programovacích jazyk Programovací jazyky mají nejastji kontextový charakter, který je dán zejména deklaracemi. Pestože existují speciální kontextové gramatiky, jejich použití není rozšíeno, nebo bezkontextové gramatiky jsou mnohem propracovanjší a pružnjší. Obvykle se proto pro popis syntaxe programovacích jazyk používají nejvýše bezkontextové gramatiky, což souvisí s tím, že pro každý kontextový jazyk existuje bezkontextový nadjazyk, který jej obsahuje (dkaz dále). Kontextové závislosti (omezení) se pak vyjadují jinými prostedky. Náznak dkazu: dle klasifikace gramatik podle Chomského Gramatika: <T, N, S, P>, S N Podle tvaru pravidel z P: (A,B N, a T, α,γ,δ (N T)*, β (N T) + ) regulární: A a nebo A ab bezkontextová: A α kontextová: γaδ γβδ (konený automat) (zásobníkový automat) (automat s RAM, lineárn ohraniený Turingv Karel Richta 2
stroj) neomezená: γaδ α Sémantika programovacích jazyk: Syntaxe a sémantika (Turingv stroj, rekurzivn spoetné jazyky) Bu γaδ γβδ kontextové pravidlo. Vytvoíme-li gramatiku, která pro každé takové pravidlo bude obsahovat (bezkontextové) pravidlo A β, pak zejm jazyk generovaný touto gramatikou obsahuje všechny vty pvodního kontextového jazyka. Libovolnou derivaci, která byla v pvodním jazyce provedena v kontextu γaδ, lze v nové gramatice provést rovnž (bez ohledu na kontext). Bezkontextový nadjazyk navíc obsahuje i vty, které vzniknou práv derivacemi bez ohledu na kontext. P.: Jazyk posloupností: A = { a }, L = A* P.: Jazyk binárních závorek: A = { a, b }, L = { a n b n n 1 } P.: Jazyk ternárních závorek: A = { a, b, c }, L = { a n b n c n n 1 } Syntaktické stromy Expr ::= Const Var-Name Expr + Expr Nejednoznanost Expr ::= Const Var Expr + Expr Com ::= Var := Expr if Expr then Com if Expr then Com else Com Abstraktní (syntaktické) stromy Jednoznanost bezkontextové gramatiky je nerozhodnutelná. Obecn je sice správnjší použít jednoznanou gramatiku, ale pi definici syntaxe asto využíváme nejednoznané gramatiky, nebo ty mohou být pehlednjší. Musíme však vždy zajistit, aby nejednoznanost odvození nemla vliv na definici sémantiky. (1) Expr ::= Const (2) Expr ::= Var-Name (3) Expr ::= Expr + Expr Výraz "x + y + z" má rzná možná odvození (derivace): Expr -3-> Expr+Expr -2-> x+expr -3-> x+expr+expr -2-> x+y+expr -2-> x+y+z (3,2.1,3,2,2) Expr -3-> Expr+Expr -2-> Expr+z -3-> Expr+Expr+z -2-> x+expr+z -2-> x+y+z (3,2.2,3,2,2) Abstraktní strom neobsahuje syntaktické detaily. Regulární výrazy Mnoho jazyk má rekurzivní charakter v tom smyslu, že syntaktické kategorie jsou Karel Richta 3
definovány rekurzivním odkazem na sebe sama: A γaδ Sémantika programovacích jazyk: Syntaxe a sémantika Pokud jsou γ i δ neprázdné etzce, mžeme je považovat za jakési závorky. Jazyky, které jsou generovány pomocí takových pravidel, obsahují tzv. závorkové struktury. Bezkontextové gramatiky jsou velmi vhodný nástroj práv na popis jazyk se závorkovými strukturami. Jazyky, které tuto vlastnost nemají, nazýváme regulární jazyky. Tída tchto jazyk zahrnuje mnoho zajímavých jazyk - asembler, píkazový jazyk operaního systému, atd. Regulární jazyk je jazyk, pro který existuje gramatika bez závorek. To neznamená, že by gramatika nemohla obsahovat rekurzi (levou nebo pravou). P.: Indentifikátory Id ::= Letter Id Letter Id Digit P.: Asembler Prog ::= e Prog Instr Instr ::= Op Opnd Id Op Opnd Op ::= LOAD STORE ADD JUMP... Opnd ::= Id Num Syntax regulárních jazyk lze popsat regulární gramatikou, ale asto používáme definici pomocí tzv. regulárních výraz. Bu A abeceda (konená neprázdná množina). Nech a A je libovolné písmeno abecedy. Zápisem [X] oznaíme množinu všech etzc, které zastupuje regulární výraz X. Množinu RE regulárních výraz (formální jazyk regulárních výraz) nad abecedou A definujeme: Syntax: RE e RE a Sémantika: RE RE RE RE RE RE RE RE* RE (RE) RE [ RE ] poznámka e { e } prázdný etz a { a } znak Karel Richta 4
Sémantika programovacích jazyk: Syntaxe a sémantika F G { fg f [F] g [G] } zetzení F G [F] [G] varianta F* { s 1 s k s i [F] } { e } iterace (F) [F] skupina P.: Syntax identifikátoru mžeme popsat regulárním výrazem: Dig = ( 0 1 2 3 4 5 6 7 8 9 ) Lett = ( a b... Z ) Id = Lett ( Lett Dig )* Mikrosyntaxe a makrosyntaxe Zápis v (programovacím) jazyce je tvoen posloupností znak abecedy, tj. L A*. Pro úely definice jazyka je vhodné považovat za abecedu jazyka nikoliv jednotlivé znaky, ale tzv. lexikální elementy (lexémy, tokens) - identifikátory, literály, operátory, komentáe atd. Prvním krokem pi popisu jazyka je tedy definice syntaxe tchto lexém - mikrosyntaxe (lexikon) jazyka Q A*. Programy pak považujeme za zápisy nad lexikonem jazyka Q, tj. L Q*. Popis syntaxe pak nazýváme makrosyntaxe jazyka. P.: Jazyk D (triangle - dle Pascala) Mikrosyntax: Program ::= ( Token Comment Blank )* Token ::= Integer-Literal Character-Literal Identifier Operator Keyword Identifier ::= Letter ( Letter Digit )*?? Identifier ::= Letter _ Identifier Digit Identifier Letter... Makrosyntax: Program ::= Command Command ::= V-Name := Expression... Expression ::= Literal V-Name Expression B-Operator Expression... Karel Richta 5
Sémantika programovacích jazyk: Syntaxe a sémantika Zobrazení (pevod) lex: A* Q* { error } se nazývá lexikální analýza a ídí se definicí mikrosyntaxe. asto se pro definici mikrosyntaxe používají regulární výrazy, pro makrosyntaxi se využívají obvykle bezkontextové gramatiky, BNF, EBNF, atd. Bezkontextová gramatika a statická sémantika Popis kontextového jazyka pomocí bezkontextového nadjazyka a omezujících podmínek vyjádených stejnými prostedky, jakými se popisuje sémantika - statická sémantika Zpsoby popisu sémantiky (dynamické sémantiky) operaní sémantika, denotaní sémantika, axiomatická sémantika, akní sémantika Podle zpsobu definice: deduktivní sémantika (jazyková rovnost urena pímo, interpretace nepímo) - axiomatická sémantika, pepisovací systémy induktivní sémantika (interpretace urena pímo, jazyková rovnost indukována interpretací) - denotaní sémantika Podle modelu: operaní sémantika (význam je modelován výpoetní posloupností) funkcionální sémantika (jako model použity funkce) relaní sémantika (jako model použity relace) kompilaní sémantika (jako model použit jiný jazyk) Karel Richta 6