Översikt
„
Vad är det som händer när man kör Java?
–
Introduktion till Java
–
(del2)
Kompilator (före körning)
Interpretator (under körning)
„
Statisk vs. dynamisk variabelbindning
„
Parameter-passing
„
Användbara datastrukturer
–
–
–
Call by value i Java
Arrayer
Arraylistor
Programmering — tillämpningar och datastrukturer
Köra Java
Bindning
Köra Java
Köra Java
„
>> javac MyCode.java
Bindning
Producerar MyCode.class
– Maskin/operativsystems-beroende kod
för Java Virtual Machine (JVM)
2
Program i Java
Filstruktur i NetBeans
–
Par.passing
Arrayer
„
Par.passing
>> java MyCode
–
Varje klassdefinition i egen fil
Arrayer
Koden tolkas (interpreteras) steg-försteg under körning
Biblioteksfiler (paket)
ArrayList
ArrayList
Programmering — tillämpningar och datastrukturer
3
Programmering — tillämpningar och datastrukturer
Köra Java
Kompilering
Köra Java
Bindning
källkod
Bindning
Par.passing
Par.passing
Hello.java
kompilator
Arrayer
Hello.class
Arrayer
Javabytekod
ArrayList
Programmering — tillämpningar och datastrukturer
5
ArrayList
4
JVM
Hello.class
Unix
Windows
Darwin
RAM
RAM
RAM
CPU
CPU
CPU
AMD
Intel
Mac
Programmering — tillämpningar och datastrukturer
6
1
Köra Java
Bindning
Köra Java
Mjukvarudator
„
Java Virtual Machine (JVM)
Bindning
Implementeras olika på olika plattformar
– Interpreterar Java-program (.class)
Varför i två steg?
1.
–
ƒ
Par.passing
„
Arrayer
Kompilering av källkod (.java)
–
Finns aldrig några maskinkodsfiler (exe-filer,
eller bin-filer) för användarens program
Par.passing
Build (flera filer som ska kopplas
samman)
2.
Interpretering av bytecode (.class)
Arrayer
®
Gör språket Java
plattformsoberoende!
ArrayList
®
Möjliggör dynamisk bindning
Interpretering
–
Dels operativsystemsberoende
–
Dels hårdvaru-beroende
ƒ
ƒ
ArrayList
ƒ
Solaris, Darwin, Windows
Unix, Mac, PC
Gäller speciellt grafiken
Programmering — tillämpningar och datastrukturer
Köra Java
7
Programmering — tillämpningar och datastrukturer
Köra Java
Att köra program
Bindning
Bindning
filsystem
Par.passing
Par.passing
Arrayer
RAM
8
Arrayer
cache
Compiling
import java.util.*;
import java.util.*;
…
…
myList.add(elem);
java.util.myList.add(elem);
…
…
Djur d = getNext(myList);
Djur d = getNext(myList);
d.presenteraDig();
d.presenteraDig();
förinladdning av material som
snart kommer att behövas
ArrayList
ArrayList
CPU
Programmering — tillämpningar och datastrukturer
Köra Java
Bindning
9
Varför interpreterat?
„
Polymorfism – dvs. samma namn på
metod i superklass och subklass
–
Köra Java
Ex.vis. fågel.flyga och pingvin.flyga
Par.passing
„
Arrayer
Programmering — tillämpningar och datastrukturer
Bindning
Par.passing
Problem: objekt skapas dynamiskt
under körning
–
Arrayer
Går inte att veta i förväg vilken flyga
som ska länkas in i koden
ArrayList
ArrayList
Programmering — tillämpningar och datastrukturer
11
metoddefinition
10
Polymorfism
Fågel fågel;
String fågelTyp;
fågelTyp = JOptionPane.showInputDialog(“Which bird do you
want to create, Penguin (P) or Dove (D)?");
if (fågelTyp == “P”) {
fågel = new Pingvin();
} else {
fågel = new Duva();
}
Fågel.flyga()
…
eller
fågel.flyga();
Pingvin.flyga()
Programmering — tillämpningar och datastrukturer
12
2
Köra Java
Varför interpreterat?
Bindning
Köra Java
Bindning
„
Par.passing
„
Arrayer
Omöjligt att i förväg veta vilken metod
(= kod) som kommer att behöva
exekveras
Kräver dynamisk bindning av variabel
(t.ex. flyga) till innehåll (t.ex. koden för
Pingvin.flyga)
Variabelbindning
Två sätt att veta till vilket värde en
variabel ska bindas:
Bestäms av syntaktiska strukturen
hos koden i filen
2. Bestäms av exekveringsflödet genom
koden (kontrollstrukturen)
1.
Par.passing
Arrayer
–
–
ArrayList
ArrayList
Programmering — tillämpningar och datastrukturer
Köra Java
Bindning
13
Variabelbindning (Lisp)
(let ((n 1))
(defun addn (z)
(add n z)))
Par.passing
...
Länka in detta n
eftersom definitionen
av addn sitter i den
här omgivningen
Programmering — tillämpningar och datastrukturer
Köra Java
Bindning
(addn 3))
Arrayer
„
Variabelns värde bestäms av dess
plats i programmet
–
Par.passing
detta n eftersom
anropet sker i den här
kontexten
„
Statisk bidning → 4
„
Dynamisk bindning → 5
Programmering — tillämpningar och datastrukturer
Köra Java
Bindning
Programmering — tillämpningar och datastrukturer
Köra Java
Bindning
Ex. språk med statisk bindning
„
„
Implementeras genom interpretering,
dvs. att programmet tolkas en sats i
taget under körning
Common Lisp använder statisk bindning
Fria variabler binds vid
definitionstillfället
– Hela definitionsomgivningen skickas
med när funktionen skickas som
argument till annan funktion
Par.passing
Löses genom dynamisk bindning
16
–
Par.passing
Arrayer
→ Kompilatorn ersätter variabeln med
rätt värde eller kod i exe-filen
Arrayer
15
Variabelns (funktionsnamns) värde
kan inte säkert bestämmas förrän
programmet körs
„
Binds inom närmast omslutande
programblock där variabeln är
deklarerad
ArrayList
Dynamisk bindning
„
14
Statisk bindning
(let ((n 2))
ArrayList
Kan påverkas av if-then-satser,
användarinput, etc.
Dynamisk
Arrayer
ArrayList
„
Obs! InterLisp, etc. använder dynamisk
bindning
ArrayList
Programmering — tillämpningar och datastrukturer
17
Programmering — tillämpningar och datastrukturer
18
3
Köra Java
Bindning
Java
„
Måste använda dynamisk bindning
–
Par.passing
„
Bindning
Parametrar – argument
„
P.g.a. polymorfism
Därför körs JVM interpreterat
Par.passing
Plussidan: flexibilitet
– Nackdel: långsam
–
ƒ
Arrayer
Köra Java
Just-in-time kompilering ger något
förbättrad prestanda
public static int add(int a, int b) { … }
„
ArrayList
ArrayList
Köra Java
Bindning
19
Anropssätt
„
Math.add(3,4)
Call-by-value
Köra Java
Bindning
Skicka värdet
– Kopia
„
–
„
Par.passing
Skicka en referens
Original
Arrayer
Kompromiss
Bindning
21
Call-by-name
„
Arrayer
ArrayList
Anrop misse.sättÅlder(ålder+1);
Köra Java
Bindning
Steg1: Ersätt parametern på alla
platser i metod-kroppen med ålder+1
– Steg2: Börja exekvera metoden
– Steg3: Evaluera argumentet vid behov
(dvs. om programmet hamnar där)
® Slipper evaluera ”farliga” argument
(som skulle ha gett oändlig loop)
– Argument kan komma att evalueras
flera gånger − onödigt
Programmering — tillämpningar och datastrukturer
Steg1: Evaluera ålder+1
Steg2: Lägg värdet på anropsstacken
(nytt värde, ny plats i minnet, ny
referens till platsen)
– Steg3: Lämna över kontrollen till
metoden, tillsammans med en pekare
till stacken (och värdet)
Programmering — tillämpningar och datastrukturer
–
Par.passing
Anrop: misse.sättÅlder(ålder+1);
ArrayList
Programmering — tillämpningar och datastrukturer
Köra Java
Call-by-value
–
Call-by-need
–
ArrayList
20
–
Call-by-name
–
Arrayer
Vid anrop: parametern ska bindas till
argumentet (det aktuella värdet)
Programmering — tillämpningar och datastrukturer
–
Par.passing
Argument (aktuell parameter) vid
anrop
Arrayer
„
Programmering — tillämpningar och datastrukturer
Parameter (formell parameter) när en
metod definieras
Par.passing
Arrayer
ArrayList
23
22
Viktigt om CBV eller CBN…
public static void admission(boolean highAchiever, int avgGrade) {
if (highAchiever) {
admitToMastersProgram();
} else {
evaluate(avgGrade); ...
}
}
public static void main(String[] args) {
int[] results = new int[10];
…
// register results
topStudent = true;
//
Ger körfel om
admission(topStudent, results[10]);
det evalueras!
}
Programmering — tillämpningar och datastrukturer
24
4
Köra Java
Bindning
Par.passing
Call-by-need
„
Lat evaluering
„
Fördröjd evaluering tills argumentet
faktiskt används i metoden
„
Evalueras en gång (till skillnad mot
CBN)
Bindning
ArrayList
„
Call-by-value
–
Par.passing
„
Enkel
Argumenten evalueras en gång före anrop
Call-by-name
–
Värdet sätts på anropsstacken
– Nästa gång bara att slå upp
„
Jämförelse
–
Kan undvika vissa beräkningar
ƒ
–
Arrayer
Köra Java
Arrayer
–
Kombinerar fördelarna med CBV och
CBN
Programmering — tillämpningar och datastrukturer
ƒ
ArrayList
25
Java
„
Oändliga loopar
Odefinierade operationer (div med 0)
Ger ren semantik – bevisbar
programkorrekthet
Call-by-need
Programmering — tillämpningar och datastrukturer
Köra Java
26
Skillnad på det som skickas
Bindning
„
Java kör call-by-value
„
Primitiv variabel (ex. int, double, boolean)
„
Referens
–
Par.passing
–
Innehåller själva värdet
Adress till ställe i datorns minne
Arrayer
ArrayList
Programmering — tillämpningar och datastrukturer
Köra Java
Variabler i Java
datorns RAM-minne
Bindning
int n
Par.passing
Arrayer
String namn
Programmering — tillämpningar och datastrukturer
Köra Java
Bindning
„
Evaluering ger själva referensen
–
3F02E3A1
123
–
3F02E3A2
3F02E3A5
CBV
Par.passing
„
3F02E3A3
Arrayer
3F02E3A4
Kalle
3F02E3A6
Programmering — tillämpningar och datastrukturer
28
CBV i praktiken call-by-reference
3F02E3A0
3F02E3A5
ArrayList
27
Binds vid anrop till parametern
Både anroparen och den som anropas
refererar då till samma objekt
OBS! Den som anropades kan förstöra
för anroparen
–
Kan förändra objektet som de två
referenserna pekar på
ArrayList
29
Programmering — tillämpningar och datastrukturer
30
5
Köra Java
Bindning
Arrayer
„
Samling av data
int[] minaTelNummer = new int[30]; // allokering av tillräckligt
// stort minnesutrymme
Användbara datastrukturer
Par.passing
„
Element refereras genom indexering
ringa = minaTelNummer[25];
Arrayer
„
ArrayList
// indexering
Direktinitiering:
int[] minaLottoNummer = {1 4 8 12 15}; // allok genom initiering
Programmering — tillämpningar och datastrukturer
Köra Java
Arrayer
Bindning
Köra Java
Bindning
av typen int-array
32
Arrayer
„
Snabb access
Alla element tar lika stor plats
Går att räkna ut var n:te elementet
ligger från startpunkten
– Datorn snabb på att ta fram data som
ligger på en viss minnesadress, om
man vet adressen
–
Par.passing
int[] telNr new int[5];
plats för 5 element
–
Par.passing
length-1
[0]
[1]
[2]
[3]
[4]
Arrayer
Arrayer
„
ArrayList
ArrayList
Programmering — tillämpningar och datastrukturer
Köra Java
Bindning
Objekt som innehåll
public class Pingvin {
int ålder;
String namn;
Par.passing
Arrayer
33
Programmering — tillämpningar och datastrukturer
34
Köra Java
Bindning
Arrayer
[0]
[1]
[2]
[3]
[4]
Par.passing
public Pingvin() { // konstruktor
}
Arrayer
}
ArrayList
ArrayList
Programmering — tillämpningar och datastrukturer
Konstant åtkomsttid, oberoende av
position i arrayen
35
Pingvin
Pingvin
Pingvin
Pingvin
Pingvin
namn = ”a”
namn = ”p”
namn = ”a”
namn = ”n”
namn = ” ”
andraPingvinensNamn = minArray[1].namn;
Programmering — tillämpningar och datastrukturer
36
6
Köra Java
Bindning
Arrayer
„
Kan ha array av vad som helst
Bindning
int[] tel new int[10];
Pingvin[] minaPingviner Pingvin[3];
Par.passing
„
Arrayer
Par.passing
Om man har blandade element
–
Arrayer
Test med instaceof och typomvandling
ArrayList
37
Köra Java
Arrayer
„
MÅSTE allokera utrymme i förväg!
String[] myStrings;
…
myStrings = new String[10];
Par.passing
Arrayer
Typomvandling (casting)
Object[] minaElement = new Object[5];
minaElement[0] = bok;
// initiering
minaElement[1] = pelle;
…
if minaElement[0] instanceof Bok {
Bok första = (Bok) minaElement[0];
första.bläddraTill(42);
}
ArrayList
Programmering — tillämpningar och datastrukturer
Bindning
Köra Java
„
pekar på
null
Programmering — tillämpningar och datastrukturer
Köra Java
Arrayer
Bindning
String[] myStrings;
myStrings = new String[10];
…
// fyll med inehåll
myStringsBigger = new String[20]; // ny dubbel storlek
System.arrayCopy(myStrings, 0, myStringsBigger, 0, 10);
myStrings = myStringsBigger;
Par.passing
Vad händer om 10 element visar sig
vara för litet?
Arrayer
„
ArrayList
ArrayList
Programmering — tillämpningar och datastrukturer
Köra Java
Bindning
Par.passing
39
Array av arrayer
double[][] matris = new double[3][5];
[0][0]
…
…
…
Köra Java
Par.passing
…
Arrayer
[2][0]
40
Array av arrayer
„
Egentligen en array av objekt, av
typen array
matris
matris[0]
Arrayer
[2][4]
ArrayList
ArrayList
Programmering — tillämpningar och datastrukturer
GC tar hand om gamla string-arrayen
Programmering — tillämpningar och datastrukturer
Bindning
[0][4]
38
41
matris[1]
matris[2]
Programmering — tillämpningar och datastrukturer
42
7
Köra Java
Bindning
Par.passing
ArrayList
„
Fördefinierad datatyp i Java
„
Baseras på arrays
„
Bra om man vill
Köra Java
Bindning
Par.passing
Lägga till nya element
– Men ändå kunna komma åt elementen
i vilken ordning som helst
–
Arrayer
Köra Java
43
ArrayList
„
Vad man inte kan göra
Ändra längden (kapaciteten)
–
Då slängs gamla ArrayList och en ny
skapas
Lägga in eller ta bort element utan att
behöva flytta på andra element
Programmering — tillämpningar och datastrukturer
Köra Java
Bindning
„
ArrayList jobbar med Object
„
Måste först slå in dem i en wrapper
class
–
Par.passing
–
Kan inte lägga in primitiva datatyper
Par.passing
new Integer(42);
Arrayer
ArrayList
44
Användning
ArrayList minaTal = new ArrayList();
int[] tal = {5, 7, 2, 15};
int i;
for (i = 0; i < tal.length; i++) {
minaTal.add(new Integer(tal[i]));
}
i = 0;
while (i < minaTal.size()) {
System.out.print(minaTal.get(i) + ", ");
i++;
}
wrapper
class
ArrayList
Programmering — tillämpningar och datastrukturer
Köra Java
45
ArrayList
Programmering — tillämpningar och datastrukturer
Köra Java
Bindning
46
ArrayList
[0]
[1]
[2]
Element
Element
Element
Element
Element
Element
Element
data = ”k”
data = ”l”
data = ”l”
data = ”k”
data = ”l”
data = ”l”
data = ”e”
Par.passing
ArrayList
Snabbare åtkomst än för listor
ƒ
Arrayer
Bindning
Arrayer
Ger lite mer flexibilitet är arrays
„
ArrayList
Programmering — tillämpningar och datastrukturer
Bindning
„
–
ArrayList
Arrayer
ArrayList
[0]
[1]
[2]
[3]
Par.passing
Arrayer
minaBokstäver.add(new Element(”e”));
Programmering — tillämpningar och datastrukturer
ArrayList
47
minaBokstäver.add(1, new Element(”a”));
Programmering — tillämpningar och datastrukturer
48
8
Köra Java
Bindning
ArrayList
Bindning
ArrayList
[1]
[2]
[3]
[4]
Element
Element
Element
Element
Element
[0]
[1]
[2]
[3]
[4]
Element
Element
Element
Element
Element
data = ”k”
data = ”a”
data = ”l”
data = ”l”
data = ”e”
data = ”c”
data = ”a”
data = ”l”
data = ”l”
data = ”e”
Par.passing
Arrayer
Element c = new Element(”c”);
minaBokstäver.set(0, c);
ArrayList
Programmering — tillämpningar och datastrukturer
Köra Java
Bindning
ArrayList
[0]
Par.passing
Arrayer
Köra Java
49
ArrayList
[0]
[1]
[2]
[3]
Programmering — tillämpningar och datastrukturer
Köra Java
Bindning
[4]
minaBokstäver.indexOf(c); ⇒ 0
50
Några metoder i ArrayList
Object get(int index)
Object set(int index, Object o)
Par.passing
Arrayer
Par.passing
Element
Element
Element
Element
Element
data = ”c”
data = ”a”
data = ”l”
data = ”l”
data = ”e”
int size()
boolean add(Object o)
void add(int index, Object o)
Arrayer
indexOf(Object o)
remove(int index)
ArrayList
minaBokstäver.indexOf(l); ⇒ 2
ArrayList
Programmering — tillämpningar och datastrukturer
Köra Java
51
Generiska datatyper
Bindning
Programmering — tillämpningar och datastrukturer
Köra Java
Bindning
ArrayList
Par.passing
Par.passing
ArrayList<Fågel> minaFåglar = new ArrayList<Fågel>();
// fill the list
for (i = 0; i < minaFåglar.size(); i++) {
Fågel f = minaFåglar.get(i); // no need to downcast
Arrayer
Arrayer
ArrayList
ArrayList
53
52
Generic types
…
ArrayList<Fågel>
Programmering — tillämpningar och datastrukturer
remove(Object o)
}
Without initialization: compiler error
when trying to do add();
Programmering — tillämpningar och datastrukturer
54
9