Ark 1 av 18 IN 211 Programmeringsspråk Velkommen til programmeringsspråkenes verden IN 211 Forelesning 20.8.2001
Foreleser Ragnhild Kobro Runde E-post: ragnhilk@ifi.uio.no Kontor: 3345 Treffetid: torsdager 14.30-15.30 Dagens tema Introduksjon til IN 211 Pensum og andre praktiske opplysninger Hva handler kurset om? Hvorfor er det lurt å ta kurset? Generelt om språk Binding (2.2.3) Variables skop, type, levetid og annet (2.3) Forelesning 20.8.2001 Ark 2 av 18
Praktiske opplysninger Undervisning Forelesninger: Mandag 14.15-16 Gruppeundervisning: 1 dobbeltime I tillegg: Selvstudium! (3 vekttall 12 timer i uken?) Obligatorisk oppmøte Oppdatert informasjon http://www.ifi.uio.no/~in211/. Husk nyhetsgruppen: ifi.in211 Forutsetninger IN115 (rekursjon, lister, trær,... ) Lese C-programmer Programmere Java Forelesning 20.8.2001 Ark 3 av 18
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. Kristoffersen: Funksjonell programmering i standard ML, kompendium 61. Kan leses og skrives ut fra kursets hjemmeside. I tillegg: Forelesninger, obligatoriske oppgaver og ukeoppgaver. Forelesning 20.8.2001 Ark 4 av 18
Hvorfor så mange språk? Hvorfor lager man ikke ett godt språk og er ferdig med saken? IBM prøvde seg i 1964 med PL/I som er kjent for at den tillot IF THEN = ELSE THEN ELSE = THEN+1 ELSE THEN = ELSE; Det er gode grunner til at det er mange språk: Oppgavene er ulike i størrelse, kompleksitet samt hva slags problem som skal løses. Det er forskjellige krav til hastighet, plass, sikkerhet,... Programmerere er ulike! Informatikken er ennå en ung vitenskap. Forelesning 20.8.2001 Ark 5 av 18
I IN 211 vil vi ta for oss hvordan man beskriver et språk hva som skjer bak kulissene eksempler på ulike typer språk: Perl skript- og søkespråk Logla prosedyrespråk ML funksjonelt språk Prolog logisk språk og litt om diverse andre språk. Dessuten vil dere få trening i å programmere Java. Forelesning 20.8.2001 Ark 6 av 18
Binding Programmer består av entiteter med tilhørende attributter (egenskaper). Eksempler: En variabel haretnavnogentype. En rutine har et navn og formelle parametre (med typer). En setning har assosierte aksjoner. Det å sette verdien til en slik attributt kalles binding. Dette kan skje på fire stadier: Forelesning 20.8.2001 Ark 7 av 18
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: Implementatøren foretar et valg. Eksempel: I C er det ikke angitt hvor mange byte som trengs til en int. Under kompileringen: Betydningen kan endre seg fra program til program, men vil være konstant hele tiden programmet kjøres. Eksempel: I Pascal er typen Integer predefinert, men kan redefineres i et program. Under kjøring: Definisjonen kan endre seg mange ganger under kjøringen. Eksempel: En variabels verdi vil endre seg. De tre første bindingene kalles statiske bindinger, den siste kalles dynamisk binding. Forelesning 20.8.2001 Ark 8 av 18
Hva er en variabel? Sett fra en programmerers synspunkt, har en variabel følgende egenskaper: navn skop levetid type adresse i lageret verdi Navn En variabel får navnet i en deklarasjon. Noen språk (som Perl) krever ingen eksplisitt deklarasjon; de har en implisitt deklarasjon. Forelesning 20.8.2001 Ark 9 av 18
Skop Enhver deklarasjon har sitt skop, dvs. den delen av programmet hvor den er synlig. Enhver forekomst er kun i skopet til én deklarasjon med samme navn. Skrives det ut 1 eller 2? #include <stdio.h> int x = 1; void f() { printf("x = %d\n", x); } int main() { int x = 2; f(); } Forelesning 20.8.2001 Ark 10 av 18
Språkets skopregler forteller hva skopet er. De vanligste er: C Skopet starter ved deklarasjonsstedet. Simula Skopet starter ved begin i blokken. Java Som C for lokale variable og som Simula for metoder og klasser. Perl Som C for variable og som Simula for funksjoner. Alle disse språkene (unntatt Perl) har statisk skop. Alle disse skopene varer til blokkens avslutning (med end eller }). For alle språkene gjelder at lokale redeklarasjoner kan gi «hull» i skopet. Forelesning 20.8.2001 Ark 11 av 18
Skop fra deklarasjonsstedet #! /local/bin/perl -w $x = 1; if ($x > 0) { print "x = $x\n"; my $x = 2; print "x = $x\n"; } print "x = $x\n"; exit 0; En kjøring gir følgende utskrift: x= x= x= Forelesning 20.8.2001 Ark 12 av 18
Skop i hele blokken begin integer x = 1; begin procedure P1; begin OutText("x = "); OutInt(x, 0); OutImage; end P1; integer x = 2; P1; end; OutText("x = "); OutInt(x, 0); OutImage; end Resultatet av kjøringen: x= x= Forelesning 20.8.2001 Ark 13 av 18
Problem 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(...)... } Forelesning 20.8.2001 Ark 14 av 18
Dynamisk skop Noen språk har dynamisk skop, med regelen: En forekomst binder til den sist evaluerte deklarasjon som ikke er avsluttet (med end eller }). Eksempel: Perl har både statisk skop (med my) og dynamisk skop (med local). #! /local/bin/perl -w sub skriv_x { print "x = $x\n"; } sub p_statisk { my $x = 2; skriv_x(); } sub p_dynamisk { local $x = 3; skriv_x(); } $x = 1; skriv_x(); p_statisk(); p_dynamisk(); exit 0; Resultatet blir: x= x= x= Forelesning 20.8.2001 Ark 15 av 18
Levetid En variabels levetid er den tiden den opptar plass i lageret. Dette er normalt den tiden programmet er i variabelens skop, men det er unntak: En variabel lever selv om den midlertid er skjult av en annen variabel. Noen språk har nøkkelord som gir utvidet levetid (som static i Java og C). Ved å bruke dynamisk allokering (new ijava,malloc i C) får brukeren full kontroll over levetiden. Type En variabels type angir et sett av verdier og mulige operasjoner på disse. Mer om typer neste uke! Forelesning 20.8.2001 Ark 16 av 18
Adresse i lageret («l-value») Hvor en variabel plasseres i lageret er oftest dynamisk bestemt. (Mer om dette senere i kurset.) Verdien («r-value») En variabels verdi er det mest dynamiske vi har, men selv der finnes unntak: I noen språk kan man definere konstanter som er kjent under kompileringen (som #define i C). Noen språk kan «fryse» en variabel slik at verdien siden ikke endres (som final ijava). Forelesning 20.8.2001 Ark 17 av 18
Initialverdi Hvilken verdi har en variabel når den opprettes? Noen muligheter: en tilfeldig verdi (gitt av hva som lå der før) en fast verdi (0 i Simula) en initialverdi må alltid oppgis (Modula-3) det er umulig å bruke en variabel før den har fått en verdi (Java) Forelesning 20.8.2001 Ark 18 av 18