150 likes | 765 Views
Programmēšanas valodas. Sintakse. Realizācija. Datorzinātnes pamati. Programmēšanas valodas: ievads. Programmēšanas valoda – jēdzienu, konstrukciju kopums (sistēma), kas paredzēts programmu veidošanai (algoritmu aprakstam). Algoritms (atkārtojums):
E N D
Programmēšanas valodas. Sintakse. Realizācija. Datorzinātnes pamati
Programmēšanas valodas: ievads Programmēšanas valoda – jēdzienu, konstrukciju kopums (sistēma), kas paredzēts programmu veidošanai (algoritmu aprakstam). Algoritms (atkārtojums): viennozīmīgs (determinēts) priekšraksts elementāru (atsevišķu, diskrētu) un efektīvu (izpildāmu) instrukciju secīgaiizpildei.[+masveidība, +mērķis, + garantētaapstāšanās]. Programma – algoritma pieraksts noteiktas konstrukciju sistēmas ietvaros. Pamata prasības uz programmēšanas valodu: 1) Iespēja programmas izpildīt uz datora (uz dažādiem datoriem) 2) Iespēja lietotājam ērti strādāt ar programmām (piemērotība lietotāja uztverei). Programmu veidošana, lasīšana (uztvere), īpašību analīze, iespēja modificēt, … Vēsturiski: pirmās programmas tika rakstītas tieši reģistru mašīnu valodās. Pirmā “augsta līmeņa” programmēšanas valoda FORTRAN 1956. gadā. Revolūcija programmēšanas attīstībā. Iespēja algoritmus aprakstīt cilvēkam intuitīvi labi uztveramos terminos.
Programmēšanas valodas: ieskats vēsturē Programmēšanas valoda – jēdzienu, konstrukciju kopums (sistēma), kas paredzēts programmu veidošanai (algoritmu aprakstam). Dažādas programmēšanas valodas (sistēmas): - reģistru mašīnas (operāciju kopums analoģisks RAM); - FORTRAN (1956): simboliski vārdi mainīgajiem; Konstrukcijas: IF a-exp N1, N2, N3; DO N1, x=n1,n2 - ALGOL 58: datu tipi, deklarācijas, gari mainīgo vārdi, :=, iekļautie IF, FOR - ALGOL 60: begin-end ar lokālajiem mainīgajiem, rekursija, dinamiskie masīviTeorētiska valoda, pamats ALGOL 68, BASIC, PL/I, C, PASCAL, ADA, C++ - 1960: LISP – funkcionāla valoda, AI aplikācijas; programma un dati - viss ir saraksts, [iekavu izteiksme (A (B C) D (E (F G))) ]; SCHEME, COMMON LISP - C (1971): zema līmeņa valoda, viegli uztveramas konstrukcijas, UNIX sistēmas valoda. Nav tipu kontroles (+ / -) - PROLOG: Loģiskās programmēšanas valoda. Rezolūciju metode 1965.g, interpretators ~1974, AI, dažas datu bāzu sistēmas, ierobežoti pielietojumi - Objekt-orientācija: SmallTalk, C++, Eiffel, JAVA, u.c. - Paralēlās progr. valodas, vizuālās progr. valodas, u.c.
Kāpēc šāda dažādība? Programmēšanas valoda – jēdzienu, konstrukciju kopums (sistēma), kas paredzēts programmu veidošanai (algoritmu aprakstam). Kāpēc šāda dažādība? 1) Vēsturiskā attīstība: - pieaug prasības uz programmatūras apjomu un kvalitāti, parādās jauni programmēšanas uzdevumi, datoru lietojuma apgabali (piemēram, lokālā tīklā vai globālā tīmeklī izvietotas informācijas apstrāde); - attīstās cilvēku priekšstati par to, kā labi veidot programmas (piemēram, objektorientācijas ideja, vai agrāk ideja par augsta līmeņa valodu konstrukcijām); - attīstās datoru tehniskās iespējas, attīstās programmēšanas vides, parādās iespējas automatizēt programmēšanas darbu. 2) Dažādas programmēšanas valodas dažādiem mērķiem: piemēram: mākslīgais intelekts, sistēmu programmēšana, fizikālu procesu kontroles sistēmas, tīmekļa aplikācijas, matemātisku vienādojumu risināšana, u.c. 3) Gaumes (arī cilvēka domāšanas un izglītības veida) un komerciāla rakstura apsvērumi (kompānijas, kas cenšas panākt, lai viņu valoda tiktu izplatīta), u.c.
PV realizācija uz datora Programmēšanas valoda – jēdzienu, konstrukciju kopums (sistēma), kas paredzēts programmu veidošanai (algoritmu aprakstam). Svarīgi, lai programmas būtu ne tikai saprotamas, bet arī, lai būtu iespējams tās izpildīt uz datora. Dators – apstrādā tikai 0 un 1 .. Nu labi, dators – reģistru mašīna (ASSEMBLER līmenis) 2 principiālas iespējas: 1) kompilācija: pārtulkot dotu valodas L programmu par reģistru mašīnas programmu; programma, kas veic šādu tulkošanu ir kompilators (kompilators valodai L uz konkrētā datora komandu sistēmu) 2) interpretācija: uzrakstīt programmu I (kas darbojas reģistru mašīnas komandu sistēmā), un kas “saprot” vai “spēj izpildīt” valodas L programmas. Šāda programma I tiek saukta par valodas L interpretatoru. Interpretators kā ieejas datus saņem gan valodā L uzrakstītās programmas P tekstu, gan arī ieejas datus, kas domāti programmai P. Universālā Tjūringa mašīna: Tjūringa mašīnu interpretators. Interpretators (un arī kompilators) var būt rakstīts kādā “augsta līmeņa” valodā un pēc tam kompilēts. Optimizējošie C kompilatori ir paši rakstīti valodā C. Pastāv arī t.s. hibrīdā implementācija (sk. shēmu nākamajā slaidā).
Programmēšanas valodu realizācijas shēmas Ieejas dati INTERPRETATORS Rezultāts Programmas teksts Interpretācija: Kompilācija: Hibrīdā implementācija: Kompilators: Leksiskā analīze Sintaktiskā analīze Starpkoda ģenerēšana Optimizācija Koda ģenerēšana Programmas teksts Programmas kods Ieejas dati Programmas kods Rezultāts Preprocesors: Leksiskā analīze Sintaktiskā analīze Starpkoda ģenerēšana Starpkods Programmas teksts Rezultāts Interpretators Ieejas dati
Sintakse un semantika Programmēšanas valoda – jēdzienu, konstrukciju kopums (sistēma), kas paredzēts programmu veidošanai (algoritmu aprakstam). Programmēšanas valodai parasti var runāt par šādiem elementiem: 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ā” sintakse: programmu vajag uzrakstīt tā, lai kompilators (uz konkrētā pieejamā datora) to atzītu par derīgu attiecīgās valodas programmu. Valodas vienotība, saprotamība: vajadzīgi arī no konkrētā kompilatora neatkarīgi likumi, kā veidojami pareizi programmu teksti. Sintaktiskie likumi ne tikai nosaka “pareiza / nepareiza” programma, bet arī sniedz informāciju par programmas struktūru. Informācija par programmas struktūru būtiska arī, lai programmu varētu izpildīt, kā arī lai varētu runāt par programmas semantiku (kā programmu jāizpilda?).
Konkrētā un abstraktā sintakse 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) Sintaktiskie likumi ne tikai nosaka “pareiza / nepareiza” programma, bet arī sniedz informāciju par programmas struktūru. Abstraktā sintakse: tikai programmas struktūras definējums, valodas konstrukciju formēšanas likumi. Tipiski: programma – kokveida (vai citāds strukturēts) objekts, abstraktā sintakse nerūpējas par to, kā katru programmu pierakstīt uz papīra (vai citādi komunicēt starp cilvēku un datoru, starp 2 cilvēkiem, vai starp 2 datoriem). Konkrētā sintakse: programmas struktūras un pieraksta definējums. Lai dators spētu atpazīt programmu kādā valodā, tai jābūt uzrakstītai atbilstoši šīs valodas konkrētās sintakses likumiem. Arī šiem likumiem jābūt lietotājam ērtiem. Par daudzām programmu īpašībām (t.sk. izpildes laika īpašībām) var spriest jau no abstraktās sintakses. Konkrētā sintakse tad var ienest spriedumos nevajadzīgu detalizāciju. Arī kompilatori ģenerē programmu abstraktās sintaktiskās struktūras.
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; kodēšana uz papīra: kaut kad vēlāk 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, līdzīgi kā loģiskas izteiksmes iepriekš kursā. Iespējama strukturālā indukcija pa programmas veidošanas koku. Uzmanību:c1 ; (c2 ; c3) un (c1 ; c2) ; c3 ir divas dažādas programmas.
Konkrētās sintakses uzdošana Abstraktā sintakse: tikai programmas struktūra Konkrētā sintakse: programmas struktūra + pieraksta likumi Tipiska konkrētās sintakses uzdošanas metode: izmanto t.s. gramatikas. Bekusa – Naura forma (BNF), EBNF, sintakses diagrammas – balstītas uz gramatikām. Gramatika: 1) noteikts alfabēts T tekstiem – terminālie jeb gala simboli 2) noteikts jēdzienu alfabēts N – neterminālie jeb iekšējie simboli, N T = , katrs jēdziens atbilst kādam “saturīgam” teksta fragmentam; 3) sākuma neterminālais simbols S N (atbilst visam tekstam); 4) noteikta veida teksta transformācijas likumi (N un T simbolu teksta fragmentu aizstāšana ar citiem N un T simbolu tekstiem), kas ļauj no S iegūt tekstu, kas sastāv tikai no T simboliem. Bezkonteksta gramatika: (T,N,P,S): Bieži izmantotas sintakses definīcijāsT - terminālie jeb gala simboliN - neterminālie (iekšējie simboli), N T = P - produkcijas likumi n[N] x [ (T N)*]S - sākuma neterminālais simbols, S N Šāda veida gramatika ir “bezkonteksta” (angl. context-free), jo katram nN jebkuru pP var pielietot neatkarīgi no tā konteksta, kur n atrodas (kādi simboli ir n blakus).
Bezkonteksta gramatikas Bezkonteksta gramatika: (T,N,P,S):T - terminālie simboli, N - neterminālie (iekšējie) simboli, N T = , P - produkcijas likumi n[N] x [ (T N)*], S - sākuma neterminālais simbols, S N. Piemērs:T={ a, b, c }, N ={ S, A, B } Likumi:S AB, A aAb, A , B bBc, B Izvedums:SAB aAbB abB abbBc abbc Cits izvedums:SAB aAbB aaAbbB aaaAbbbB aaabbbB aaabbbbBc aaabbbbbBcc aaabbbbbcc Cits izvedums vārdamabbc: S AB AbBc Abc aAbbc abbc Gramatika G apraksta valoduL, kurai vārds x L, ja x var “izvest” šajā gramatikā no sākuma neterminālā simbola S, izmantojot dotos produkcijas likumus. Ja valodai L eksistē bezkonteksta gramatika G, kas apraksta L, tad L tiek saukta par bezkonteksta valodu. Kādu valodu apraksta dotā gramatika? Ievērosim: “valoda” = vārdu kopa (līdzīgi bija ar automātu atpazītām valodām). Programmēšanas valodas struktūra “paslēpusies” “x no S” izveduma procesā. Vārdam abbc divi dažādi izvedumi dotajā gramatikā. Kur paslēpusies “struktūra”? Kas atbilst “S”? Kas atbilst “A”? Kas atbilst “B”?
S A B a A b b B c Bezkonteksta gramatikas: izveduma koks Bezkonteksta gramatika: (T,N,P,S):T - terminālie simboli, N - neterminālie (iekšējie) simboli, N T = , P - produkcijas likumi n[N] x [ (T N)*], S - sākuma neterminālais simbols, S N. Piemērs:T={ a, b, c }, N ={ S, A, B } Likumi:S AB, A aAb, A , B bBc, B Izvedums:SAB aAbB abB abbBc abbc Cits izvedums:S AB AbBc Abc aAbbc abbc Abi izvedumi atbilst vienam izveduma kokam (zīm.) Izveduma koks tiek iegūts no izveduma, aplūkojot to, kādā veidā katrs no iegūtajiem neterminālajiem simboliem ir (agrāk vai vēlāk) tālāk izvērsts. Iegūtais vārds nolasāms no izveduma koka lapām(tālāk neizvērstām virsotnēm, kas satur gala simbolus) koka apgaitas secībā no kreisās puses uz labo. Katram neterminālam simbolam atbilst tā vārda daļa, kas ir kokā zem šī simbola. Gramatika G ir viennozīmīga, ja katram vārdam x G aprakstītajā valodā L eksistē tieši viens izveduma koks. Neviennozīmīga gramatika: S AB, A nošaut, A nošaut nevajag, B apžēlot, B nevajag apžēlot
Bezkonteksta gramatikas: aritmētiskas izteiksmes Bezkonteksta gramatika: (T,N,P,S):T - terminālie simboli, N - neterminālie (iekšējie) simboli, N T = , P - produkcijas likumi n[N] x [ (T N)*], S - sākuma neterminālais simbols, S N. Mēģinājums aprakstīt aritmētiskas izteiksmes. Piezīme: | apzīmē alternatīvas izveduma likumos (vienā rindiņā attēloti vairāki izveduma likumi). <E> <E> + <T> | <E> - <T> | <T> <T> <T> * <A> | <T> / <A> | <A> <A> <V> | <C> | (<E>) | (- <E>) <V> <L> <SS> <SS> <SS> <S> | <S> <L> | <D> <C> <C> <D> | <D> <D> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 <L> a | b | c | … | z | A | B | C | … | Z <E> - izteiksme, <T> - terms (reizināšanas vai dalīšanas izteiksme), <A> - atoms, <V> - mainīgais, <C> - konstante, <SS> - simboli, <S> - simbols, <L> - burts, <D> - cipars.
Dažas teorēmas Bezkonteksta gramatika: (T,N,P,S):T - terminālie simboli, N - neterminālie (iekšējie) simboli, N T = , P - produkcijas likumi n[N] x [ (T N)*], S - sākuma neterminālais simbols, S N. Teorēma 1. Katra valoda L, kas ir atpazīstama ar galīgu automātu, ir arī bezkonteksta valoda. Pierādījums: Pēc L atpazīstošā automāta A konstruējam bezkonteksta gramatiku G, kas atpazīst L. G neterminālo simbolu kopa – visi automāta A stāvokļi. Izveduma likumi: qi a qj, ja automātā ir pāreja ar a no qi uz qj. Visiem beigu stāvokļiem q F pievienojam likumu q . Sākuma neterminālis – automāta sākuma stāvoklis. Teorēma 2. Eksistē bezkonteksta valoda, kas nav atpazīstama ne ar vienu galīgu automātu. Pierādījums: Tāda ir valoda { an bn | n Nat }. Teorēma 3. Valoda { an bn cn | n Nat } nav bezkonteksta valoda. Pierādījums: Vai nevēlaties pamēģināt? Vajadzētu pieņemt pretējo un aplūkot izveduma koku kādam pietiekoši garam vārdam …