Strukturering av programmer

Like dokumenter
INF1010 våren 2017 Onsdag 25. januar. Litt om unntak i Java

Innhold. Forord Det første programmet Variabler, tilordninger og uttrykk Innlesing og utskrift...49

Oversikt. Introduksjon Kildekode Kompilering Hello world Hello world med argumenter. 1 C programmering. 2 Funksjoner. 3 Datatyper. 4 Pekere og arrays

INF1010 våren 2018 tirsdag 23. januar

Læringsmål for forelesningen

INF1010 våren 2019 Onsdag 30. januar. Mer om unntak i Java (med litt repetisjon av I/O først)

Kapittel 11: Unntakshåndtering. Java som første programmeringsspråk

Kapittel 11: Unntakshåndtering. Java som første programmeringsspråk

INF 1010, vår 2005 Løsningsforslag uke 11

Ark 1 av 18. programmeringsspråkenes. Velkommen til IN 211. verden. IN 211 Programmeringsspråk

Videregående programmering 6

Kapittel 13: Unntakshåndtering

Kapittel 8: Programutvikling

Kapittel 1 En oversikt over C-språket

Kapittel 13: Unntakshåndtering

Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

Generiske mekanismer i statisk typede programmeringsspråk

Del 4 Noen spesielle C-elementer

TDT4100 Objektorientert programmering

Jentetreff INF1000 Debugging i Java

Løse reelle problemer

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

INF1010 våren Arv og subklasser - del 2

IN 147 Program og maskinvare

Velkommen til INF2100

Oversikt. Informatikk. INF1000: Grunnkurs i objektorientert programmering. Utenom INF1000 Informasjon & hjelp

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

Anatomien til en kompilator - I

Bakgrunnen for INF2100. Velkommen til INF2100. Prosjektet. Hva gjør en kompilator?

INF3110 Programmeringsspråk. Velkommen til kurset INF 3110/4110. Programmeringsspråk 1/24

INF 3110/4110. Velkommen til kurset. Programmeringsspråk. Først det praktiske

D Feilhåndtering og unntaksklasser

Dagens tema: 12 gode råd for en kompilatorskriver

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 14.

2 Om statiske variable/konstanter og statiske metoder.

Repitisjonskurs. Arv, Subklasser og Grensesnitt

Innhold uke 7. Objektorientert programmering i Python: Introduksjon. Lite tilbakeblikk: Programflyt og skop. Lite tilbakeblikk: Funksjoner er uttrykk

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

INF 1000 høsten 2011 Uke september

INF1000 undervisningen INF 1000 høsten 2011 Uke september

Semantikk. Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7) Semantikk. Semantikk. En måte å svare på: gi semantikken til språket!

Introduksjon til objektorientert programmering

Plan: Parameter-overføring Alias Typer (Ghezzi&Jazayeri kap.3 frem til 3.3.1) IN 211 Programmeringsspråk

Klasser skal lages slik at de i minst mulig grad er avhengig av at klienten gjør bestemte ting STOL ALDRI PÅ KLIENTEN!

Programmeringsspråket C

Inf1010 Våren Feilsituasjoner og unntak i Java. Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

Inf1010 Våren Feilsituasjoner og unntak i Java. Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

Forklaring til programmet AbstraktKontoTest.java med tilhørende filer Konto.java, KredittKonto.java, SpareKonto.java

Hvordan skrive Flok og Flass kode? I mange tilfelle er det svært enkelt:

Oversikt. Feil i programmet hva skjer? Array indeks utenfor sine grenser. Inf1010 Våren Feilsituasjoner og unntak i Java

INF3110 Programmeringsspråk. Dagens tema. Typer (Kapittel 3 frem til ) Innføring i ML (Kapittel & ML-kompendiet.) 1/19

Typer. 1 Type: boolean. 2 Verdimengde: {true, false} 3 Operatorer: NOT, AND, OR... 1/19. Forelesning Forelesning

Kjøresystemer. Hva er et kjøresystem? Den abstrakte maskinen SIMPLESEM (2.6) Klassifisering av språk: Parametre (2.7.7) Statiske språk (

Litt om Javas class-filer og byte-kode

Del 1 En oversikt over C-programmering

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

Datatyper og typesjekking

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 15.

Innhold Forst a program

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

Hvorfor objektorientert programmering? Objektorientert programmering i Python: Introduksjon. Læringsmål uke 7. Undervisning og pensum IN1000

Del 3: Evaluere uttrykk

Læringsmål uke 7. Objektorientert programmering i Python: Introduksjon. Innhold uke 7. Lite tilbakeblikk: Programflyt og skop

Leksjon 7. Filer og unntak

Introduksjon til programmering og programmeringsspråk. Henrik Lieng Høgskolen i Oslo og Akershus

Dagens tema. Hva er kompilering? Anta at vi lager dette lille programmet doble.rusc (kalt kildekoden): Hva er kompilering?

INF Repetisjon: Hvordan bygge treet og analysere? 8. september Typisk situasjon. De problematiske syntaks-diagrammene

Operativsystemer og grensesnitt

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Eivind Storm Aarnæs

Beskrivelse av programmeringsspråket Compila15 INF Kompilatorteknikk Våren 2015

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

ADT og OO programmering

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Forelesning inf Java 4

2 Om statiske variable/konstanter og statiske metoder.

Eksekveringsrekkefølgen (del 1) Oppgave 1. Eksekveringsrekkefølgen (del 2) Kommentar til oppgave 1. } // class Bolighus

156C. Algoritmer og maskinspråk. IT1101 Informatikk basisfag. Maskinspråk: det maskinen forstår. Assembler / assemblerspråk

IN 211 Programmeringsspråk. Java. på 20 enkle ark. spesielt for de som kan. Simula. (og gjerne litt C) Ark 1 av 20

Repetisjon: Statiske språk uten rekursive metoder (C1 og C2) Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

Python: Intro til funksjoner. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Oversikt. Feil i programmet hva skjer? Array indeks utenfor sine grenser. Inf1010 Våren Feilsituasjoner og unntak i Java

Hvorfor objektorientert programmering?

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

UNIVERSITETET I OSLO

Løse reelle problemer

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

Introduksjon til programmering og programmeringsspråk

programeksempel Et større En større problemstilling Plan for forelesingen Problemstillingen (en tekstfil) inneholdt ordet "TGA"

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Programmeringsspråket C

Datatyper og typesjekking

Velkommen til INF2100 Jeg er Dag Langmyhr

Datatyper og typesjekking

Kapittel 1: Datamaskiner og programmeringsspråk

Inf1010 Våren Feilsituasjoner og unntak i Java. Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

Forelesere. Velkommen til programmeringsspråkenes verden IN211. Praktiske opplysninger. Faglige forutsetninger. Ragnhild Kobro Runde

Transkript:

Strukturering av programmer Jfr. læreboka kapittel 4 og 5 Kontrollstrukturer Algoritmer i imperative språk kan bygges opp av de tre grunnleggende programstrukturene Kontrollstrukturer o Sekvens Unntak (Exceptions) o Valg Event-driven computing o Løkke (iterasjon) Modularisering o Skille grensesnitt og implementasjon o Separat og uavhengig kompilering o Modulmekanismer i ulike språk Alle imperative språk tilbyr derfor disse strukturene, men med litt ulik syntaks o if then else, endif elseif fi o for, while, repeat, do, dowhile Se læreboka side 179 186 for detaljer IN211-Strukturereprogram-1 IN211-Strukturereprogram-2 Dijkstras Guarded commands if <Boolsk uttrykk> -> <setning> [ ] <Boolsk uttrykk> -> <setning> [ ] <Boolsk uttrykk> -> <setning> fi Hvis en eller flere av de Boolske uttrykkene er sanne, utføres en av de tilsvarende setningene ikke-deterministisk Hvis ingen av de Boolske uttrykkene er sanne, avsluttes programmet med en kjøretidsfeil Tilsvarende konstruksjon finnes for løkker Hensikten med konstruksjonene er å kunne skrive programmer som ikke er overspesifiserte og som det er lett å bevise er riktige. Eksempel: Finn det største av to tall: if x >= y -> max := x [ ] y >= x -> max := y fi Rutiner Rutiner gjør det mulig å bryte ned et program i mindre enheter Kallende rutine kaller en rutine ved navn, den kalte rutinen returnerer dit den ble kalt fra. I de fleste språk finnes rutiner finnes i to varianter o Prosedyrer, som ikke returnerer noe resultat, men gir tilstandsendringer som utskrift, endring av globale variable, endring av objekttilstand (kan bare endre eksterne verdier gjennom sideeffekter). Kall på prosedyrer brukes som selvstendige setninger. o Funksjoner, som returnerer en verdi, og som derfor kan brukes i uttrykk Sideeffekt (def): Endring av ikke-lokale variabler Språkutformingsspørsmål: Skal funksjoner tillates å ha sideeffekter? IN211-Strukturereprogram-3 IN211-Strukturereprogram-4

Sideeffekter et tveegget sverd Korutiner Effektivt for å kommunisere med rutinens omgivelser Korutiner er rutiner som samvirker med hverandre på like fot. men Typisk oppsett: o Et overordnet program starter opp alle korutinene. For å studere virkningen av rutinen, er det ikke nok å se på signaturen, vi må studere hele rutinen. Programmer med sideeffekter kan derfor være meget vanskelige å lese. o Hver korutine initialiserer seg selv og returnerer til det overordnede programmet. o Det overordnede programmet restarter en av korutinene med resume. o Deretter restarter korutinene hverandre med resume. Allment akseptert at det er uheldig at funksjoner har sideeffekter, og mange programmeringsspråk forbyr det. o Kjøringen avsluttes når en av korutinene utfører sin avsluttende kode. Korutinene utføres i kvasiparallell bare en korutine er aktiv ad gangen. Korutiner er velegnet for simuleringer eksempelvis spill. Korutiner er implementert i SIMULA 67. IN211-Strukturereprogram-5 IN211-Strukturereprogram-6 Exceptions - unntak Språk uten unntakshåndtering Hensikten med unntakshåndtering er at programmet skal gjenspeile det normale programmet skal ikke bli overkomplisert på grunn av alle mulige unntak Hvis man programmerer i et språk som ikke tilbyr unntakshåndtering, må programmereren allikevel forsøke å forutse alle eventualiteter og håndtere mulige unntak Definisjoner: Alternativer: o Unntak ( exception ): En uvanlig, unormal hendelse, feilaktig eller ikke, som kan fanges opp av maskin- eller programvare, og som kan kreve spesiell prosessering o Sende med en ekstra parameter som kan brukes som statusindikator til alle subprogrammer (f.eks. C biblioteksfunksjoner) o Unntakshåndtering ( excepton handling ): Prosesseringen av et unntak o Sende med en label -parameter til alle subprgrammer ved feil returneres til denne (f.eks. FORTRAN) o Unntakshåndterer ( exception handler ): Programkoden for unntakshåndtering o Kasting av unntak ( raise an exception eller throw an exception ) gjøres når den uvanlige hendelsen inntreffer o Sende med en unntakshånderings-subrutine til alle subprogrammer Feilhåndteringskode er kjedelig å skrive og forkludrer programmet Fanges ikke feilen, går kontrollen til operativsystemet som gir en feilmelding og avslutter programmet IN211-Strukturereprogram-7 IN211-Strukturereprogram-8

Språk med unntakshåndtering Utfordringer i språkutformingen I et språk med unntakshåndtering fanges unntakene automatisk bak kulissene, og det gis muligheter for å rette opp problemet og fortsette. Feilforplantningsmekanismer åpner for effektiv gjenbruk av unntakshåndterere. Hvordan blir unntakshåndterere spesifisert og hva er deres skop? Hvordan blr et unntak bundet til en unntakshåndterer? Hvor fortsetter utførelsen (hvis den fortsetter) etter at unntakshåndtereren er ferdig? Hvordan spesifiseres brukerdefinerte unntak? Mange språk har ikke komplett unntakshåndtering, men gir allikevel muligheter for å fange opp I/O-feil (inkludert EOF). Skal det finnes standard unntakshåndterere for programmer som ikke inneholder egne håndterere? Skal det finnes implisitte, innebygde unntak? Skal det være mulig for programmereren eksplisitt å kaste implisitte, innebygde unntak? Skal feil som fanges av maskinvaren betraktes som unntak som skal kunne håndteres? Skal unntakshåndtering kunne settes ut av kraft? IN211-Strukturereprogram-9 IN211-Strukturereprogram-10 Exception is raised Unntakshåndtering kontrollflyt Executing code some statement; Termination Exception to handler binding? Continuation Exception handlers when when when Sebesta Figure 14.1 page 563 Java unntakshåndtering try { farlig kode catch (SomeException) { // flere unntakshåndterere finally { Alle unntak er objekter av subklasser av klassen Throwable Java-biblioteket omfatter to subklasser av Throwable : 1. Error Kastes av JVM for hendelser som f.eks. heap full. Fanges aldri av brukerprogrammer 2. Exception To predefinerte direkte subklasser: 1. IOException 2. RuntimeException (f.eks. ArrayIndexOutOfBoundsException og NullPointerException) Brukerdefinerte unntak er vanligvis subklasser av Exception IN211-Strukturereprogram-11 IN211-Strukturereprogram-12

Java unntakshåndtering try { farlig kode catch (SomeException) { // flere unntakshåndterere finally { Alle unntak er objekter av subklasser av klassen Throwable Error Throwable IOException Exception RuntimeException UserExceptions Java unntakshåndtering Alle catch krever en navnet parameter og alle parametre må være subobjekter av Throwable Unntak kastes med throw, inkluderer ofte new-operatoren for å lage et nytt unntaksobjekt: throw new MyException( ); Et unntak bindes til den første catch med en parameter som er av samme klasse som det kastede objektet eller en superklasse til det Finnes ingen passende catch, forplantes unntaket videre til kallende metode. Fanges ikke unntaket et eller annet sted, avsluttes programmet. En catch(exception) fanger det meste! ArrayIndexOutOfBoundsException NullPointerException Et unntak kan bli håndtert og kastet på nytt ved å inkludere en throw i unntakshåndtereren kan da kaste et annet unntak enn det opprinnelige IN211-Strukturereprogram-13 IN211-Strukturereprogram-14 Java unntaksforplantning Unntak av klassene Error og RunTimeException og deres subklasser blir kalt unchecked exceptions. Kompilatoren bryr seg ikke om disse. Alle andre unntak er checked exceptions. Checked exceptions som kastes av en metode må enten 1. Listes i throws-leddet i metodeklarasjonen 2. Håndteres i metoden En metode som kaller en metode som lister en bestemt checked exception i throws-leddet har tre muligheter: 1. Fange og håndtere unntaket 2. Fange unntaket og kaste et nytt som er listet i dens eget trows-ledd 3. Deklarere den i throws-leddet og la være å håndtere den Korrekt bruk av unntak? enum Ukedager {mandag, tirsdag, onsdag, torsdag, fredag, lørdag, søndag ; imorgen := Ukedager succ(idag); exception when constraint_error => imorgen := mandag; IN211-Strukturereprogram-15 IN211-Strukturereprogram-16

Navn Adresse Hendelsesdrevne programmer Registering Lagre Tøm xxxxxxx xxx xxxxxxx xxx xxxxxxx xxx Modularisering I ALGOL og ALGOL-liknende språk er programmet en monolittisk tekst. OK for små programmer, problematisk for store ( programming in the large ) For programming in the large er det behov for å kunne dele programmet opp i relativt selvstendige moduler, med o Høy kohesjon o Lav kopling Programming in the small : Utvikling av enkeltmoduler Lyttere fanger opp hendelser i skjermbildet og gir kontrollen til ansvarlig rutine. Programming in the large : Dekomponere i moduler Hvorfor modularisering? Skjermbildet kan o Dele noe stort opp i håndterbare biter o settes opp av programmet o Oppdeling av navnerommet, unngå navnekonflikter for rutiner/metoder o settes opp automatisk o Uavhengig utvikling og vedlikehold av moduler IN211-Strukturereprogram-17 IN211-Strukturereprogram-18 Viktige konsepter i modularisering Viktige konsepter i modularisering (forts.) Service og service provider klientemoduler har behov for service som ytes av service providers, dvs. tjenermoduler Innkapsling in the large : Gi klientene tilgang til de tjenestene de behøver, men ikke mer Grensesnitt o Beskriver en mengde med tjenester som eksporteres av en o Implementasjonen er skjult for omgivelsene dermed kan implementasjonen fritt endres, så lenge grensesnittet ikke berøres tjenermodul (typer, rutinekall/signaturer, variabler), og som modulens klienter kan gjøre seg nytte av ved å importere dem. o Rutinene i en modul har behov for å dele hemmeligheter med hverandre, uten at disse blir kjent utenfor modulen. o Hvordan får klientene tilgang til tjenestene? Hva kan eksporteres og importeres? Implementering o Implementerer tjenestene som er beskrevet i grensesnittet Det er hensiktsmessig å skille grensesnitt fra implementasjon Hvordan støtter programmeringsspråkene opp under dette? Disse konseptene er velkjente i den objektorienterte verden, og realiseres der ved hjelp av klasser. En modul er imidlertid som regel mer omfattende enn en enkel klasse. IN211-Strukturereprogram-19 IN211-Strukturereprogram-20

Separat/uavhengig kompilering Logisk vs. fysisk modularisering For programming in the large er det en stor fordel om programmeringsspråket tilbyr separat/uavhengig kompilering. Programmeringsspråket må definere o Kompileringsenheten: Hva kan kompileres uavhengig? Hva kan grupperes inn i en kompileringsenhet? o Kompileringsrekkefølgen: Hvor uavhengig kan fysiske moduler implementeres og kompileres? Må kompileringen skje i en bestemt rekkefølge? Logisk modularisering: Inndeling av programkoden i subrutiner, funksjoner, klasser, pakker o.l. Fysisk modularisering: Fordeling av programkoden på ulike filer som kan kompileres separat eller uavhengig o Innkapsling og synlighet: Hvilke synlighetsmekanismer og tilgangskontrollmekanismer understøttes av språket? o Typesjekking: Hva sjekkes på tvers mellom separatkompilerte moduler? IN211-Strukturereprogram-21 IN211-Strukturereprogram-22 Separat/uavhengig kompilering Fysisk modul: En fil Modularisering i C Separat kompilering (def): De fysiske modulene kan kompileres separat, men i en bestemt rekkefølge: Grensesnittene, så grensesnittets klienter og grensesnittets implementasjon Hvis grensensitt og implementasjon ikke er separate må tjener kompileres før klienter Uavhengig kompilering (def): De fysiske modulene kan kompileres fullstendig uavhengig av hverandre. Umuliggjør typesjekking på tvers av moduler av kompilatoren. (Kan linkeren overta denne oppgaven?) Ingen språkstøtte for å skille grensesnitt fra implementasjon. Men det er sedvane å dele en logisk modul i to fysiske moduler, som omtrent tilsvarer grensesnittet og implementasjonen the header file eller include file (file.h) og the implementation file (file.c). Se eksempel i læreboka side 255. Ingen innkapslingsmuligheter innen den fysiske modulen (filen) Navn som er definert utenfor funksjoner er kjent også utenfor den fysiske modulen. Funksjoner er pr default tilgjengelige for import. Variabler blir tilgjengelige ved å deklarere dem extern. Funksjoner og variable kan deklareres som lokale med static. IN211-Strukturereprogram-23 IN211-Strukturereprogram-24

Modularisering i C++ C++ bygger som kjent på C, derfor mye likt Viktige utvidelser: Klasser o understøtter implementering av abstrakte datatyper o understøtter innkapslingsprinsippet En klasses grensesnitt og implementering kan (men må ikke) adskilles og kompileres hver for seg (grensesnittet først!) Men ikke noe rent skille grensesnitt -definisjonen innholder også private entities, usynlige for klientene Klienter kan kompileres med tilgang bare til grensesnittet, ikke til implementasjonen Navn definert i klassen er lokale med mindre de er deklarert public. Kan gi tilgang til private variable gjennom Friend functions, se side 259 Oppdeling av det globale navnerom med namespaces, side 261 IN211-Strukturereprogram-25 Modularisering i Java Klasser og grensesnitt kan grupperes sammen i en package, som er en innkapslingsenhet for programming in the large. Se oppskrift i ukens øvingsoppgave! Klasser og grensesnitt deklarert som public kan eksporteres til andre pakker Hvordan importere pakker: import pakkenavn.*; Grensesnitt og klasser kan fordeles på filer som kan kompileres separat (men ikke uavhengig!) IN211-Strukturereprogram-26