24
Programski vzorci June 5, 2012

Pv 3. Kolokvij

Embed Size (px)

Citation preview

Page 1: Pv 3. Kolokvij

Programski vzorci

June 5, 2012

Page 2: Pv 3. Kolokvij

Contents

1 Sintaksa in semantika 31.1 Leksikalna analiza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.1.1 Groba zgradba prevajalnika . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.1.2 Pregledovalnik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.1.3 Neformalni in formalni opis vzorca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.2 Regularni izrazi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.2.1 Regularne definicije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.2.2 Regularni izrazi, ki se pogosno pojavljajo . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.2.3 Deterministični končni avtomat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

1.3 Sintaktična analiza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.3.1 Gramatika . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.3.2 Jezik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

1.3.2.1 Drevo izpeljav . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.3.3 Sintaktična analiza ali razpoznavanje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.3.4 BNF (Backus-Naur Form) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

1.3.4.1 EBNF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.3.4.2 Sintaktični analizator ali razpoznavalnik (ang. parser) . . . . . . . . . . . . . . . 7

1.3.5 Razpoznavalniki LL(1) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.3.5.1 Kaj je gramatika LL(1)? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.3.5.2 Odpravljanje leve rekurzije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81.3.5.3 Levo faktoriranje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

1.4 Semantična analiza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.4.1 Atributna gramatika . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2 Programski vzorci, programske paradigme 102.1 Razlogi za preučevanje programskih vzorcev . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102.2 Domene programiranja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102.3 Kriteriji za ocenjevanje jezikov . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

2.3.1 Drugi ocenitveni kriteriji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112.4 Vpliv na načrtovanje jezikov . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

2.4.1 Vpliv von Neumann arhitekture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122.4.2 Izvajanje strojnega koda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122.4.3 Modeli programiranja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122.4.4 Vplivi na metodologije programiranje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122.4.5 Vrste programskih jezikov . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132.4.6 Kompromisi načrtovanja jezikov . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

2.5 Metode implementacije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.5.1 Prevajanje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

2.5.1.1 Dodatni termini pri prevajanju . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.5.2 Interpretiranje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.5.3 Pred-procesiranje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.5.4 Programska okolja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

1

Page 3: Pv 3. Kolokvij

3 Tipi in spremenljivke 163.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163.2 Spremenljivke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

3.2.1 Imena . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163.2.2 Atributi spremenljivk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

3.3 Koncept povezljivosti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173.3.1 Možni časi povezovanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173.3.2 Statična in dinamična povezljivost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

3.3.2.1 Statično povezovanje tipov . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183.3.2.2 Dinamično povezovanje tipov . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

3.3.3 Atributi spremenljivk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183.4 Organizacija pomnilnika . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193.5 Čas povezovanja spremenljivke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193.6 Smetar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203.7 Implementacija podatkovnih tipov . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

3.7.1 Podatkovni tipi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203.8 Osnovni podatkovni tipi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203.9 Uporabniško določeni števni tipi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

3.9.1 Naštevni tipi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213.9.1.1 Ovrednotenje naštevnega tipa . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213.9.1.2 Naštevni tipi v Javi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

3.10 Polja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223.10.1 Vezava indeksov in tipi polj . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223.10.2 Inicializacija polja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233.10.3 Rezine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233.10.4 Dostop do večdimenzionalnih polj . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233.10.5 Deskriptorji v času izvajanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233.10.6 Asociativna polja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

2

Page 4: Pv 3. Kolokvij

Chapter 1

Sintaksa in semantika

1.1 Leksikalna analiza

• Opravimo jo pred sintaktično analizo.

• Naloga leksikalne analize je poiskati iz niza znakov besede (rezervirane besede, identifikatorje, operatorje,literale . . . ) oz. osnovne leksikalne simbole (tokens).

Zgledi

1. Maja se uči.

2. Toni sta vek.

3. Mojca je prebral knjigo.

4. if (a==b) z=0; else z=’a’;

Prevajalnik opravi semantično analizo da preveri morebitne nepravilnosti v programu.

1.1.1 Groba zgradba prevajalnika

niz znakov → Leksikalni analizator → osnovni leksikalni simboli → Sintaktični in semantični analizator →vmesna predstavitev → . . .

1.1.2 Pregledovalnik

• Leksikalno analizo opravi leksikalni analizator ali pregledovalnik (scanner). Njegove naloge so:

– sintaktičnemu analizatorju posredovati osnovne leksikalne simbole– izločitev znakov, ki nimajo pomen (prazna mesta, nove vrstice, komentar)– polnitev simbolne tabele z dodatnimi informacijami– sintaktičnemu analizatorju posredovati poleg leksikalnega simbola še leksikalno vrednost oz. lexem

Zgled Primeri neformalnih opisov osnovnih leksikalnih simbolov:Osnovni leksikalni simbol Lexem Neformalni opis vzorca

id stevec, b12, pi znak, ki mu sledijo znaki in cifrenum 3.4, 0, 2.6E+12 numerični literalrelop <, <=, ==, !=, >, >= relacijski operator

1.1.3 Neformalni in formalni opis vzorca

• “znak, ki mu sledijo znaki in cifre” — neformalni opis.

• Opis za realno število?

• potrebujemo formalni opis:

– regularni izrazi

3

Page 5: Pv 3. Kolokvij

1.2 Regularni izrazidecreal: -?(\.\d+|\d+\.\d*)([Ee][+-]?\d+)?hexreal: -?0[Xx](\.[A-Za-z\d]+|[A-Za-z\d]+\.[A-Za-z\d]*)([Pp][+-]?\d+)?

1. ε je regularni izraz

2. a je regularni izraz

3. Če sta r in s regularna izraza, potem je:

• (r)|(s) je regularni izraz — (unija)

• (r)(s) je regularni izraz — (konkatenacija)

• (r)∗ je regularni izraz — (operacija zaprtja)

• (r) je regularni izraz

Zgled

• Σ = {a, b} (abeceda)

– a|b označuje jezik {a, b}– (a|b)(a|b) označuje jezik {aa, ab, ba, bb}– a ∗ označuje jezik {ε, a, aa, aaa, . . .}

1.2.1 Regularne definicije

Regularna definicija je zaporedje poimenovanih regularnih izrazov oblike:

d1 → r1

d2 → r2

. . .

dn → rn

kjer:

• di so različni identifikatorji,

• ri so regularni izrazi nad Σ in predhodno definiranimi d1 · · · dn.

Zgled Opis leksikalnega simbola id:

znak → A|B| . . . |Z|a|b| . . . |zcifra → 1|2| . . . |9

id → znak(znak|cifra)∗

1.2.2 Regularni izrazi, ki se pogosno pojavljajo

1. r+ = rr∗(r∗ = r+|r) (pozitivna iteracija)

2. r? = r|ε (opcija)

3. [abc] = a|b|c (razred znakov)

4. [a− z] = a|b| . . . |z

4

Page 6: Pv 3. Kolokvij

Zgled

cifra → [0− 9]

num → cifra+(.cifra+)?(E(+|−)?cifra+)?

1.2.3 Deterministični končni avtomat

Definicija: Deterministični končni avtomat je peterka M = 〈Q,Σ, δ, q0, F 〉, kjer je:

• Q: končna množica stanj

• Σ: abeceda avtomata

• δ: parcialna funkcija, ki preslika stanje in vhodni simbol abecede Σ v novo stanje, δ : (Q× E)→ Q

• qo: začetno stanje avtomata, q0 ∈ Q

• F : neprazna množica končnih stanj avtomata, F ⊂ Q

Funkcijo δ predstavimo s tabelo prehodov.δ + − . d

S A A G BA G BB H BG HH H

1.3 Sintaktična analiza

• Naloga sint. analize je ugotavljanje strukture stavkov jezika.

• Potrebujemo neka pravila, ki povedo, kako naj povezujemo posamezne besede.

• Tej množici pravil rečemo sintaksa ali gramatika jezika.

1.3.1 Gramatika

Definicija: Gramatika G je četverka: G = 〈T,N,Z, P 〉

• T : končna množica terminalnih (končnih) simbolov

• N : končna množica neterminalnih (nekončnih) simbolov

– velja: T ∩N = ∅

• Z: začetni simbol, Z ∈ N

• P : množica produkcij:

– končna neprazna podmnožica relacije (T ∪N) ∗N(T ∪N)∗ 7→ (T ∪N)∗

• terminalne simbole (terminale) pišemo z malimi črkami

• neterminalne simbole (neterminale) pišemo z velikimi črkami

• elemente (T ∪N)∗ pišemo z malimi grškimi črkami

• “iz α izpeljemo v β v enem ali več korakih”:

– α⇒ α1 ⇒ α2 ⇒ · · · ⇒ αn ⇒ β, n > 0

• α⇒+ β (“obstaja izpeljava iz α v β”)

• α⇒∗ β ⇔ (α⇒+ β ∨ α = β)

5

Page 7: Pv 3. Kolokvij

1.3.2 Jezik

Definicija: Jezik L, generiran iz gramatike G:L(G) = {x | Z ⇒∗ x ∧ x ∈ T ∗}

• Jezik je množica vseh tistih zaporedij terminalnih simbolov (oznaka: T ∗), ki jih lahko izpeljemo izzačetnega simbola gramatike.

• Takšna zaporedja terminalnih simbolov imenujemo stavek jezika.

1.3.2.1 Drevo izpeljav

E 7→ E + E

E 7→ E ∗ EE 7→ (E)

E 7→ a

Stavek a+ a ∗ a ime dve drevesi izpeljav (gramatika je dvoumna).

Primer: Jezik aritmetičnih izrazov G = 〈{+, ∗, (, ), a} , {E, T, F} , E, P 〉

E 7→ E + T

E 7→ T

T 7→ T ∗ FT 7→ F

F 7→ (E)

F 7→ a

Pokažimo, da je zaporedje terminalnih simbolov a+ a ∗ a stavek jezika.E → E + T → T + T ∗ F → F + F ∗ a→ a+ a ∗ a

E|E+T+---------------+T T*F| +-------+F F a| |a a

1.3.3 Sintaktična analiza ali razpoznavanje

• ang. parsing

• prveri, ali je neko zaporedje terminalnih simbolov stavek jezika

1.3.4 BNF (Backus-Naur Form)

• Je metajezik za opis sintakse programskih jezikov

• Metajezik uporablja simbole, ki jih imenujemo metasimboli.

• Produkcije imajo obliko:A ::= α1 | α2 | · · · | αn

kjer velja: A ∈ N ∧ αi ∈ (T ∪N)∗

6

Page 8: Pv 3. Kolokvij

Primer: Jezik aritmetičnih izrazov v BNF G = 〈{+, ∗, (, ), a} , {E, T, F} , E, P 〉

E ::= E + T | TT ::= T * F | FF ::= (E) | a

1.3.4.1 EBNF

Razširjena Backus-Naurova oblika vpelje metasimbola {} in []:

• iteracija: A ::= {a} (A ::= aA|ε)

• opcja: A ::= [a] (A ::= a|ε)

1.3.4.2 Sintaktični analizator ali razpoznavalnik (ang. parser)

• Program, ki opravlja sintaktično analizo

• Ločimo dva pristopa:

1. rezpoznavanje od zgoraj navzdol (izhajamo iz začetnega simbola. . . ) [razpoznavalnik LL(1)]

2. razpoznavanje od spodaj navzgor (izhajamo iz listov drevesa (terminalov). . . )

• Obstaja mnogo pristopov in tehnik za razpoznavanje (glej literaturo)

• Izgradnja razpoznavalnika sodi na področje prevajalnikov!

1.3.5 Razpoznavalniki LL(1)

Glede na trenutni terminalni simbol na vhodu za izpeljavo vedno izberemo pravilno produkcijo (ter takopreprečimo vračanje (backtracking)).Uvedemo funkciji FIRST in FOLLOW.

FIRST(α) = {x | α⇒∗ xβ, x ∈ T}FOLLOW(A) = {x | Z ⇒∗ αAβ, x ∈ FIRST(β)}

1. FIRST(a) = {a}

2. FIRST(ε) = {ε}

3. FIRST(αβ) = FIRST(FIRST(α) ◦ FIRST(β))

4. FIRST(A) = FIRST(α1) ∪ FIRST(α2) ∪ . . . ∪ FIRST(αn), če A ::= α1 | α2| · · · | αn

5. FOLLOW(X) = FIRST(β ◦ FOLLOW(A)), če A ::= αXβ (β . . . ε)

1.3.5.1 Kaj je gramatika LL(1)?

Definicija: Gramatika je LL(1), če:

1. za vsako produkcijo A ::= α1 | α2 | · · · | αn velja: ∀i, j : FIRST(αi) ∩ FIRST(αj) = ∅ ∧ i 6= j

2. za vse neterminale A, kjer A⇒∗ ε, velja: FIRST(A) ∩ FOLLOW(A) = ∅

7

Page 9: Pv 3. Kolokvij

Primer:

P ::= Ac | BdA ::= aA | εB ::= bB | ε

FIRST(P) = FIRST(Ac)∪FIRST(Bd) == FIRST(FIRST(A)◦FIRST(c))∪FIRST(FIRST(B)◦FIRST(d))) == {a} ∪ {c} == {a, c}

FIRST(A) = FIRST(aA)∪FIRST(ε) == FIRST((FIRST(a)◦FIRST(A))∪{ε} == {a} ∪ {ε} == {a, ε}

FIRST(B) = ... = {b, ε}

1.3.5.2 Odpravljanje leve rekurzije

Pravilo: Levo rekurzijo v gramatiki odpravimo takole:Produkcijo oblike:

A ::= Aα1 | Aα2 | · · · | Aαm | β1 | β2 | · · · | βnzamenjamo z:

A :: = β1A′ | β2A′ | · · · | βnA′

A′ ::= α1A′ | α2A

′ | · · · | αmA′ | ε

1.3.5.3 Levo faktoriranje

Pravilo: Levo faktoriranje:Produkcijo oblike:

A ::= αβ1 | αβ2 | · · · | αβn

vse alternativne produkcije se pričejo z α ∈ (N ∪ T )

zamenjamo z:

A :: = αA′

A′ ::= β1 | β2 | · · · | βn

Primer: Jezik aritmetičnih izrazov v BNFG = 〈{+, ∗, (, ), a} , {E, T, F} , E, P 〉

E ::= T EEEE ::= + T EE | εT ::= F TTTT ::= * F TT | εF ::= (E) | a

Kako zgradimo rekurzivni navzdolnji razpoznavalnik?Primer v jeziku C++ (del kode za dve produkciji):

8

Page 10: Pv 3. Kolokvij

bool E( ) {return T() && EE( ) ;

}bool EE( ) {

i f ( scanner−>currentToken ( ) . getLexem ( ) == "+" ) {scanner−>nextToken ( ) ;return T() && EE( ) ;

}return true ;

}

1.4 Semantična analiza

• Za opis semantike programskih jezikov običajno uporabljamo naravni jezik.

• Pri sintaksi imamo BNF (standard), a pri semantiki. . .

• Obstaja nekaj formalnih metod: ena izmed njih je atributna gramatika.

• Prednosti formalnih metod:

– nedvoumna določitev pomena

– avtomatiziran postopek generiranja prevajalnika oz. interpreterja

1.4.1 Atributna gramatika

Atributna gramatika je nadgradnja standarizirane kontekstno proste gramatike G, tako da vsaki produkcijipriredimo množico semantičnih funkcij.Vsakemu neterminalu X ∈ N priredimo dve končni množici atributov:

• S(X) – pridobljeni atributi (ang. synthesized attributes)

• I(X) – podedovani atributi (ang. inherited attributes)

Velja še:

• S(X) ∩ I(X) = ∅

• I(X) = ∅ (začetni neterminal gramatike G nima podedovanih atributov)

Atributne gramatike delimo:

• atributne gramatike vrste S

• atributne gramatike vrste L

• neciklične atributne gramatike

• absolutno neciklične atributne gramatike

9

Page 11: Pv 3. Kolokvij

Chapter 2

Programski vzorci, programske paradigme

• Programski vzorec je način konceptualizacije, kako naj strukturiramo program, da z njim rešimo danproblem.

2.1 Razlogi za preučevanje programskih vzorcev

• Povečana sposobnost izražanja zamisli v različnih oblikah

• Naučiti se pomembnih kriterijev za izbiro ustreznih jezikov

• Povečati zmožnost učenja novih jezikov

– Danes se od inženirjev računalništva in informacijskih tehnologij zahteva znanje več naravnih in tudiveč programskih jezikov

• Boljše razumevanje pomembnosti implementacije

– Ta predmet dopolnjuje predmet Prevajanje programskih jezikov

2.2 Domene programiranja

• Aplikacije v znanosti

– Veliko število operacij z realnimi števili (C/C++, Fortran)

• Industrijske aplikacije

– Izdelava poročil, grafov ter uporaba decimalnih števil in znakov

• Umetna inteligenca

– Manipulacija nad simboli (Lisp, Prolog)

• Sistemsko programiranje

– Učinkovitost in fleksibilnost (C, Bash)

• Internetne aplikacije

– Skupina jezikov: označevalni (HTML in XML), skriptni (PHP, JSP) in splošno namenski (Java, C#,Python)

10

Page 12: Pv 3. Kolokvij

2.3 Kriteriji za ocenjevanje jezikov

• Berljivost (ang. Readability): kako enostavno je prebrati in razumeti programe

– Enostavnost– Ortogonalnost– Znane krmilne strukture– Ustrezni podatkovni tipi in strukture– Sintaksa s smiselnimi izrazi

• Zapisljivost (ang. Writability): kako enostavno je program zapisati v programskem jeziku

– Enovstavnost in ortogonalnost∗ Malo število konstruktov, primitivov in mala množica pravil, ki kombinirajo konstrukte in prim-itive

– Podpora abstrakciji∗ Definicija in uporaba kompleksnih struktur in operatorjev na način, da se s podrobnostmi neukvarjamo

– Moč izražanja∗ Množica relativnih načinov za specifikacijo operacij

• Zanesljivost (ang. Reliability): glede na specifikacije (npr.: izvajanje podanih specifikacij)

– Preverjanje tipov (ang. Type checking)– Upravljanje z izjemami (ang. Exception handling)– Sklicevanje (ang. Aliasing)

∗ Prisotnost dveh ali več sklicevalnih načinov za eno in isto pomnilniško lokacijo– Berljivost in zapisljivost

• Cena (ang. Cost): končna celotna cena

– Vzdrževanje, razvijanje, dostopnost prevajalnika, zanesljivost, produktivnost programerjev itd.

2.3.1 Drugi ocenitveni kriteriji

• Prenosljivost (ang. Portability): kako preprosto je prenesti program iz ene na drugo implementacijo

– Java se izvaja na različnih platformah (Linux, Mac OS X, Solaris, Windows)– .NET je omejen le na nekaj platform (Windows, Linux-Mono) toda podpira več jezikov (C#, J#,

VB itd.)

• Splošnost (ang. Generality)

– Aplicirati ga je možno na obsežno področje aplikacij

• Dobra definiranost (ang. Well-definedness)

– Popolnost in natančnost uradne definicije jezika

2.4 Vpliv na načrtovanje jezikov

• Računalniška arhitektura

– Jeziki so se razvijali v osnovi za prevladujočo računalniško arhitekturo, znano kot von Neumannarhitektura

• Metodologije programiranja

– Nove metode razvoja programske opreme (npr.: objektno orientiran razvoj programske opreme)določajo nove programske vzorce. Novi vzorci razširijo obstoječe programske jezike in tako nastajajonovi programski jeziki.

11

Page 13: Pv 3. Kolokvij

2.4.1 Vpliv von Neumann arhitekture

• Imperativni jeziki, kot je recimo C, so najbolj dominantni zaradi direktne preslikave na von Neumannarhitekture

– Podatki in program so shranjeni v pomnilniku

– Pomnilnik je ločen od CPE

– Inštrukcije in podatki se posredujejo iz pomnilnika v CPE

int val , i , array [ 1 0 ] ;for ( i = 0 ; i < 10 ; i++)

va l += array [ i ] ;

2.4.2 Izvajanje strojnega koda

• Cikel: dostaviti, dekodirati in izvršiti (na von Neumann arhitekturi)

Inicializacija programskega števcaneskončna zanka

1) dostava instrukcija na katero kaže programski števec // dostop do pomnilnika2) programski števec se poveča za 13) dekodiranje inštrukcije4) izvajanje inštrukcije // možen dostop do pomnilnika

konec zanke

2.4.3 Modeli programiranja

• Modeli 1. generacije

– Mehanizemsko programiranje: mehanski računalnik - C. Babagge

– Preklopno programiranje: ENIAC - eden prvih elektronskih računalnikov

– Zbirniško programiranje: IBM 701

• Modeli 2. generacije

– Proceduralno orientirano programiranje: procedure

– Objektno orientirano programiranje: podatkovni tipi in hierarhije

– Funkcijsko orientirano programiranje: funkcije

– Logično orientirano programiranje: logika

• Modeli 3. generacije

– Komponentno orientirano programiranje: komponente

– Aspektno orientirano programiranje: aspekti

– Omejeno orientirano programiranje: odnosi med spremenljivkami so navedeni v obliki omejitev

– Vizualno orientirano programiranje: grafično ustvarjanje programov

2.4.4 Vplivi na metodologije programiranje

• 1950 in zgodnja 1960

– Enostavne aplikacije; najbolj pomembna je bila strojna učinkovitost

• Pozna 1960

– Učinkovitost ljudi postaja pomembno; berljivost, boljše krmilne strukture

∗ Strukturirano programiranje

12

Page 14: Pv 3. Kolokvij

∗ Načrtovanje od zgoraj navzdol (ang. top-down) in koračni način razhroščevanja

• Pozna 1970: procesno orientirano do podatkovno orientirano

– Abstrakcija podatkov

• Srednja 1980: objektno orientirano programiranje

– Abstrakcija podatkov + dedovanje + polimorfizem

• Pozna 1990: komponentno orientirano programiranje

– Distribuirane aplikacije

• 2000: aspektno orientirano programiranje (inženirstvo programske opreme)

– Ločevanje zadev (lastnosti)

– Modularnost in enkapsulacija

2.4.5 Vrste programskih jezikov

• Imperativni (ang. Imperative)

– Osnovne značilnosti: spremenljivke, določeni so programski stavki in iteracije

– Primer: C, Pascal

• Funkcijski (ang. Functional)

– Osnova za izvajanje računanja je funkcija nad podanimi argumenti

– Primer: LISP, Scheme

• Logični (ang. Logic)

– Temelječ na določenih pravilih

– Primer: Prolog

• Objektno orientirani (ang. Object-oriented)

– Abstrakcija podatkov, dedovanje, dinamično povezovanje

• Označevalni (ang. Markup)

– Sam po sebi ni programski jezik, toda omogoča oblikovanje Web dokumentov

– Primer: XHTML, HTML

2.4.6 Kompromisi načrtovanja jezikov

• Zanesljivost / cena izvajanja

– Primer: Java pri vsakem dostopu do elementa polja preverja, ali je element dejansko del polja. Takose po eni strani poveča zanesljivost, po drugi strani pa se poveča cena izvajanja.

• Berljivost / zapisljivost

– Primer: APL ime močne operatorje, ki omogočajo kompleksne izračune in kompaktno zapisaneprograme, po drugi strani pa programe, ki so težko berljivi.

• Zapisljivost (fleksibilnost) / zanesljivost

– Primer: C++ kazalci so zelo močni in fleksibilni toda ravno oni povzročajo nezanesljivost programov.

13

Page 15: Pv 3. Kolokvij

2.5 Metode implementacije

• Prevajanje (ang. Compilation)

– Program se prevede v strojni jezik

• Interpretiranje (ang. Interpretation)

– Program se interpretira s pomočjo programa, ki ga imenujemo interpreter

• Hibridna implementacija

– Kompromis med prevajanjem in interpretiranjem

2.5.1 Prevajanje

• Prevajanje visoko-nivojskih programskih jezikov v strojni jezik

• Počasno prevajanje, hitro izvajanje

• Proces prevajanja vsebuje naslednje faze:

– Leksikalna analiza (ang. Lexical analysis): preslikava znakov programa v leksikalne simbole (ang.Tokens)

– Sintaktična analiza (ang. Synctatic analysis): razpoznava pravilnost stavkov oz. zaporedja razpoz-nanih leksikalnih simbolov

– Semantična analiza (ang. Semantic analysis): razumevanje stavkov in ustvarjanje vmesne kode

– Generiranje kode (ang. Code generation): generira se strojna koda (izvedljivi program)

2.5.1.1 Dodatni termini pri prevajanju

• Povezovanje in nalaganje

– Proces zbiranja sistemskih programov (knjižnic) in njihovo povezovanje v uporabniški program

• Nalaganje modula

– Izvedljivi program: združena sistemska in uporabniška koda

2.5.2 Interpretiranje

• Ni prevajanja v strojni jezik

– Izrazi (stavki) se izvajajo neposredno s pomočjo interpreterja

• Enostavnejša implementacija programov (napake v času izvajanja se enostavno in takoj prikažejo)

• Počasnejše izvajanje (od 10 do 100-krat počasnejše izvajanje v primarjavi s programi, ki so prevedeni)

• Ponavadi zahtevajo več prostora

• Pojavljajo se tudi v obliki skriptnih jezikov, ki se izvajajo znotraj spletnih brskalnikov

2.5.3 Pred-procesiranje

• Pred-procesorski makroji definirajo določeno kodo, ki jo lahko uporabljamo v drugih datotekah

• Pred-procesiranje (razširjanje makrojev) se izvaja neposredno pred prevajanjem programa

• Primeri v jeziku C: #include, #define

14

Page 16: Pv 3. Kolokvij

2.5.4 Programska okolja

• Množica razvojnih orodij

• UNIX (Linux)

– Grafična okolja: CDE, KDE, Gnome

• Netbeans

– Integrirano razvojno okolje za Javo

• Microsoft Visual Studio .NET

– Za programiranje v C#, Visual Basic .NET, JScript, C, C++, J#

15

Page 17: Pv 3. Kolokvij

Chapter 3

Tipi in spremenljivke

3.1 Uvod

• Imperativni jeziki so abstrakcije von Neumannove arhitekture

– pomnilnik (kjer se nahajajo programske spremenljivke)

– procesor (ki izvaja programske inštrukcije)

• Spremenljivke so definirane z atributi

– model tipov za jezik mora upoštevati

∗ doseg, življenski cikel, preverjanje tipov, incializacijo∗ združljivost tipov

3.2 Spremenljivke

• Spremenljivka je abstrakcija pomnilniške celice

• Spremenljivke so lahko definirane kot šesterica atributov:

– ime

– naslov

– vrednost

– tip

– življenski cikel

– doseg

• Abstraktna pomnilniška celica – fizična celica ali nabor celic, povezanih s spremenljivko

– Ime → Tip → Naslov/Vrednost

3.2.1 Imena

• Težave pri načrtovanju imen spremenljivk:

– Največja dolžina?

– Ali so povezovalni znaki (npr. “_”) dovoljeni?

– Ali pri imenih razlikujemo med malimi in velikimi črkami, kot v C++/Javi

– Ali so posebne besede rezervirane besede ali ključne besede?

∗ rezerviranih besed ni mogoče uporabiti za imena programskih spremenljivk

• Nekatere spremenljivke nimajo imena (npr. spremenljivke v kopici); anonimni razredi v Javi

16

Page 18: Pv 3. Kolokvij

• Posebne besede: se uporabljajo za izdelavo bolj berljivih programov, s poimenovanjem dejavnosti, ki jihje treba opraviti. Uporabljajo se tudi za ločevanje delov skradnje v programih.

– Ključna beseda je beseda, ki je posebna samo v nekaterih kontekstih, npr. v Fortranu:

∗ Real VarName (Real je podatkovni tip, ki mu sledi ime, zato je Real ključna beseda)∗ Real = 3.4 (Real je spremenljivka)

– Rezervirana beseda je posebna besede, ki je ni možno uporabljati kot uporabniško določeno ime (npr.if in int v Javi)

3.2.2 Atributi spremenljivk

• Naslov – pripadajoč pomnilniški naslov spremenljivke

– spremenljivke imajo lahko različne naslove: ob različnih časih med izvajanjem; na različnih mestih vprogramu

– če se dve imeni spremenljivk lahko uporabita za dostop do iste pomnilniške lokacije, sta to vzdevka

∗ vzdevke ustvarimo prek kazalcev, referenc in C/C++ unij∗ vzdevki so škodljivi za berljivost (bralci programa si morajo zapomniti vse vzdevke)

• Vrednost – vsebina lokacije, s katero je spremenljivka povezana

• Tip – določa razpon vrednosti spremenljivk ter določi operacije, ki so opredeljene nad vrednostmi tehtipov

– primitivni (ali osnovni) podatkovni tipi– uporabniško določeni števni tipi– polja– znakovni nizi– asociativni seznami– zapisi– unije– množice– kazalčni tipi

3.3 Koncept povezljivosti

• primer: int a = 10;

• l-vrednost spremenljivke je njen naslov

• r-vrednost spremenljivke je njena vrednost

• povezljivost je povezava med atributom in entiteto ali med operacijo in simbolom

• čas povezovanja je čas, ob katerem se povezovanje zgodi

3.3.1 Možni časi povezovanja

• med načrtovanjem jezika – povezava simbolov za operatorje z operacijami, npr. znak + v C

• v implementaciji jezika – npr. povezava tipa za realna števila z njegovo predstavitvijo (npr. s predstavitvijood IEEE)

• med prevajanjem – povezava spremenljivke na tip, npr. int count;

• med nalaganjem – npr. povezava FORTRAN 77 spremenljivke s pomnilniško celico (ali statično spre-menljivko v C)

• med izvajanjem – povezava nestatične lokalne spremenljivke s pomnilniško celico, npr. count = count +5;

17

Page 19: Pv 3. Kolokvij

3.3.2 Statična in dinamična povezljivost

• povezava je statična, če se zgodi pred izvajanjem in ostane nespremenjena skozi ves čas izvajanja programa

• povezava je dinamična, če se prvič izvede med izvajanjem ali pa jo je možno spremeniti med izvajanjemprograma

• zgodnje napram poznemu povezovanju – veliko načrtovalskih odločitev glede jezika je odvisnih od časapovezovanja:

– pozno – bolj prilagodljivo

– zgodnje – bolj učinkovito

– zgodnje povezovanje omogoča prevajanje, pozno omogoča interpretiranje

3.3.2.1 Statično povezovanje tipov

• Eksplicitna deklaracija je programski stavek, ki se uporablja za deklaracijo tipov spremenljivk

• Implicitna deklaracija je privzeti mehanizem za določanje tipov spremenljivk (prva pojavitev spremenljivkev programu). FORTRAN, PL/I, BASIC, Javascript in Perl omogočajo implicitne deklaracije

– npr. var ime = “Ime” – spremenljivka tipa niz, v Javascriptu

– npr. $x (scalar), @barve (array), %preglednice (hash) – v Perlu

– prednost: lažji zapis

– slabost: zanesljivost (manj težav pri Perlu)

3.3.2.2 Dinamično povezovanje tipov

• Dinamično povezovanje tipov uporabljajo npr. Ruby, Javascript in PHP

• Izvedeno ob prireditvenem stavku, za npr. Javascript

– seznam = [2, 4.33, 6, 8];

– seznam = 17.3;

– prednost: fleksibilnost (splošnejši programski stavki)

– slabosti:

∗ visoki stroški (dinamično preverjanje tipov in interpretiranje)∗ zaznavanje napak med prevajanjem je oteženo

3.3.3 Atributi spremenljivk

• Izpeljave tipov (ML, Miranda in Haskell). Tipi so določeni iz konteksta reference, npr. v ML:

– fun circumf(r)=3.14*r*r (*vrača realno število*)

• Povezava s pomnilniškim prostorom

– dodelitev – dodelitev pomnilniške celice iz bazena razpoložljivih celic

– sprostitev – sproščanje celic nazaj v bazen

• Življenjski cikel spremenljivke je čas, ko je ta vezana na določeno pomnilniško celico

– statično

– dinamično na skladu

– eksplicitno dinamično na kopici

– implicitno dinamično na kopici

18

Page 20: Pv 3. Kolokvij

3.4 Organizacija pomnilnika

• Statično

– koda in nespremenljivi podatki

• Sklad

– lokalni podatki: zapisi klicev

• Razpoložljiv pomnilnik

• Kopica

– spremenljivi podatki

3.5 Čas povezovanja spremenljivke

• Statična vezljivost

– povezava se sklene “pred” pričetkom izvedbe programa in ostane enaka do zaključka programa– tip in naslov sta nespremenljiva– učinkovitost: pomnilniška lokacija se lahko izračuna ob času prevajanja– je ni možno uporabiti z rekurzijo– primeri:

∗ vse FORTRAN 77 spremenljivke∗ C static spremenljivke

• Dinamično na skladu

– tip je nespremenljiv, naslov je dinamičen– neposredno podpira rekurzijo– učinkovito podprto s skladom v času izvajanja– ni nujno, da je učinkovito kot statična vezljivost– primeri:

∗ lokalne spremenljivke v C podprogramih in Java metodah

• Eksplicitno dinamično na kopici

– prostor je eksplicitno dodeljen/sproščen iz pomnilniškega bazena v času izvajanja– uporabno je za strukture s spremenljivo velikostjo (npr. povezani seznam, sklad)– programiranje kompleksnosti za ohranitev celovitnosti (npr. viseče reference, preverjanje mej polja)– primeri:

∗ dinamično dodeljevanje pomnilnika v C (preko malloc in free)∗ dinamični objekti v C++ (preko new in delete)∗ vsi objekti v Javi

• Implicitno dinamično na kopici

– pomnilniški prostor je dodeljen ob prirejanju vrednosti– zelo fleksibilno– zmanjšana kompleksnost programiranja– režija v času izvajanja (preverjanja mej polja, smetar)– primeri:

∗ vse spremenljivke v APL∗ vsi nizi in polja v Perlu in Javascriptu

19

Page 21: Pv 3. Kolokvij

3.6 Smetar

• skoraj bistven za sisteme z implicitno dinamičnim dodeljevanjem prostora na kopici

• smeti : vse, kar ne izhaja iz znanih korenin

• korenine: trenutni sklad + trenutne povezave spremenljivk

3.7 Implementacija podatkovnih tipov

3.7.1 Podatkovni tipi

• Podatkovni tip sestavljajo: nabor operacij, nizkonivojska predstavitev in množica podatkovnih vrednosti

• Nabor operacij

– za int i; so to +, -, /, *, %

• Nizkonivojska predstavitev

– za int i; je z 32 biti

• Množica podatkovnih vrednosti

– za int i; je od −231 − 1 do 231 pri implementaciji z dvojiških komplementom

• Osnovni podatkovni tipi: tisti, ki niso definirani z drugimi podatkovnimi tipi

• Uporabniško definirani tipi: sestavljeni tipi, ki uporabljajo osnovne podatkovne tipe

• Abstraktni podatkovnii tipi (ADT): uporaba tipa je ločena od predstavitve in množice operacij nad vred-nostmi tega tipa

– implementacija tipa je skrita

– samo vmesnik je objavljen

– primer: ADT seznam je lahko implementiran s poljem ali s povezanim seznamom

3.8 Osnovni podatkovni tipi

• Številčni

– celoštevilski : velikosti predznačnega tipa v Javi so byte, short, int, long

– s plavajočo vejico: IEEE standard 754

– decimalni : v poslovnih aplikacijah: Cobol, C# (razred Decimal), Java (razred BigDecimal). Pred-stavitev je bila BCD.

• Primerjava številskih tipov

– C:

∗ char, unsigned char∗ short int, unsigned short int∗ int, unsigned int∗ long int, unsigned long int∗ ni standardne implementacije, vendar daljši tipi morajo zagotavljati vsaj tolikšen razpon kotkrajši tipi

– Java:

∗ byte (1-zložni predznačen)∗ char (2-zložni nepredznačen)∗ short (2-zložni predznačen)

20

Page 22: Pv 3. Kolokvij

∗ int (4-zložni predznačen)∗ long (8-zložni predznačen)

• logični : lahko implementiran bitno, vendar ponavadi z zlogi, pogosto kot bytes

• znakovni : ASCII ali 16-bitno kodiranje Unicode

• nizovni : osnovni v Javi, C#, Scheme, Ruby, vendar ne v nekaterih jezikih, kot C. Osnovne operacije:

– prirejanje in kopiranje

– primerjava (=, >, itd.)

– konkatenacija

– reference na podnize

– ujemanje vzorcev (z regularnimi izrazi)

3.9 Uporabniško določeni števni tipi

• Števni tip je tak tip, pri katerem je razpon možnih vrednosti moč povezati z množico pozitivnih celihštevil

• Primeri osnovnih števnih tipov v Javi:

– int

– char

– boolean

• Uporabniško določeni števni tipi:

– naštevni tipi

– intervali

3.9.1 Naštevni tipi

• Vse možne vrednosti (poimenovane konstante) so navedene v definiciji

– C#: enum dnevi (pon, tor, sre, čet, pet, sob, ned);

– Težave pri načrtovanju

∗ Ali se naštevna konstanta lahko pojavi v več kot eni definiciji tipa in če, kako se preverja tip tekonstante ob njeni pojavitvi?

∗ —

3.9.1.1 Ovrednotenje naštevnega tipa

• Pripomore k berljivosti: npr. ni nam treba kodirati dneva v tednu kot številke

• Pripomore k zanesljivosti, npr. prevajalnik lahko preveri —

3.9.1.2 Naštevni tipi v Javi

public class PrimerNastevnegaTipa {enum mesec {Jan , Feb , Mar , Apr , Maj , Jun , Jul , Avg , Sep , Okt , Nov , Dec } ;public stat ic void main ( St r ing [ ] a rgs ) {

for (Mesec m : java . u t i l . EnumSet . range (Mesec . Jun , Mesec .Avg ) )System . out . p r i n t l n ( " p o l e t j e ␣ vk l j u cu j e : " + m) ;

}}

21

Page 23: Pv 3. Kolokvij

3.10 Polja

• V poljih shranjujemo elemente istega tipa. Nekaj težav pri načrtovanju:

– veljavnost tipov indeksov– izrazi za izračun indeksov in preverjanje mej– dodeljevanje pomnilniškega prostora– inicializacija– ali je razrez v reže dovoljen

• Indeksni dostop je preslikava iz indeksov v elemente:

– ime_polja(seznam_vrednosti_indeksov) → element

• Sintaksa za dostop preko indeksov

– FORTRAN, PL/I in Ada uporabljajo navadne oklepaje– večina drugih jezikov uporablja oglate oklepaje

• Možni tipi indeksov: cela števila, vrstilni tipi, naštevni tipi

3.10.1 Vezava indeksov in tipi polj

• Statični: intervali indeksov so statično vezani, tudi dodeljevanje pomnilnika je statično (pred pričetkomizvajanja)

– prednost: učinkovitost (ni dinamičnega dodeljevanja)–void proc ( ) {

stat ic int A[ 1 0 ] [ 1 0 ] ;}

• Fiksno naslavljanje na dinamičnem skladu: indeksi so statično vezani, vendar je dodeljevanje prostora na—

–−−−

• Dinamično na skladu: nabori indeksov so dinamično vezani, dodeljevanje prostora je prav tako dinamično(ob času izvajanja)

– prednost: prilagodljivost (velikost polja ni potrebno vedeti pred uporabo tega polha)–

Get ( List_Len )declare L i s t : array ( 1 . . List_Len ) of I n t eg e r

beginend ; ; v j e z i ku ADA

• Nespremenljivo na dinamični kopici : podobno zgornji možnosti: dodeljevanje pomnilnika je dinamično(med časom izvajanja), vendar nespremenljivo pri dodelitvi (npr. povezava je ustvarjena ob zahtevi,prostor je dodeljen iz kopice, ne iz sklada)

–int s i z e ; // java , C#i f ( cond ) s i z e = 100 ;else s i z e = 10 ;int [ ] A = new int [ s i z e ∗ 2 ] ;

• Dinamično na kopici : povezava naborov indeksov in dodeljevanje prostora je dinamično in se lahkopoljubno-krat spremeni

22

Page 24: Pv 3. Kolokvij

– prednost: prilagodljivost (velikost polja lahko med izvajanjem programa povečamo ali zmanjšamo)

– primer:∗

// C#, JavaArrayList i n t L i s t = new a r r ayL i s t ( ) ;. . .i n t L i s t . add ( ob j e c t ) ;

3.10.2 Inicializacija polja

• Nekateri jeziki dovoljujejo inicializacijo ob času dodelitve prostora

– npr. C, C++, Java, C#

∗ int seznam [] = { 4, 5, 7, 83 };

– nizi znakov v C in C++

∗ char ime [] = “Janez”;

– polja nizov v C in C++

∗ char * ime [] = { “Janez”, “Marko”, “Mitja” };

3.10.3 Rezine

• Rezina je podstruktura polja, nič več kot referenčni mehanizem. Podpora v nekaterih jezikih (Fortraj 95).

– Integer, Dimension(3, 3, 3)::Cube

3.10.4 Dostop do večdimenzionalnih polj

• Dvodimenzionalna polja so lahko shranjena v pomnilniku na dva načina:

– urejena po vrsticah (večina jezikov)

– urejena po stolpcih (Fortran)

3.10.5 Deskriptorji v času izvajanja

Enodimenzionalno polje Večdimenzionalno poljePolje Tip elementa

Tip elementa Tip indeksaTip indeksa Število dimenzij

Spodnja meja za indeks Nabor indeksov 1Zgornja meja za indeks . . .

Naslov Nabor indeksov nNaslov

3.10.6 Asociativna polja

• Asociativno polje je neurejen zbir podatkovnih elementov, ki so indeksirani (ključ)

– Uporabniško definirane ključe moramo hraniti

• Načrtovalski vidik: Kakšna naj bo oblika referenc na podatkovne elemente?

• Perl:

– vis_temp = (“Pon” => 32, “Tor” => 33, “Sre” => 31, ...);

– za dostop do elementa uporabimo oklepaje in ključe: vis_temp{”Sre”} = 35;

23