Forelesere Velkommen til programmeringsspråkenes verden IN211 Ragnhild Kobro Runde e-post: ragnhilk@ifi.uio.no Kontor: 3345 Gerhard Skagestein e-post: gerhard@ifi.uio.no Kontor: 3402 IN211-Innledning-1 IN211-Innledning-2 Praktiske opplysninger Faglige forutsetninger Undervisning Forelesninger: Mandager 1415 1600 Gruppeundervisning: 1 dobbeltime Første gruppetimer: Tirsdag 27. august I tillegg: Selvstudium! (3 vekttall 12 timer i uken) Oppdatert informasjon http://www.ifi.uio.no/in211/ Husk nyhetsgruppen: ifi.in211 IN115 (rekursjon, lister, trær, ) Kunne programmere Java Kunne lese litt C Kunne skrive enkel PHP (INF102) IN211-Innledning-3 IN211-Innledning-4
er hentet fra Pensum Ghezzi & Jazayeri: Programming language concepts (tredje utgave) John Wiley & Sons, 1998 Krogdahl & Ore: Om syntaks og syntaksanalyse, kompendium 47. Kan kjøpes i bokhandelen Bjørn Kristoffersen: Funksjonell programmering i standard ML, kompendium 61. Kan leses og skrives ut fra kursets hjemmeside. I tillegg: Forelesninger, obligatoriske oppgaver og ukeoppgaver I IN211 vil vi ta for oss Hvordan man beskriver et språk Hva som skjer bak kulissene Eksempler på ulike typer språk: o PHP: Skriptspråk o Java: Prosedyrespråk, objektorientert språk o ML: Funksjonelt språk o Prolog: Logisk språk o pluss litt om diverse andre språk IN211-Innledning-5 IN211-Innledning-6 Programvare må være pålitelig o Skrivbarhet o Lesbarhet o Enkelhet o Sikkerhet o Robusthet Språkkvaliteter Klassifikasjon av programmeringsspråk Beregningsmodell (computational model) logisk funksjonell Programvare må være vedlikeholdbar o Faktorerbarhet o Lokalitet imperativ abstrakte datatyper klasser og objekter moduler Programorganisering (modulariseringsprinsipp) Programvare må kjøre effektivt o Optimaliserbar Jf. Ghezzi & Jazayeri avsnitt 1.5 IN211-Innledning-7 IN211-Innledning-8
Neumann-arkitektur og programmeringsspråk Programmerernes behov Neumann-abstraksjoner Binærkoding Assemblerkoding Høynivåkoding Programmeringsspråk 1 Programmeringsspråk 2 Programmeringsspråk 3 abstraksjoner 0010 0101 0000 0111 1100 0101 1110 setacc 0; add 3; add 7; add 12; add 5; store R;// ord 1110 R = 3+7+12+5; Inn/ut Lager CPU Hent instruksjon Utfør instruksjon Lagre resultat buss IN211-Innledning-9 Instruksjonssett: 0010 setacc add 0101 store IN211-Innledning-10 Regneark Andre abstraksjonsparadigmer Funksjonell programmering ML: fun fact(0) =1 fact(n) = nfact(n-1); Logisk programmering PROLOG: loves(vincent,mia). loves(marcellus,mia). jealous(x,y) :- loves(x,z), loves(y,z).?- jealous(marcellus,w). Hvorfor flere paradigmer? Analyse- og designparadigmet bør være tilpasset problemet o Oppgavene er ulike i størrelse, kompleksitet samt hva slags problem som skal løses Programmeringsomgivelsene må passe til behovene o Det er ulike krav til hastighet, plass, sikkerhet, o Programmerere er ulike! Run-time-system Dersom analyse- og designparadigmet ligger nært programmeringsspråkparadigmet, blir programmeringen enkel I motsatt fall må programmet også implementere konsepter i analyse- og design-paradigmet IN211-Innledning-11 IN211-Innledning-12
Model Driven Architecture eksekverbar UML Syntaks vs. semantikk : RegistreringsVindu : KursRegistrering kurstilbudet : kurset : Kurs : Student KursTilbud 1: "Angi kurs" 2: MeldPåKurs(student, kurs) 3: GyldigKurs(kurs) 4: [gyldigkurs=true] ErKursetFullt() 5: [ErKursetFullt = false] ForutsetterKurs() : Påmelding 6: KursSomForutsettes 7: [ForutsetterKurs=false] new(student, kurset) 8: ØkAntallP åmeldt() 9: MeldPåKurs=true 10: "Studenten er påmeldt" Kurs Student kurskode navn navn adresse vekttall forutsetterkurs() 1 kursdeltaker 1 KursTilbud semester Påmelding forelesningsplan gruppe antallplasser 1 antallpåmeldt økantallpåmeldt() erkursetfullt() kompilering Forutsetter + andre UMLdiagrammer Syntaks o Språkets alfabet o Regler for hvordan symbolene i dette alfabetet skal settes sammen Semantikk o Meningsinnholdet i programteksten Java (?) Run-time-system Syntaksen er den enklere delen av et programmeringsspråk. Semantikken er mer komplisert, og skjuler gjerne de virkelig betydningsfulle forskjellene mellom språkene. IN211-Innledning-13 IN211-Innledning-14 Binding Eksempler på bindinger Programmer består av entiteter med tilhørende attributter (egenskaper) Eksempler: o En variabel har et navn og en type o En rutine har et navn og formelle parametre (med typer) o En setning har assosierte aksjoner I språkdefinisjonen: Betydningen angis i språkets definisjon Eksempel: I Java representerer int et heltall som er et kjent matematisk begrep. Dermed vet vi hvordan +, etc. skal oppføre seg I implementasjonen: Implementøren foretar et valg. Eksempel: I C er det implementasjonen som bestemmer hvor mange byte som brukes for en int. Å sette verdien til et slikt attributt kalles binding Binding kan skje på fire stadier o I språkdefinisjonen o I implementasjonen av språket o Ved kompilering o Under kjøring Statiske bindinger Dynamisk binding Under kompileringen: Betydningen kan endres fra program til program, men er konstant så lenge programmet kjøres. Eksempel: I Pascal er typen Integer predefinert, men den kan redefineres i et program Under kjøring: Betydningen kan endres under kjøring Eksempel: I PHP kan typen for en variabel endres under kjøring IN211-Innledning-15 IN211-Innledning-16
Variabler og deres semantikk En variabel følgende egenskaper (sett fra en programmerers synspunkt) o Navn o Skop o Levetid o Type o Adresse i lageret o Verdi Navn En variabel får navn i en deklarasjon Eksempler på deklarasjoner int antall; Integer antall; Noen språk (som PHP, FORTRAN) krever ingen eksplisitt deklarasjon. Variablen blir deklarert implisitt første gang den påtreffes. Tilsvarende betraktninger gjelder også for funksjoner IN211-Innledning-17 IN211-Innledning-18 Skop Skopregler Enhver deklarasjon har sitt skop Skopet er den delen av programmet der deklarasjonen er synlig Hvilke deler skopet omfatter, bestemmes av språkets skopregler Språk C Skopet for variabler fra deklarasjonsstedet til avslutningen på blokken Skopet for funksjoner, metoder og klasser fra deklarasjonsstedet til avslutningen på blokken Enhver forekomst av en variabel kan kun være i skopet til én deklarasjon med samme navn Simula Java blokken fra deklarasjonsstedet til avslutningen på blokken blokken blokken PHP fra deklarasjonsstedet til avslutningen av funksjonen/scriptet(dynamisk) hele scriptet Lokale redeklarasjoner kan gi hull i skopet IN211-Innledning-19 IN211-Innledning-20
Skop fra deklarasjonsstedet - C #include<stdio.h> int x = 1; void f( ) { printf("x=%d\n", x); int main( ) { int x = 2; f( ); Skrives det ut 1 eller 2? Problemer med skop à la C Hvordan kan to funksjoner kalle hverandre når de først er kjent etter deklarasjonen? Løsningen er å tillate separat deklarasjon av signaturen float f2(int a, int b); int f1(float x){ f2(, ) float f2(int a, int b) { f1( ) IN211-Innledning-21 IN211-Innledning-22 begin integer x = 1; Skop i hele blokken Simula begin procedure P1; begin OutText("1. x="); OutInt(x,0); OutImage; end P1; integer x=2; P1; end; OutText("2. x="); OutInt(x,0); OutImage; end Hva skrives ut? Dynamisk skop: En forekomst binder til den sist evaluerte deklarasjon som ikke er avsluttet (med funksjonsavslutning eller avslutning på scriptet) Dynamisk skop - PHP <?php $pi = 3.1415; $x = 1; print ("1. x=".$x."<br>"); function skrivnoe( ) { print ("4. x=".$x."<br>"); $x=omkrets(3); print ("5. x=".$x."<br>"); print ("2. x=".$x."<br>"); $x=2; print ("3. x=".$x."<br>"); skrivnoe( ); function omkrets($r) { global $pi; return $r$pi; print ("6. x=".$x."<br>");?> IN211-Innledning-23 IN211-Innledning-24
Levetid Type En variabels levetid: Den tiden den opptar plass i lageret. Faller vanligvis sammen med tiden programmet er i variablens skop. En variabels type: Angir et sett av mulige verdier og mulige operasjoner på disse De fleste språk har statisk typing typen bindes ved kompilering Unntak: o En variabel lever selv om den er midlertidig skjult av en annen variabel med samme navn Noen språk har dynamisk typing typen kan forandres under kjøring (eks.: PHP) Hvordan beskrives typen ved implisitte deklarasjoner? o Noen språk har nøkkelord som gir utvidet levetid (som static i C, Java og PHP) o Ved å bruke dynamisk allokering (new i Java, malloc i C) får programmereren full kontroll over levetiden o PHP: Dynamisk typing skal ikke angi noen type o FORTRAN: Typen bestemmes ut fra første bokstav i variabelnavnet IN211-Innledning-25 IN211-Innledning-26 Variablers l-verdi og r-verdi Initialverdi y = x + 2; Hvilken verdi har en variabel når den opprettes? På venstre side av tilordningsoperatoren står y for lagerplassen for y kalt y s l-verdi På høyre side står x for verdien som er lagret i x kalt x s r-verdi I de fleste programmeringsspråk er evalueringen av x, som gir verdien som er lagret i x, implisitt Literaler, som for eksempel 2, har ingen l-verdi og kan derfor ikke stå på venstre side av tilordningsoperatoren Noen språk (for eksempel C) inneholder konstruksjoner som tillater l-verdier på høyre side av tilordningsoperatoren: y = &x; Noen muligheter: o En tilfeldig verdi (gitt av hva som lå i lageret fra før) o En fast verdi (0 i Simula) o En initialverdi må alltid oppgis (Modula-3) o Det er umulig å bruke en variabel på høyre side av tilordningsoperatoren og som argument til metoder før den har fått en verdi (Java) IN211-Innledning-27 IN211-Innledning-28