Eksamen i TDT4165 Programmeringsspråk

Like dokumenter
Om du er i tvil, forklar dine antakelser. Alle programmer skal skrives i Oz.

Eksamen i TDT4165 Programmeringsspråk (med rette- eller løsningsforslag) Fredag 18 Desember 2009

Eksamen i emne TDT4165 / SIF8028 Programmeringsspråk

UNIVERSITETET I OSLO

TDT4165 PROGRAMMING LANGUAGES. Exercise 01 Introduksjon til Oz

Eksamen i TDT4165 Programmeringsspråk (med rette- eller løsningsforslag) , 15. desember 2011

UNIVERSITETET I OSLO

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering

Rekursjon og lister. Stephan Oepen & Erik Velldal. 1. februar, Universitetet i Oslo

TDT4165 PROGRAMMING LANGUAGES. Exercise 02 Togvogn-skifting

INF2810: Funksjonell Programmering. Dataabstraksjon og Trerekursjon

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2

BOKMÅL Side 1 av 7. KONTINUASJONSEKSAMEN I FAG TDT4100 Objektorientert programmering / IT1104 Programmering, videregående kurs

EKSAMEN I FAG. Del 1 Flervalg (hver underoppgave teller 2.86%) Side 1 av 7. Denne oppgaven skal besvares på vedlagt avkrysningsskjema.

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2

INF2810: Funksjonell Programmering. Lokale variabler. Og trær.

Hjemmeeksamen 2 i INF3110/4110

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering. Kommentarer til prøveeksamen

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering. Strømmer og utsatt evaluering

INF2810: Funksjonell Programmering. Lokale variabler. Og trær.

INF2810: Funksjonell Programmering. En metasirkulær evaluator, del 2

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

INF2810: Funksjonell Programmering. En metasirkulær evaluator, del 2

UNIVERSITETET I OSLO

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

ALGORITMER OG DATASTRUKTURER

TDT4165 PROGRAMMING LANGUAGES. Exercise 4 RC-kretser

BOKMÅL Side 1 av 5. KONTERINGSEKSAMEN I FAG TDT4102 Prosedyre og objektorientert programmering. Onsdag 6. august 2008 Kl

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme

INF2810: Funksjonell Programmering. Strømmer og utsatt evaluering

Eksamen i SLI230, vår 2003.

UNIVERSITETET I OSLO

TDT Øvingsforelesning 1. Tuesday, August 28, 12

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I

Eksamen i HUMIT 2710, Funksjonell programmering, våren Ingen hjelpemidler er tillatt. <resten av forsiden> Side 1 av 7

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

EKSAMEN I FAG TDT4100 Objekt-orientert programmering. Fredag 3. juni 2005 KL

UNIVERSITETET I OSLO

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

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

INF2810: Funksjonell Programmering. Mer om verditilordning. Tabeller. Og strømmer.

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

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

UNIVERSITETET I OSLO

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme

INF2810: Funksjonell Programmering. Mer om verditilordning. Tabeller. Og strømmer.

INF2810: Funksjonell Programmering. En metasirkulær evaluator

INF2810: Funksjonell Programmering. Trær og mengder

UNIVERSITETET I OSLO

Eksamen i tdt4120 Algoritmer og datastrukturer

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF2810: Funksjonell Programmering. Trær og mengder

INF2810: Funksjonell Programmering. Trær og mengder

INF2810: Funksjonell Programmering. En metasirkulær evaluator

Eksamen i emne TDT4165 PROGRAMMERINGSSPRÅK

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

UNIVERSITETET I OSLO

EKSAMEN med løsningsforslag

Med Svarforslag UNIVERSITETET I OSLO. Det matematisk-naturvitenskapelige fakultet. 3 sider (side 6, 7 og 8, rives ut, fylles ut og leveres)

UNIVERSITETET I OSLO

Algoritmer og Datastrukturer

Kap. 4: Ovenfra-ned (top-down) parsering

Algoritmer og Datastrukturer

EKSAMEN Løsningsforslag. med forbehold om bugs :-)

UNIVERSITETET I OSLO

EKSAMENSOPPGAVE. NB! Det er ikke tillatt å levere inn kladd sammen med besvarelsen

Innlevering 2b i INF2810, vår 2017

TDT4105 IT Grunnkurs Høst 2016

TDT4110 IT Grunnkurs Høst 2015

ALGORITMER OG DATASTRUKTURER

ALGORITMER OG DATASTRUKTURER

UNIVERSITETET I OSLO

Lykke til! Eksamen i fag TDT4140 Systemutvikling NTNU Norges teknisk-naturvitenskapelige universitet

Tillatte hjelpemidler: alle skrevne og trykte. Antall sider: 2 (+ 1 side vedlegg, bakerst). Oppgave 1 [25%]

Høyere-ordens prosedyrer

TDT4102 Prosedyreog objektorientert programmering Vår 2016

TDT4102 Prosedyre og Objektorientert programmering Vår 2015

Dagens tema Syntaks (kapittel Komp. 47, kap. 1 og 2)

INF2810: Funksjonell Programmering. Eksamensforberedelser

INF2810: Funksjonell Programmering. Tilstand og verditilordning

Litt om kompilering og interpretering. Dagens tema Syntaks (kapittel Komp. 47, kap. 1 og 2) Syntaks og semantikk

UNIVERSITETET I OSLO

EKSAMEN I FAG. Del 1 Flervalg (hver underoppgave teller 2.86%) Side 1 av 7. Denne oppgaven skal besvares på vedlagt avkrysningsskjema.

Datatyper og typesjekking

UNIVERSITETET I OSLO

TDT4110 IT Grunnkurs Høst 2014

Fakultet for informasjonsteknologi,

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

UNIVERSITETET I OSLO

Læringsmål og pensum. Algoritmeeffektivitet

TDT4110 Informasjonsteknologi grunnkurs: Tema: Algoritmer i praksis. Professor Alf Inge Wang

INF2810: Funksjonell Programmering. Tilstand og verditilordning

Transkript:

Norges Teknisk-Naturvitenskapelige Universitet Fakultet for Informasjonsteknologi, Matematikk og Elektroteknikk Institutt for Datateknikk og Informasjonsvitenskap Eksamen i TDT4165 Programmeringsspråk Onsdag, 8. August, 2007, 09:30 13:30 Språk: Bokmål Faglig kontakt under eksamen: Wacek Kuśnierczyk, Tlf 94894894 Hjelpemidler: C. Ingen trykte eller håndskrevne hjelpemidler er tillatt. Typegodkjent kalkulator er tillatt. Eksamen er laget av: Wacek Kuśnierczyk Eksamen er kontrollert av: Ole Edsberg Generell Informasjon og Tips Les følge generelle kommentarer og hint før før du begynner å svare. Les alle oppgavene før du begynner å svare. Svar kort og konsist. Uklare og unødig lange svar vil gi dårligere uttelling. Skriv tydelig. Utydelig skrift kan få negative konsekvenser for karakteren, siden deler av svarene dine da kan bli misforstått, eller ikke forstått i det hele tatt, av sensorerene. I oppgaver hvor du blir bedt om å forklare eller diskutere svarene, vil korrekte svar uten diskusjon/forklaring ikke gi maksimal uttelling. All programmering må gjøres i Oz. Noen steder vil det bli spesifisert at du bare kan bruke elementer som fins i kjernespråket. Du får lov til å bruke funksjoner og prosedyrer som er tilgjenglige i Oz, som FoldL, Map, App osv., bortsett fra oppgavene der du er eksplisitt bedt om ikke å bruke dem. Gradering Det er seks oppgaver, hver beståe av 3 6 deloppgaver. Oppgavene har forskjellig vanskelighetsgrad og krever forskjellige typer svar (kode, diskusjon). Uttelling for oppgavene (men ikke for deloppgavene) er gitt ved tittelen til hver enkelt oppgave. 1/9

Oppgave 1 (15%) Del 1a Hva er prosedyre-abstraksjon? Hva er de viktigste fordelene ved å bruke prosedyre-abstraksjon? Diskuter minst to slike fordeler. Del 1b Prosedyrene FoldRight og FoldLeft folder (prosesserer) en liste henholdvis høyre- og venstre-assosiativt. Her er fragmenter av definisjonene: fun {FoldRight List Combine Transform Null} case List fun {FoldLeft List Combine Transform Null} case List I et kall til FoldRight eller FoldLeft, må: argumentet List være en liste; argumentet Combine være en to-arguments funksjon som skal brukes til å kombinere de påfølge elementene i List; argumentet Transform være en ett-arguments funksjon som skal brukes til å transformere hvert element i List; argumentet Null være en verdi som det siste (i tilfellet FoldRight) eller det første (i tilfellet FoldLeft) elementet i List skal kombineres med. For eksempel, kan funksjonen Sum som beregner den artimetiske summen av alle elementer i en liste implementeres ved bruk av FoldRight eller FoldLeft som følger: fun {Sum List} {FoldLeft List fun {$ X Y} X+Y % Combine-funksjonen fun {$ X} X % Transform-funksjonen 0} % Null-verdien {Browse {Sum [1 2 3 4]}} der 10 vises i browse-vinduet. Implementer FoldRight og FoldLeft ved hjelp av fragmentene gitt over; du må bruke rekursjon eller iterasjon eksplisitt, du kan ikke bruke prosedyrer som FoldL eller FoldR som er tilgjengelige i Oz. Hold deg innenfor tyve linjer kode totalt. Er prosedyrene iterative eller rekursive? Er anvelser av prosedyrene iterative eller rekursive prosesser? Forklar. 2/9

Del 1c Funksjonen Map tar som argumenter en liste List og en ett-arguments-funksjon Function, og returnerer en liste hvor hver element er resultatet av en anvelse av funksjonen Function på det tilsvare elementet av List: {Browse {Map [1 2 3 4] fun {$ X} X*X }} viser [1 4 9 16] i browse-vinduet. Implementer Map ved bruk av dine Fold-funksjoner etter følge mønster: fun {Map List Function} {FoldX List fun Function } hvor FoldX må erstattes av en av Fold-funksjonene. Kan både FoldLeft og FoldRight brukes? Hvis ikke, hvilken av dem kan ikke, og hvorfor? Oppgave 2 (20%) Gitt følge fragment av et program hvor en dataabstraksjon blir brukt: declare X Y Structure = {NewStructure} UpdatedStructure = {Get {Get {Put {Put Structure 1} 2} X} Y} Utførelse av programmet fører til at X blir bundet til 2 og Y blir bundet til 1. Del 2a Hva er et buntet (eng: bundled) dataabstraksjon? Er strukturene produsert av NewStructure buntet eller ikke? Er ikke-buntede data absktraksjoner (abstrakte data typer) nyttige? Diskuter. Del 2b Hva er en sikker (eng: sikker) dataabstraksjon? Er strukturer produsert av NewStructures sikre eller ikke? Må en dataabstraksjon være buntet for å være sikker? Kan en sikker dataabstraksjon implementeres i en deklarativ beregningsmodell? Kan en deklarativ dataabstraksjon implementeres i en ikke-deklarativ beregningsmodell? Er ikke-sikre dataabstraksjoner nyttige? Diskuter. Del 2c Gi tre eksempler på lineære dataabstraksjoner og to eksempler på ikke-lineære dataabstraksjoner. Er dataabstraksjonen representert ved NewStructure lineær eller ikke? Hva slags dataabstraksjon kan den være? 3/9

Del 2d Gi en implementasjon av NewStructure slik at Structure blir deklarativ, buntet og sikker. Bruk følge mønster: NewStructure = local in Put = fun Get = fun Løsningen må ikke overskride 30 kodelinjer totalt. Del 2e Diskuter alle mulige kombinasjoner av egenskapene buntet/ubuntet, åpen/sikker og deklarativ/ikke-deklarativ. Hvilke av dem er implementerbare, og hvilke er nyttige til hvilke formål? Hvilke av disse kombinasjonene kan ikke implementereres i en deklarativ beregningsmodell? Hvilke av disse kombinasjonene krever en samtidig (eng: concurrent) beregningsmodell, og hvilke av dem krever en samtidig beregningsmodell med delt tilstand (eng: shared state)? Forklar. Oppgave 3 (20%) Del 3a Hva er lat utførelse? Hva er fordelene ved å bruke lat utførelse? Forklar. Del 3b I Oz kan late funksjoner enkelt defineres med nøkkelordet lazy. Men lazy er bare syntaktisk sukker: i kjernespråket brukes elementet ByNeed. Vis hvordan følge definisjon kan uttrykkes i kjernespråket: fun lazy {SumSquares N1 N2} N1*N1+N2*N2 Hint: pass på i denne definisjonen er det ikke bare lazy som ikke tilhører kjernespråket. Del 3c Bruk lat utførelse og implementer funksjonen ListEvenIntegers som returnerer en liste over alle like heltall, fra og med 0 (det vil si, listen [0 2 4 ]). ListEvenIntegers skal fungere som i følge eksempel: 4/9

EvenIntegers = {ListEvenIntegers} {Browse {ListItem EvenIntegers 1}} {Browse {ListItem EvenIntegers 5}} hvor 0 og 8 blir skrevet ut. Funksjonen ListItem tar som argumenter en liste og et positivt heltall, returnerer det elementet i listen som står på posisjonen gitt av heltallet (i en 1-basert listeindeksering, dvs. at det første elementet i listen har indeks 1). Implementer ListItem. (Du kan bruke lazy eller ByNeed, som du foretrekker. Du kan ikke bruke funksjoner tilgjengelige i Oz, som List.nth o.l.) Del 3d Hvilke elementer må inkluderes i den abstrakte maskinen (kjernespråktolkeren) for at programmer med bruk av lat utførelse skal kunne kjøres på den? Forklar følge: 1. Hvordan blir den semantiske setningen ({ByNeed x y }, E) utført? (Her er x og y to identifikatorer, og E en omgivelse (eng: environment).) 2. Hva skjer hvis det oppstår behov (eng: need) for resultatet av en anvelse av en lat funksjon? Hva betyr det at det er behov for en variabel? Gi to eksempler på kode der en variabel-identifikator er brukt, et hvor det er behov for den variabelen som er bundet til identifikatoren, og et hvor det ikke er det. 3. Hvilke to minnehåndteringsregler er nødvige for å definere variabel-nåbarhet (eng: reachability) hvis beregningsmodellen inkluderer lat utførelse? Del 3e Forklar forskjellen i utførelse mellom følge to linjer kode: thread {Procedure Argument} {ByNeed Procedure Argument} Oppgave 4 (15%) Scheme er en elegant dialekt av Lisp, for det meste brukt i undervisning. I denne oppgaven tar vi for oss σ, en egefinert, meget begrenset delmengde av Scheme. Følge er et kort program i σ, beståe av tre instruksjoner: (define one 1) (define (double-q n) (q (q n))) (double-q one) Den første instruksjonen en definisjon definerer at one skal ha verdien 1. Den andre instruksjonen definerer at double-q skal være en funksjon med en parameter (n), som, når den anves på et argument, returnerer resultatet av å anve funksjonen q på verdien returnert av en anvelse av den samme funksjonen q på argumentet til double-q. (Funksjonen q er ikke defineret i koden over.) Den tredje instruksjonen et uttrykk anver funksjonen double-q på one, som definert over. Syntaksen til σ er ganske enkel: et program er en sekvens av én eller flere instruksjoner; en instruksjon er enten en definisjon eller et uttrykk; en definisjon er enten en variabel-definisjon (som (define variable )) eller en definisjon av en unær funksjon (som (define (function argument) ); 5/9

et uttrykk er enten en identifikator (som one), et numerisk literal (som 1), eller en anvelse; en anvelse er et uttrykk som involverer identifikatoren til en funskjon og et verdi-uttrykk (som (function one) eller (function (function one))). Del 4a Skriv en EBNF-grammatikk for σ i henhold til syntaks-beskrivelsen over, og slik at koden over kan genereres av grammatikken din. Du kan bruke ikke-terminalene identifier og numeral som om de allerede var definert. Alle andre ikke-terminaler brukt i grammatikken din må være definert i den. Definer grammatikken på ovenfra-og-ned-måten begynn med ikke-terminalen program : program ::=...... ::=...... Del 4b Er grammatikken din kontekst-sensitiv? Er den tvetydig? Forklar hva begrepene context-sensitive og ambiguous betyr i forbindelse med grammatikker. Gi et eksempel på en ikke kontekst-fri grammatikk og på en tvetydig grammatikk. Del 4c Basert på grammatikken din, implementer en syntaks-sjekker for σ. Bruk følge mønster: fun {CheckSyntax Tokens} Anta at syntaks-sjekkeren mottar fra en tokenizer en sekvens av tokens representert som en liste. I denne sekvensen er hver identifikator pakket inn i en record med merkelappen identifier og hvert tall-ord pakket inn i en record med merkelappen number. Koden over, for eksempel, ville bli returnert fra tokenizeren som følge sekvens: [ ( define identifier( one ) number( 1 ) ) ( define ( identifier( double-q ) identifier( n ) ) ( identifier( q ) ( identifier( q ) identifier( n ) ) ) ) ( identifier( double-q ) identifier( one ) ) ] Denne sekvensen må godkjennes av syntaks-sjekkeren din, mao. må {Browse {CheckSyntax Program}} vise true (hvor Program har sekvensen vist ovenfor som verdi). Hint: du kan implementere syntaks-sjekkeren som én prosedyre, eller som en samling av prosedyrer, én prosedyre for hver regel i grammatikken. Løsningen din må implementeres med relasjonell programmering, og koden må ikke overskride to sider. Anta at prosedyrene og funksjonene nødvige for relasjonell programmering er tilgjengelige, mao. kan programmet ditt starte som 6/9

\insert solve.oz declare fun {CheckSyntax Tokens} {SolveAll fun {$} true \= nil} Oppgave 5 (20%) En dobbelt-sidig kø (en dequeue eller deque) er en lineær abstrakt datatype som støtter lagring, henting og fjerneing av elementer i begge er. I denne oppgaven skal du implementere den dequeue som tilbyr de følge fire operasjonene: push: legger til et element helt i slutten av dequeuen; pop: henter og fjerner det siste elementet i dequeuen; shift: legger til et element helt fremst i dequeuen; unshift: henter og fjerner det første elementet i dequeuen; 1 Del 5a Spesifiser dataabstraksjonen ved hjelp av invariant assertions, som følger: { d er udefinert } gjør d til en ny tom dequeue { d = } { d = v 1, v 2,...,v n, e = v } push verdien av e på d { d =?, e =? } og så videre for alle operasjonene, hvor v i er verdier, og d og e er variabler. (I svaret ditt må du erstatte spørsmålstegnene med riktig innhold.) Del 5b Implementer en funksjon NewDequeue som produserer nye, tomme dequeuer. Implementasjonen din må være buntet med eksplisitt tilstand, og må bruke procedure dispatching. I følge eksempel: Dequeue = {NewDequeue} % dequeuen er nå [] {Dequeue push(a)} % dequeuen er nå [a] {Dequeue push(b)} % dequeuen er nå [a b] {Dequeue shift(c)} % dequeuen er nå [c a b] {Browse {Dequeue pop($)}} % dequeuen er nå [c a] {Browse {Dequeue unshift($)}} % dequeuen er nå [a] {Browse {Dequeue unshift($)}} % dequeuen er nå [] 1 Navnene på operasjonene er tatt fra Perl, hvor slike operasjoner brukes til å aksessere elementer i arrays. 7/9

vil verdiene b, c, og a bli vist, i den rekkefølgen. Bruk følge mønster: fun {NewDequeue} Content = fun {Push Item} in Koden din må ikke overstige 40 linjer. Del 5c Er dequeues, slik du har implementert dem, en sikker datatype? Oppgave 6 (10%) Forestill deg en situasjon hvor et antall klienter er tilkoblet en enkelt sørver. Hver klient kan be sørveren om å beregne resultatet av en anvelse av en funksjon på et argument. Både argumentet og funksjonen ses til sørveren, og sørveren ser tilbake det beregnede resultatet. Gitt følge scenario: Server = {NewServer} Square = {NewClient square fun {$ X} X*X Server} Cube = {NewClient cube fun {$ X} X*X*X Server} Double = {NewClient double fun {$ X} 2*X Server} {Square.compute 4} {Cube.compute 5} {Double.compute 6} Dette programmet lager først en sørver og et antall tilkoblede klienter (sørveren vet ikke på forhånd hvor mange klienter som skal tilkobles). Deretter ber den klientene om å utføre en beregning. Dette resulterer i at square(argument:4 result:16), cube(argument:5 result:125), og double(argument:6 result:12) blir vist i browser-vinduet. Del 6a Klienter er implementert som følger: fun {NewClient Name Function Server} proc {Compute Argument} Result in thread {Server.call message(argument Function Result)} case Result of Result then 8/9

{Browse Name(argument:Argument result:result)} in client(compute:compute) Er klientene deklarative objekter? Hvis ikke, hvorfor ikke? Forklar. Del 6b Sørveren er implementert som følger (noen deler av koden er skjult): fun {NewServer} InputStream proc {Process Stream} case Stream of message(input Function Output) Rest then Output = {Function Input} {Process Rest} proc {Call Message} in thread server(call:call) Sørveren mottar beskjedene st til den fra klientene i en enkelt strøm. Fullfør koden slik at sørveren fungerer som i eksempelet over. Er sørveren et deklarativt objekt? Hvis ikke, forklar hvorfor. Del 6c Hva er den minimale mengden utvidelser nødvig for å gjøre den deklarative, sekvensielle beregningsmodellen (presentert i Ch. 2 i læreboka) i stand til å implementere sørveren på en velfungere måte? Kan denne klient-sørver konfigurasjonen implementeres i en deklarativ beregningsmodell? Forklar. 9/9