150 likes | 356 Views
Programmēšanas valodas: Semantika. Datorzinātnes pamati. Semantikas definēšana: ievada apsvērumi. Programmēšanas valoda – jēdzienu, konstrukciju kopums (sistēma), kas paredzēts programmu veidošanai (algoritmu aprakstam).
E N D
Programmēšanas valodas: Semantika Datorzinātnes pamati
Semantikas definēšana: ievada apsvērumi Programmēšanas valoda – jēdzienu, konstrukciju kopums (sistēma), kas paredzēts programmu veidošanai (algoritmu aprakstam). Sintakse: programmu formēšanas un attēlošanas likumi (programmu kā instrukciju sistēmu veidošanas un pieraksta likumi) Semantika:saistība starp programmām kā instrukciju sistēmām un to izpildes laika diskrētajiem procesiem (kas notiek katras programmas izpildes laikā? Kāda ir valodas konstrukciju nozīme programmu izpildes laika terminos?) “Praktiskā” semantika: kā programma tiek izpildīta uz konkrētā datora? Konkrēts valodas L kompilators katrai programmai valodā L piekārto noteiktu ielādes moduli. Kompilators definē semantiku – atbilstību starp programmām un ielādes moduļiem (pieņemam, ka zinām, kādā veidā tiek izpildīts ielādes modulis). Kā secināt, ka otrs kompilators uz tā paša vai otra datora realizēs to pašu semantiku? – Vajadzīgs semantikas apraksts, kas ir neatkarīgs no konkrētā datora, konkrētā kompilatora. Papildus tam, cilvēks var gribēt arī rakstot programmu, zināt, kādā veidā tai būtu jādarbojas. – Vajadzīgs semantikas apraksts cilvēkam saprotamos terminos.
Semantikas apraksts: dabiskā vai formālā valodā? Semantika:saistība starp programmām kā instrukciju sistēmām un to izpildes laika diskrētajiem procesiem (kas notiek katras programmas izpildes laikā? Kāda ir valodas konstrukciju nozīme programmu izpildes laika terminos?) Semantikas apraksts: - neatkarīgs no konkrētās implementācijas,- cilvēkam saprotamos terminos. Semantikas apraksts dabiskā valodā, papildus izmantojot shematisku notāciju, balstoties uz intuīciju par diskrēto procesu izpildi – bieži vien var būt pietiekams, lai programmēšanas valodu lietotu (rakstītu programmas, u.c.). Matemātiski precīza valodas semantikas definīcija vajadzīga: - lai varētu matemātiski precīzi spriest par programmu īpašībām (analizēt programmas, pierādīt programmu īpašības), ja semantika ir precīza, programma kļūst par matemātisku objektu. - lai varētu implementēt (realizēt) programmēšanas valodu (uzrakstīt tai kompilatoru, interpretatoru, u.c.) , veidot vidi, kurā citi var rakstīt programmas šajā valodā un tās izpildīt.- …
Programmēšanas valodu semantikas uzdošana Matemātiski precīza semantika saista katru programmu ar noteiktu matemātisku objektu, kas “labi” raksturo šīs programmas realizēto diskrēto procesu. Kādi ir šie matemātiskie objekti? Iespējas ir dažādas (šeit daži piemēri): • Paplašināts automāts, abstrakta mašīna, stāvokļu pāreju grafs, u.taml. (operacionālā semantika) • Funkcija, kas raksturo programmas izejas datu atkarību no ieejas datiem (denotacionālā semantika) • Attiecība starp programmas ieejas un izejas datiem (dabiskā semantika) • Matemātiska teorija, kas satur visus noteiktā loģiskā valodā pierakstāmos apgalvojumus, kas ir patiesi attiecībā uz konkrēto programmu (aksiomātiskā semantika) • Algoritms, kas katrai programmai dotajā valodā piekārto kādu programmu citā valodā, kuras semantika jau ir zināma (translatīvā semantika) Vienai valodai var būt vairākas semantikas (tad gan vajadzīgi “saskaņotības” pierādījumi starp tām).
Mainīgo stāvokļa jēdziens Operacionālās semantikas intuīcija: mēģina formāli aprakstīt darbības, ko programma savā darba laikā veic soli pa solim. Programmas “momentuzņēmums”: ja apturētu programmu kādā darbības brīdī, ko tad redzētu: - programma ir nonākusi līdz kārtējai izpildāmai komandai (vietai programmā); - katram programmas mainīgajam ir noteikta vērtība. Programmas stāvoklis: < vadības stāvoklis, mainīgo stāvoklis > Vadības stāvokļu kopa: C, vadības stāvoklis c C. Programmai, kas nav rekursīva, C ir galīga kopa. Mainīgo kopa Var (varam domāt, ka Var – galīga kopa), mainīgo vērtību kopa Val. Mainīgo stāvoklis – funkcija : Var Val.Mainīgo stāvokļu kopa StVar = Fun(Var, Val), StVar. Programmas stāvoklis: s = < c, >.Stāvokļu kopa: C StVar Operacionālā semantika: apraksta stāvokļu maiņas likumus (soli pa solim). Dabiskā semantika: saista uzreiz programmas sākuma un beigu stāvokļus.
while (x=y) do c if xy then y:=y-x c1 c0else x:=x-y c2 fi od Abstraktā sintakseProgrammu struktūras uzdošana Programma - “kokveida” objekts, piemērs: L.K.D. Demonstrāciju valoda IMP, formācijas likumi uzdod abstrakto sintaktisko struktūru (reālām valodām - sarežģītāka sintakse). AExp: a ::= n | x | a0 + a1 | a0 - a1 | a0 * a1 BExp: b ::= true | false | a0 = a1 | a0 a1 | b0 | b0 b1 | b0 b1 Com: c ::= skip | x := a | c0 ; c1 | if b then c0 else c1 fi | while b do c0 od n Z - konstante, x Var - mainīgais a - aritmētiska izteiksme, b - loģiska izteiksme, c – komanda Abstraktā sintakse atspoguļo programmu strukturālo raksturu. Katra programma – skip programma, piešķiršana, virknes kompozīcija, if, vai while. Programma – strukturāls objekts. Iespējama strukturālā indukcija pa programmas veidošanas koku. Atgādinājums:c1 ; (c2 ; c3) un (c1 ; c2) ; c3 ir divas dažādas programmas.
Semantikas definējums: izteiksmesAttēls: x + (y * 3) Mainīgo stāvoklis (funkcija) : : Var Z Mainīgo stāvokļu kopa: StVar = Fun(Var, Z) ( StVar) Aritmētiskas izteiksmes semantika: aVal: AExp StVar Z Strukturāls definējums: aVal(n, ) = n aVal(x, ) = (x) aVal(a0 + a1 , ) = aVal(a0, ) + aVal(a1, ) aVal(a0 - a1 , ) = aVal(a0, ) - aVal(a1, ) aVal(a0 * a1 , ) = aVal(a0, ) * aVal(a1, ) Loģiskas izteiksmes semantika: bVal: BExp StVar {true, false}bVal(true, ) = true; bVal(false, ) = false; bVal(b0 , ) = not bVal(b0 , ) bVal (a0 = a1, ) = [ aVal(a0, ) = aVal(a1, ) ] bVal (a0 a1, ) = [ aVal(a0, ) aVal(a1, ) ] bVal (b0 b1 , ) = [ bVal(b0, ) and bVal(b1, ) ] bVal (b0 b1 , ) = [ bVal(b0, ) or bVal(b1, ) ]
Komandu izpilde: dabiskā semantika Substitūcija:’ = [n/x], ja (1) ’(x) = n un (2) ’(y) = (y), ja (y x ) Apzīmējumi: b , ja bVal(b, ) = true b , ja bVal(b, ) = false Komandu semantikas vispārējais formāts: <c, > ’ Com StVar StVar Ja komandu (programmu) c izpilda sākuma mainīgo stāvoklī, tad rezultāts būs ’. Strukturāla definīcija: (1) <skip, > (2) < x := a, > [n/x], ja aVal(a, ) = n (3) < c0 ; c1, > ’ , ja < c0, > ’’ un < c1, ’’ > ’ (4a) < if b then c0 else c1 fi, > ’ , ja b un < c0, > ’ (4b) < if b then c0 else c1 fi, > ’ , ja b un < c1, > ’ (5a) < while b do c0 od, > , ja b (5b) < while b do c0 od, > ’ , ja b < c0, > ’’ < while b do c0 od, ’’ > ’
while (x=y) do c if xy then y:=y-x c1 c0else x:=x-y c2 fi od Dabiskās semantikas izveduma piemērs Notācija: = {x 6, y 9}, ’ = {x 6, y 3}, ’’ = {x 3, y 3}, b1 = (x=y) , b2 = xy aVal(x-y, ’) = 3 ’’ = ’ [3/x] 2 aVal(y-x, ) = 3 ’ = [3/y]’ b2 < c2 , ’> ’’ ’’ b1 2 4b 5a b2 < c1 , > ’ ’ b1 < c0 , ’> ’’ < c, ’’ > ’’ 4a 5b b1 < c0 , > ’ < c, ’ > ’’ 5b < c, > ’’
Determinitātes teorēma Teorēma: Ja <c, > ’ un <c, > ’’ , tad ’ = ’’ Pierādījums. Izmantojam strukturālo indukciju pa komandas c definīcijas koku. Apskatām visus gadījumus, kāda var būt komanda c. (1) Ja c skip, tad vienīgā iespējamā tās izpilde ir <c, > , tātad ’ = = ’’ (2) Ja c x := a, tad <c, > * iespējams tikai, ja aVal(a, ) = n un * = [n/x], tātad ’ = [n/x] = ’’. (3) Ja c c0 ; c1, tad <c, > * iegūstams tikai, ja <c0, >** un <c1, **>* . Izmantojam induktīvo pieņēmumu. No c0 determinitātes seko, ka nav iespējami divi dažādi **, tālāk no c1 determinitātes seko, ka nav iespējami divi dažādi *. (4) Ja c if b then c0 else c1 fi, tad šķirojam 2 gadījumus: b vai b.Ja b, tad <c, > ’ iespējams iegūt tikai ar 4a likumu, tātad <c, > ’ tad un tikai tad, ja <c0, > ’. Tā kā c0 ir determinēta saskaņā ar induktīvo pieņēmumu, tad arī c ir determinēta. Gadījums b izspriežams analoģiski. (5) Ja c while b do c0 od, tad ja b, tad ’ = = ’’, tātad šim c ir determinēta.Ja b, izmantojam indukciju pēc mazākā no <c, > ’,<c, > ’’, izveduma koku dziļumiem (5b likuma pielietošanas reižu skaits) n. Ja n=0, esam jau aplūkotajā situācijā b. Ja <c, > ’ vai <c, > ’’ iegūstams ar izvedumu dziļumā k+1, tad secinām, ka <c0, > * vienam vienīgam *, bet c ir determinēts stāvoklim *, jo <c, * > ’ vai <c, * > ’’ iegūstams ar izvedumu dziļumā k (induktīvais pieņēmums).
Determinitātes teorēma: pierādījuma komentāri Teorēma: Ja <c, > ’ un <c, > ’’ , tad ’ = ’’ Pierādījums. Izmantojam strukturālo indukciju pa komandas c definīcijas koku. Apskatām visus gadījumus, kāda var būt komanda c … … … Indukcija pa programmas struktūru ir tipiska metode šāda veida pierādījumos (tā ir tipiska metode objektu, kas ir strukturāli definēti, īpašību pierādīšanai). Vienkāršākajos gadījumos pierādījums bija salīdzinoši vienkāršs. Pierādījuma gaitā varēja ievērot, ka izmantojām semantikas definīcijas likumus apgrieztus otrādi, “ar kājām gaisā”. Kāpēc to varēja darīt? (A B un B A taču nav viens un tas pats). Iemesls: arī semantikas attiecība ir definēta induktīvi, uzskaitot visus iespējamos veidus, kā varam iegūt trijniekus <c, > ’. Katrā no gadījumiem varēja redzēt, ka attiecīgā pāreja varēja tikt iegūta atbilstoši semantikas likumiem tikai vienā vienīgā veidā. Kopumā pierādījums tomēr nav ļoti vienkāršs: līdzās ārējai indukcijai cikla operatora gadījumā bija vajadzīga arī vēl viena indukcija pēc semantikas izveduma koka dziļuma (pēc minimālā no 2 izveduma koku dziļumiem). Vai vērts ar šādu “acīmredzamu” lietu pierādīšanu nodarboties: ir vērts, jo pierodam strādāt ar programmām, kā ar matemātiskiem objektiem.
Komandu izpilde: operacionālā semantika Operacionālā jeb viena soļa semantika. Komandu semantikas vispārējais formāts (viens solis): < c, > > < c’, ’ > Definējam: < c, > >* < c’, ’ >, ja < c, > >> … > < c’,’ > Tukšā komanda: E, katrai c: c ; E c E ; c Soļu virknes semantika: < c, > > ’, ja < c, > >* < E, ’ > Strukturāla definīcija: (1) <skip, > > < E, > (2) <x := a, > > < E, [n/x] >, ja aVal(a, ) = n (3) < c0 ; c1, > > < c’; c1, ’ > , ja < c0, > > < c’,’ > (4a) < if b then c0 else c1 fi, > > < c0, >, ja b (4b) < if b then c0 else c1 fi, > > < c1, >, ja b (5a) < while b do c0 od, > > < E, > , ja b (5b) < while b do c0 od, > > < c0 ; while b do c0 od, > , ja b
while (x=y) do c if xy then y:=y-x c1 c0else x:=x-y c2 fi od Operacionālās semantikas izveduma piemērs Notācija: = {x 6, y 9}, ’ = {x 6, y 3}, ’’ = {x 3, y 3}, b1 = (x=y) , b2 = xy < c, > (5b) jo b1 > < c0 ; c , > (4a) jo b2 > < c1 ; c , > (3) jo < c1, > > < E, ’ >, (2) jo aVal(y-x, ) = 3, ’ = [3/y] > < E ; c , ’ > < c, ’ > (5b) jo ’ b1 > < c0 ; c , ’ > (4b) jo ’ b2 > < c1 ; c , ’ > (3) jo < c1, ’ > > < E, ’’ >, (2) jo aVal(x-y, ’) = 3, ’’ = ’[3/x] > < E ; c , ’’ > < c, ’’ >(5a) jo ’ b1 > < E , ’’ > Tātad: < c, > > ’’.Redzam, ka abas semantikas “sakrīt”.
Semantiku atbilstība (A) Teorēma. Katrai komandai c, katram sākuma stāvoklim : < c, > ’tad un tikai tad, ja< c, > > ’. Pierādījums.A:< c, > > ’ < c, > ’ B: > A: izmantojam indukciju pa programmas struktūru. (1,2) skip, := gadījumi izriet tieši no definīcijām. (3) Ja < c0 ; c1, > >* < E, ’ >, tad šajā virknē būs vieta, kurai < c0 ; c1, > >* < E; c1, ’’ > < c1, ’’ > >* < E, ’ >, turklāt varam konstatēt < c0, > >* < E, ’’ > (kamēr c0 komponente nav pabeigta, tikmēr pārejas sastāda šai komponentei iespējamu pāreju secību). Pēc indukcijas pieņēmuma iegūstam < c0, > ’’ un < c1, ’’ > ’, pēc dabiskās semantikas 3. likuma secinām < c0 ; c1, > ’. (4) Ja < if b then c0 else c1 fi, > >* < E, ’ >, tad, ja b, tad < if b then c0 else c1 fi, > > < c0, > >* < E, ’ >. Tātad pēc indukcijas pieņēmuma < c0, > ’. Pēc dabiskās semantikas 4a likuma secinām, ka < if b then c0 else c1 fi, > ’. Ja b, spriežam analoģiski pēc 4b. (5) Ja< c, 0 > >* < E, ’ > , kur c while b do c0 od, tad varam konstatēt, ka <c, 0> >* <c, 1> >* <c, 2> >* … >* <c, n> > < E, n> , kur n= ’, n b un i <n: i b. Redzam, ka i <n: <c, i> i+1. Ar indukciju pēc k, izmantojot dabiskās semantikas 5.likumu pierādām, ka <c, n-k> ’, ja k n.
Semantiku atbilstība (B) Teorēma. Katrai komandai c, katram sākuma stāvoklim : < c, > ’tad un tikai tad, ja< c, > > ’. Pierādījums.B:< c, > ’ < c, > > ’ B: izmantojam (atkal) indukciju pa programmas struktūru. (1,2) skip, := gadījumi izriet tieši no definīcijām. (3) Ja < c0 ; c1, > ’, tad šis fakts var būt iegūts tikai ar dabiskās semantikas 3. likumu, tātad eksistē ’’, kam < c0, > ’’ un < c1, ’’ > ’. Pēc induktīvā pieņēmuma < c0 , > >* < E, ’’ > (**). Pēc operacionālās semantikas 3.likuma (pielietota katram virknes (**) solim)< c0 ; c1, > >* < E; c1, ’’ >. Tā kā arī < c1, ’’ > >* < E, ’ >, tad < c0 ; c1, > >* < E, ’ >. (4) Ja < c, > ’ , kur c if b then c0 else c1 fi, tad, ja b, tad < c, > ’ var būt iegūts tikai pēc 4a likuma, tātad < c0, > ’, tātad pēc induktīvā pieņēmuma< c0 , > >* < E, ’ >.Pēc operacionālās semantikas 4a likuma< c, > > < c0, >. Pēc >*definīcijas iegūstam <c, > >* < E, ’ >.Ja b, spriežam analoģiski pēc 4b likumiem. (5) Ja< c, > ’, kur c while b do c0 od, tad lietojam indukciju pa šī fakta izveduma koka dziļumu n. Ja n=0, tad bun ’ = , tātad <c, > >* < E,’ >.Pāreja k -> k+1: <c,> ’ iegūts pēc 5a likuma no <c0,> ’’ un <c,’'> ’. Secinām<c0,> >’’ pēc strukturālās indukcijas pieņēmuma un <c,’'> >’pēcpieņēmuma indukcijai pan.Tātad < c, > >’.