Principer för (imperativa) programmeringsspråk

Relevanta dokument
Översikt. Varför lära sig detta? Motivering Syntax och semantik Imperativa språkets byggstenar och Python. PL-boken Kap 1 (repetition):

Klassdeklaration. Metoddeklaration. Parameteröverföring

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

Läsöversikt. Föreläsningar 2-6. Genomförande av laborationer

TDIU01 - Programmering i C++, grundkurs

Imperativ programmering. Föreläsning 2

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

Språket Python - Del 1 Grundkurs i programmering med Python

Föreläsning 2 Programmeringsteknik och C DD1316. Programmering. Programspråk

Föreläsning 2 Programmeringsteknik och C DD1316

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Parameteröverföring. Exempel. Exempel. Metodkropp

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Övningsuppgifter kapitel 8

SMD 134 Objektorienterad programmering

Översikt. Stegvis förfining. Stegvis förfining. Dekomposition. Algoritmer. Metod för att skapa ett program från ett analyserat problem

Planering av ett större program, del 2 - for och listor. Linda Mannila

Introduktion till formella metoder Programmeringsmetodik 1. Inledning

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

Föreläsning 3: Booleans, if, switch

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Objektorienterad Programmering (TDDC77)

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

Föreläsning 3-4 Innehåll

Funktioner. Linda Mannila

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Några inbyggda funktioner (med resultat!) Introduktion till programmering D0009E. Föreläsning 4: Villkor och rekursion. Modulus-operatorn.

Programmeringsteknik I

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

Språket Python - Del 2 Grundkurs i programmering med Python

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Uppgifter teknik HT17 (uppdaterad v. 40)

Föreläsning 3: Typomvandling, villkor och val, samt textsträngar

Introduktion till programmering D0009E. Föreläsning 5: Fruktbara funktioner

1/15/2013. DD1310/DD1314/DA3009 Programmeringsteknik. Lärandemål... Vilka läser kursen? ...fler lärandemål VARFÖR? Föreläsning 1

TDP002 - Imperativ programmering

729G04 Programmering och diskret matematik. Python 2: Villkorssatser, sanningsvärden och logiska operatorer

DD1314 Programmeringsteknik

Imperativ och Funktionell Programmering i Python #TDDD73. Fredrik Heintz,

Introduktion till programmering SMD180. Föreläsning 5: Fruktbara funktioner

Grundläggande datalogi - Övning 1

Introduktion till programmering SMD180. Föreläsning 2: Variabler, uttryck och satser

Introduktion till programmering SMD180. Föreläsning 4: Villkor och rekursion

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

729G04 Programmering och diskret matematik. Python 3: Loopar

DD1310/DD1314/DA3009 Programmeringsteknik LÄRANDEMÅL... Vilka läser kursen? ...FLER LÄRANDEMÅL. Föreläsning 1

C++ - En introduktion

System.out.println("Jaså du har "+ antalhusdjur+ " husdjur"); if ( antalhusdjur > 5 ) System.out.println("Oj det var många);

Erfarenheter från labben

Kurslitteraturen. C-nivå Villkorssatser [kap 8] if & elif & else and & or Loopar [kap 9] for

Problemlösning och algoritmer

Föreläsning 6: Metoder och fält (arrays)

Språket Scheme. DAT 060: Introduktion till (funktions)programmering. DrScheme. uttryck. Jacek Malec m. fl. evaluering av uttryck.

Introduktion till programmering och Python Grundkurs i programmering med Python

F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander

DD1361 Programmeringsparadigm. Carina Edlund

PROMETHEUS. Ett typat, objektorienterat programmeringsspråk av Tim Andersson.

729G74 IT och programmering, grundkurs. Tema 2, Föreläsning 2 Jody Foo,

Platser för att skriva och testa kod online. Workshop om programmering i matematikkurser, version 0.7 senast sparat

Tutorial: Python på 90 minuter

MicroPython Ett textbaserad programmeringsspråk för Micro:bit

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Programmeringsteknik med C och Matlab

TDIU01 - Programmering i C++, grundkurs

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Tentamen i Introduktion till programmering

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Innehållsförteckning

Översikt 5 delar. 1: Fysisk representation. Binär, oktal och hexadecimal representation

Användar- och systemdokumentation

Introduktion till programmering D0009E. Föreläsning 1: Programmets väg

Föreläsning 3. Iteration while-satsen

TDP002 - Imperativ programmering

Repetition C-programmering

Backcode. Jonathan Crusoe TDP019 Projekt: Datorspråk Linköpings universitet

TDDE44 Programmering, grundkurs

Exempel på ett litet Ada-program

Programmering A. Johan Eliasson

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

TDIU01 - Programmering i C++, grundkurs

Användarhandledning Version 1.2

TDP002 Imperativ programmering

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Funktioner. TDDD73 Funktionell och imperativ programmering i Python Föreläsning 8. Peter Dalenius Institutionen för datavetenskap

MATLAB. Python. Det finns flera andra program som liknar MATLAB. Sage, Octave, Maple och...

Introduktion C-programmering

Programmering för språkteknologer I, VT2012. Rum

Visual Basic, en snabbgenomgång

Tentamen ID1004 Objektorienterad programmering October 29, 2013

Datalogi I, grundkurs med Java 10p, 2D4112, Fiktiv tentamen, svar och lösningar och extra kommentarer till vissa uppgifter 1a) Dividera förs

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Exempelduggan. Luffarschack. Koda spel

Funktionens deklaration

Föreläsning 2, vecka 8: Repetition

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen

Imperativ programmering. Föreläsning 3

Transkript:

Principer för (imperativa) programmeringsspråk Human Centered Systems Inst. för datavetenskap Linköpings universitet

Översikt Motivering Syntax och semantik Imperativa språkets byggstenar och Python Datatyper Tilldelning och uttryck Kontrollstrukturer (på satsnivå) Subprogram Relaterade avsnitt: PL 3.1 3.2, 5.1 5.3, 5.8 intro, 6.1 6.3, 7.1 7.3, 8.1 8.3, 9.1 9.2, 9.5.2.4

Varför lära sig detta? PL boken Kap 1 (repetition): Förmåga att uttrycka sig, förmåga att välja språk, snabbare inlärning, förståelse för implementation, ökad insikt om språk En hantverkare kan sina verktyg Alla programmerare bör ha implementerat ett eget språk som minimum Förståelse för vad som krävs för att implementera ett datorspråk är användbar kunskap för alla program Även t ex en modul av funktioner kan ses som ett språk

Förståelse för språk = förståelse för konstruktion av språk It has often been said that a person does not really understand something until after teaching it to someone else. Actually a person does not really understand something until after teaching it to a computer, i.e. expressing it as an algorithm Jo, förstår du... Don Knuth Tack, då kör jag!

Motiverande exempel Exempel på ett korrekt uttryck i Python: numb1 > 3 and numb2!= 4 Exempel på ett inkorrekt uttryck i Python: numb1 > 3 and numb2 Fråga: Vår Pythontolk måste ha en algoritm i sig som kan särskilja dessa två fall. Hur ser en sådan algoritm ut? Steg 1: Vi behöver detaljerad förståelse för språkets syntax och semantik

Syntax och semantik

Begreppen syntax och semantik Syntax: formatet på språkets konstruktioner Semantik: betydelsen hos språkets konstruktioner Varje programspråk har sin egen unika syntax Paradigm: språken har en gemensam semantisk kärna men kan variera i olika detaljer I våra kurser: Vi lär oss principerna så kan vi paradigmet Språket som vi väljer är ett exempel...om än valt med omsorg Men då måste vi lära oss se principerna i exemplet

Python vs Java en skillnad i syntax... Python: if x == 2 and y == 3: print( hej ) Java: if (x == 2 && y == 3) { System.out.println( hej ); } villkor for x in range(7): print(x) for (int x=0; x < 7; x++) { System.out.println(x); } iteration...men i många avseenden samma semantik

Hur beskriva ett programmeringspråks syntax? Ett språk kan ses som en mängd strängar/meningar/satser Ett programmeringsspråk är ett formellt språk Formella språk är definierade av syntaxregler Formella språk är enkla att hantera med algoritmer Exaktheten ger enkelhet för datorn (svårighet för människan...)

Parser/igenkännare Algoritmer som avgör om givna satser är korrekta eller ej Lexem: grundläggande klassificering av strängar Tokens: gruppering av lexem i principiella roller t ex identifierare. Använder normalt en formell grammatik Backus Naur Form: grammatisk formalism för syntax (seminarie 2)

Hur beskriva semantiken för ett programmeringsspråk? Formella metoder matematiskt avancerade modeller Inte i denna kurs, men nämns några i PL boken Pragmatisk metod 1. lär dig hur interpretatorer och kompilatorer fungerar i stora drag 2. Lär dig informellt vad som händer för olika konstruktioner

Hur exekveras ett Pythonprogram? Grundläggande bild: Interpretator 1) kör aktuell sats 2) stega fram KP I/O OS, etc Programmoduler Kontrollpunkt (KP) En sådan modell kallas ibland för operationell semantik. I detta fall för ett s k interpreterat språk.

Hybridmodellen Källkod Lexikalanalys Syntaxanalys Intermediär kodgenerator Intermediär kod Interpretator Indata Resultat

Imperativa språkets byggstenar

Namn Namn kallas ofta identifierare Identifierar variabler, moduler, funktioner osv. Exempel på designval: Känslighet för stor/liten bokstav Nyckelord som inte får vara identifierare Konventioner: särskilj delar av namnet med _ eller kamelnotation Python: _ eller bokstav + sekvens av _, bokstav, siffra Skillnad på stor och liten bostav Får inte vara ett reserverat ord, t.ex. for, break, def

Variabelbindning Identifierare bindning Minnesadress Typ: värde Variabler har namn, typ och värde Variabelbindning är associationen mellan namnet och dess typ+värde

Heap: Python objektens minnesarea Variabelomgivning <id>: myvar1 <id>: myvar2... Minneshanterare Heap: 13, hej då, [3.4, 5, a ]... Skräpsamlare (GC) Variabelomgivningen består av aktuella identifierare På Heap lagras skapade objekt antal och storlek ibland okänt binär representation refereras/skapas via uttryck Skräpsamlare Garbage Collector

Räckvidd (engelska: scope) Det räckvidd av satser där en identifierare/variabel är möjlig att synlig/refererbar Variabler är lokala i ett källkodsblock om de införts där. Icke lokala variabler är variabler som är nåbara trots att de införts lokalt Skuggning måste hanteras så att man kan hålla isär på icke lokala och lokala variabler

Variablers räckvidd i Python Variabler har begränsad räckvidd Globala variabler i modulen lokala variabler i nuvarande funktion Satsblock markeras i Python med indentering samma indentering i följd samma block markerar en svit av satser som ska exekveras tillsammans I explicit typade språk t ex Java/C++ är räckvidd och block förbundna...men inte i Python

När och hur får lokala variabler värden? Funktioner kan definieras nästlat i varandra Omgivande (enclosing) funktion Lokala variabler har s k statisk räckvidd Vi kan referera till variabler i funktionen som är kontext LEGB regeln: Built in Global Enclosing Local

Ett exempel var = hej def foo(): print(var) def foo1(): var = 7 def foo2(): global var var += hopp def foo3(): var = hoppsan import mymodule mymodule.var += var Skriv ut icke lokala variabeln var Lokal variabel införs som sedan skuggar den globala Explicit referens till global variabel Möjlighet att referera variablerna i samma omfång

Datatyper En mängd datavärden som samlat för ett visst syfte Primitiva datatyper: värden består inte av värden av annan typ Tal, tecken och Booleska typer Strängar ett gränsfall I Python: taltyperna och boolean Sammansatta datatyper: typer som inte är primitiva Arraytyper och associativa arrayer/hashes viktiga exempel I Python: sekvenstyper och Dictionary Dynamiska datatyper: minnestilldelningen sker vid körtid Python har dynamiska datatyper

Uttryck Aritmetiska uttryck oftast likartat i alla imperativa språk Booleska uttryck lite mer syntaxskillnader Precedence: vilken operator ska appliceras först Ex: 1 + 3 * 4 Vänster /högerassociativitet: vilken ordning operatorer med samma precedence ska appliceras Ex: 1 + 2 + 3 Överlagrade operatorer: samma symbol fungerar för många typer T ex + i Python för både tal och strängar

Evaluering av uttryck Uttryck/term: Trädstruktur: 1 (1 + ( 3 * 4)) / 2 / + 2 * Trädstrukter används för att representera uttryck Evaluering av ett uttrycks görs av algoritmer som traverserar trädet Enklast nerifrån och upp och kom ihåg delresultaten 3 4 T ex som lista av listor: [ '/', [ '+', 1, ['*', 3, 4]], 2]

Python: Booleska och relationsoperatorer Booleska operatorer not negation and logisk och or logisk eller Booleska konstanter True värde 1 sant False värde 0 falskt Relationsoperatorer x == y likhet x!= y icke likhet x < y mindre än x > y större än x <= y mindre eller lika x >= y större eller lika

Booleska uttryck i Python x = 1 y = 2 x < y # True (x >= (y 1)) # True (x > (y 1)) # False (x!= y) # True (y == x) # False (y == (x * 2)) # True (x > y) or (x!= y * 2) # True not ((x < y) and (x!= y)) # False

Tilldelningssatsen Enkel tilldelning: variabel tilldelas uttryckets värde Semantik: identifieraren binds till uttryckets värde Sammansatt tilldelning: +=, = etc Sekvenstilldelning: flera variabler får värden samtidigt Kan användas för att undvika temporär variabel vid swap Tilldelning är exempel på en enkel sats.

Exempel på enkla satser i Python area = math.pi * 5**2 print (area) list_1 = list( abba ) del list_1[1:3] my_function( hej ) Instruktioner Atomär kontroll Kommandot reserverat ord/symbol Enkla satser = kommandoskript break return list_1

Programmets kontrollflöde Kontrollflöde: ordningen som programsatserna exekveras i Kontrollflödet kallas ibland dynamisk struktur För rak sekvens av (enkla) satser: uppifrån och ner if, while, for styr detta flöde olika flöden vid val/villkor Kontrollpunkt: kallas ibland den punkt där programmet befinner sig vid ett visst ögonblick på maskinkodsnivå: programräknaren (PC) håller adressen till nästa sats som ska exekveras Vid subprogram (funktioner) måste anropsposition sparas, dvs vi behöver en s k anropsstack

Kontrollsatser Satser vars syfte är att styra programflödet Sammansatta kontrollsatser styr lokalt inom sig T ex villkor och loopar Enkla kontrollsatser utgör del av andra konstruktioner T ex return och break Villkor: innehåller 1, 2, eller fler villkorade klausuler Iterativa satser: definitiva och indefinita loopar Normalt for och while loop

Kontrollflöden för if sats 1 2 3 4 5 6 7 8 9 10 11 12 13 x = 13.7 y = 14.5 z = 19.0 if x > y: if x > z: max = x else: max = z else: if y > z: max = y else: max = z 1 2 3 4 9 10 12 13 exit x = 22.3 y = 14.5 z = 27.0 1 2 3 4 5 7 8 exit

Taxonomi över viktigaste satstyperna i Python Satser Atomära Innehåller andra satser Enkla Komplexa Instruktioner tilldelning uttryckssats... Atomär kontroll return break raise Villkor if if [elif] else Loop while for subprogram funktioner Utförande satser Kontrollsatser

Subprogram Namngivna källkodsblock Subprogram definieras och anropas Vi skiljer på definitionshuvud och definitionskropp Parametrar används för skicka med indata vid anrop Returvärde används för att skicka med utdata vid retur från subprogram

Funktion och procedur Två typer av subprogram OBS: dessa begrepp används lite olika av olika författare/språk Funktion: ett subprogram som returnerar ett värde Procedur: returnerar inte ett värde I Python värdet None Funktioner kan ingå som del i uttryck Sidoeffekt: effekter förutom returnerat värde t ex om subprogrammet skriver ut på konsol parametrar av referenstyp (mer detaljer senare) en ren funktion har inga sideffekter procedurer har bara sideffekter Funktionell procedur : både returvärde och sideffekter

I Python modulen består av satser Rätt: def power(x,y): result = 1 for _ in range(y): result = times(result,x) return result Fel: print (times(4,5)) def times(x,y): return x * y def times(x,y): return x * y print (power(2,4))

Parametrar och argument (Formella) parametrar i en definition beter sig som lokala variabler i funktionen binds på nytt vid varje anrop frigörs från bindning vid anropets slut (Aktuella parametrar) argument i ett anrop består av uttryck argumentets värde överförs till parametern

Anropsstacken Anropsstack def test(): x = 'hej' print(x, end='') def test2(y): test() print(y) test() print() test2('hopp')) test() x = 'hej' test() test2(y) test2(y) x = 'hej' y = 'hopp' y = 'hopp' (1) (2) (3) (4) (5) hej \n hej Kontrollflöde (4) (5) (1) (2) (3) Vid varje anrop av en funktion skapas en variabelomgivning Anropen läggs på en s k anropsstack med funktionsomgivningar test2(y) y = 'hopp' hopp\n

Metoder för parameteröverföring Tekniken som används för att tilldela parametrar värden av argument uttryck Olika språk har olika principer (det finns 3 4 vanliga) C++ kommer visa på andra varianter än Python I Python: genom objekt referens även kallat genom tilldelning (LP boken: pass by reference) argumentutryckets värde är en objekt referens den tilldelas parametern Innebär strukturdelning för muterbara strukturer

Exempel: önskad sideffekt def assign_plus(val, index, list): val += 1 list[index] = val val = 34 mylist = [12, 3, 7] assign_plus(val, 2, mylist) print ('val:', val) print ('mylist:', mylist) val: 34 mylist: [12, 3, 35]

Exempel: blockera sideffekt kopiera def safe_filter(val, mylist): mylist = mylist[:] if val in mylist: mylist.remove(val) return mylist mylist = [7,3,6,3] mycopy = safe_filter(3, mylist) print ('mylist:', mylist) print ('mycopy:', mycopy) mylist: [7, 3, 6, 3] mycopy: [7, 6, 3]

Summering Algoritmisk förståelse den djupaste förståelsen Syntax och semantik BNF och operationell semantik Namn binds, har räckvidd, dynamiskt på heap Datatyper primitiva och sammansatta Uttryck precedence, associativitet, överlagring och uträkning Tilldelning: enkel och sammansatt, värde binds till identifierare Kontrollstrukturer: styr programflödet Subprogram