0) { r = m % n; m = n; n = r; }; printf("gcd = %u\n", m); printf("Enter values m and n: "); }"> 0) { r = m % n; m = n; n = r; }; printf("gcd = %u\n", m); printf("Enter values m and n: "); }">

Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

Ohjelmointikielet ja ohjelmointi Tietotekniikan perusteet 20.10.1998 Pekka Orponen.

Samankaltaiset esitykset


Esitys aiheesta: "Ohjelmointikielet ja ohjelmointi Tietotekniikan perusteet 20.10.1998 Pekka Orponen."— Esityksen transkriptio:

1 Ohjelmointikielet ja ohjelmointi Tietotekniikan perusteet 20.10.1998 Pekka Orponen

2 Tietokone ja konekieli Tyypillinen von Neumann (EDVAC) -tyyppinen arkkitehtuuri: Konekieliohjelma  muistin alkutila, jonka ohjaamana tietokone suorittaa tehtävänsä Esitys: bittijonoja, 1 per käytetty muistipaikka Symbolinen konekieli (engl. assembly language): konekielen käskyille annettu mnemonisia (”muistikkaita”) nimiä: LDA, STA, ADD,… Assembler: ohjelma, joka kääntää syötteenä annetun symb. konekieliohjelman konekoodiksi Arkkitehtuurin ja konekielen tasolla tietokoneet muuttuneet melko vähän 50 vuodessa; suuret muutokset (a) piiriteknologiassa, (b) korkean tason ohjelmointimenetelmissä

3 Korkean tason ohjelmointi Algoritmi: täsmällinen kuvaus jonkin (laskenta)tehtävän suoritustavasta. Ohjelma: Algoritmin esitys jollakin tietokoneella suoritettavissa olevalla ohjelmointikielellä. Esim. Eukleideen algoritmi (n. 300 eKr) kahden ei- negatiivisen kokonaisluvun s.y.t:n määrittämiseksi: Olkoot luvut m ja n. 1. Jos n = 0, niin tulos on s.y.t. = m 2. Jos n  0, niin: olkoon r jakolaskun m/n jakojäännös aseta m = n, n = r, ja palaa kohtaan 1. Algoritmin esitys C-ohjelmointikielellä: main() { int m, n, r; printf("Enter values m and n: "); while (scanf("%u %u", &m, &n) != EOF) { while (n > 0) { r = m % n; m = n; n = r; }; printf("gcd = %u\n", m); printf("Enter values m and n: "); }

4 Korkean tason ohjelmien toteuttaminen Korkean tason kielellä (C tms.) kirjoitetun ohjelman suorittamiseen koneella on kaksi tapaa: –Kääntäminen: käännösohjelma (engl. compiler) saa syötteenä korkean tason ohjelman, tuottaa vastaavan konekoodin, joka voidaan suorittaa –Tulkitseminen: tulkkiohjelma (engl. interpreter) saa syötteenä korkean tason ohjelman ja ”jäljittelee” sen tarkoitettua toimintaa käsky käskyltä Vertailua: –Kääntäminen: tavallisin menettely +nopea tuloskoodi (jos hyvä kääntäjä) –hyvien kääntäjien tekeminen vaikeaa –Tulkitseminen: erikoistapauksissa, pikkutöissä +joustava menettely, tulkkeja helppo kirjoittaa erikoisillekin ohjelmointikielille –suoritus hidasta

5 C-ohjelman käännös ja suoritus tukki> cat gcd.c #include main() { int m, n, r; printf("Enter values m and n: "); while (scanf("%u %u", &m, &n) != EOF) { while (n != 0) { r = m % n; m = n; n = r; }; printf("gcd = %u\n", m); printf("Enter values m and n: "); } tukki> gcc -o gcd.o gcd.c tukki> gcd.o Enter values m and n: 12 16 gcd = 4 Enter values m and n: 18 15 gcd = 3 Enter values m and n: 123 456 gcd = 3 Enter values m and n: 1234567 1234568 gcd = 1 Enter values m and n: ^D tukki>

6 Kääntäjän toiminta Kääntäjä mm.: –asettaa ohjelman muuttujat vastaamaan tiettyjä koneen muistipaikkoja (”tilanvaraus”) –huolehtii että tietyllä ohjelman suoritushetkellä aktiiviset muuttujat ovat rekistereissä (”rekisterien allokointi”) –toteuttaa ohjelman ohjausrakenteen konekooditasolla

7 Esimerkkikäännös C  MIX C-ohjelma, joka laskee syötteestä n arvon m = 2^n: scanf("%u", &n); m = 1; while (n != 0) { m = 2 * m; n = n - 1; }; printf("%u\n", m); Vastaava MIX-koodi (n ~ mp. 100, m ~ mp. 101): 0000 IN 0100/* scanf("%u", &n);*/ 0001 ENTA 1/* m = 1; */ 0002 STA 0101 0003 LDA 0100/* while (n != 0)*/ 0004 JAZ 0012 0005 STA 0100 0006 LDA 0101/* { m = 2 * m;*/ 0007 MUL 0102 0008 STX 0101 0009 LDA 0100/* n = n - 1; }*/ 0010 DECA 1 0011 JMP 0004 0012 OUT 0101/* printf("%u\n", m);*/ 0013 CON 0... 0100 CON 0 0101 CON 0 0102 CON 2

8 Korkean tason ohjelmointikieliä Kirjallisuudessa ehdotettu useita kymmeniä (satoja?), vain muutama vakiintunut käyttöön: FORTRAN (1956) Algol (1958)COBOL (1959)BASIC (1964) Simula I (1965) Simula 67 (1967)Pascal (1973)C (1973) PL/I (1965) Ada (1977) C++ (1985) Java (1996) LISP (1958) APL (1972) Prolog (n. 1972)

9 FORTRAN Ensimmäinen versio 1956 (John Backus/IBM), uudempia 1977, 1990,… Edelleen luonnontieteiden ja tieteellisen laskennan valtakieli Eukleideen algoritmi FORTRANilla: program GCD integer m, n, r 10 print *, 'Please give values for m and n' read *, m, n 20 if (n.eq. 0) go to 30 r = mod(m,n) m = n n = r go to 20 30 print *, 'gcd = ', m go to 10 end

10 BASIC Ohjelmoinnin opettelun helpottamiseen suunniteltu kieli (J. Kemeny/T. Kurtz 1964). (Liiankin helppo: huono pohja ohjelmistosuunnittelulle.) Käyttötarkoituksen takia yleensä vuoro- vaikutteisesti tulkattu kieli, vaikka on helppo kääntääkin. Kehittyneempi versio edelleen käytössä esim. Visual Basic -ohjelmointiympäristössä. Eukleideen algoritmi BASICilla: 10 print "Please give values for m and n" 20 input m, n 30 if n = 0 then 80 40 let r = m mod n 50 let m = n 60 let n = r 70 goto 30 80 print "gcd = ", m 90 goto 10 100 end

11 LISP Rekursiivisiin funktiomäärittelyihin perustuva omalaatuinen ohjelmointikieli (John McCarthy 1958). Yleensä tulkattu, vaikka kääntäjiäkin on. Edelleen tekoälyohjelmoinnin ykköskieliä. Myös esim. Emacs-editori on kirjoitettu LISPillä, ja jopa sisältää LISP-tulkin. Eukleideen algoritmin rekursiivinen versio: Olkoot luvut m ja n. 1. Jos n = 0, niin tulos on syt(m,n) = m. 2. Jos n  0, niin syt(m,n) = syt(n, m mod n). Vastaava LISP-ohjelma: (defun gcd (m n) (cond ((equal n 0) m) (t (gcd n (mod m n))))) Suoritus: (gcd 12 16) 4 (gcd 123 456) 3

12 Prolog Loogisten predikaattien määrittelyihin ja toteutuvuuskyselyihin perustuva tekoälykieli (R. Kowalski, A. Colmerauer ym. ~1972). Esim. Eukleideen algoritmia varten määritellään predikaatti gcd(M,N,D)  ”M:n ja N:n s.y.t. on D” ehdoilla:  M: gcd(M,0,M); ja  M,N>0,D: gcd(N, M mod N, D)  gcd(M,N,D). Kun nyt M ja N on annettu, voidaan etsiä arvot D, joilla ehto gcd(M,N,D) on voimassa. Prolog-ohjelmana: ´ gcd(M,0,M). gcd(M,N,D) :- N > 0, R is M mod N, gcd(N,R,D). Suoritus: ?- gcd(12,16,D). D = 4; no ?- gcd(123,456,D). D = 3; no

13 Ohjelmien oikeellisuus Ohjelmien laatijoille sattuu tunnetusti virheitä. Jotta voitaisiin olla varmoja siitä, että ohjelma todella tekee mitä pitää, ohjelma pitäisi todistaa oikeaksi. Tämä on periaatteessa mahdollista (tietyin rajoituksin), mutta käytännössä hyvin hankalaa. Formaalien oikeellisuustodistusten merkitys on lisääntymässä ”hankalissa” tai ”kriittisissä” ympäristöissä toimivien ohjelmien kohdalla (tietoliikenneprotokollat, reaaliaikajärjestelmät jne.)

14 Potenssiinkorotusalgoritmin oikeellisuus Algoritmi ”pseudokoodina”: –Syöte: kokonaisluku n  0. –Algoritmi: m  1, i  n while i > 0 do m  2*m i  i-1 output m. Oikeellisuusväitteet: (i) Algoritmin suoritus päättyy kaikilla n  0. (ii) Algoritmin palauttama arvo on m = 2 n. Väite (i) on voimassa, koska silmukkamuuttujan i arvo on ei-negatiivinen kokonaisluku, jota pienennetään jokaisella silmukan suorituskerralla. Tämä on mahdollista vain äärellisen monta kertaa. Väitteen (ii) todistus perustuu siihen, että while- silmukan suorittaminen säilyttää seuraavan silmukkainvariantin: muuttujien m ja i arvot silmukan kunkin suorituskerran alussa toteuttavat ehdon: I = {m*2 i = 2 n }.

15 Potenssinkorotuksen oikeellisuus (yksityiskohtia) Tarkastellaan ohjelman toimintaa annetulla syötteellä n. Huomataan, että ennen while-silmukan suoritusta muuttujien m ja i arvot toteuttavat ehdon P 0 = {m = 1, i = n}, ja tavoitteena on osoittaa, että silmukan suorituksen jälkeen muuttujan m arvo toteuttaa ehdon P 1 = {m = 2 n }. Tämä voidaan todeta osoittamalla, että jokainen silmukan suorituskerta pitää voimassa muuttujien suhdetta koskevan silmukkainvariantin I = {m*2 i = 2 n }. Ehto I on nimittäin selvästi voimassa silmukan suorituksen alussa (P 0  I) ja yhdessä silmukan lopetusehdon {i = 0} kanssa se takaa halutun lopputuloksen (I & {i = 0}  P 1 ). Oletetaan siis, että muuttujien m ja i arvot toteuttavat ehdon I silmukan jonkin suorituskerran alussa. Silmukan rungossa muuttujille sijoitetaan uudet arvot m’ = 2*m ja i’ = i-1. Mutta tällöin myös nämä uudet arvot toteuttavat ehdon I: m’*2 i’ = (2*m)*2 i-1 = m*2 i = 2 n. Siten jokainen silmukan suorituskerta säilyttää invariantin I.

16 Eukleideen algoritmin oikeellisuus Algoritmi ”pseudokoodina”: –Syöte: kokonaisluvut m 0, n 0  0. –Algoritmi: m  m 0, n  n 0 while n > 0 do r  m mod n m  n n  r return m. Oikeellisuusväitteet: (i) Algoritmin suoritus päättyy kaikilla m 0, n 0  0. (ii) Algoritmin palauttama arvo on syt(m 0, n 0 ) Väite (i) voidaan todistaa tarkastamalla, että jos n>0, niin silmukan suoritus pienentää n:n arvoa. (Koska 0  m mod n < n.) Väite (ii) seuraa soveltamalla seuraavaa silmukkainvarianttia: muuttujien m ja n arvot silmukan kunkin suorituskerran alussa toteuttavat ehdon: syt(m, n) = syt(m 0, n 0 ). [Invariantin säilymistodistus HT.]


Lataa ppt "Ohjelmointikielet ja ohjelmointi Tietotekniikan perusteet 20.10.1998 Pekka Orponen."

Samankaltaiset esitykset


Iklan oleh Google