6 Speicherorganisation

Ähnliche Dokumente
Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

6 Speicherorganisation

Speicher und Adressraum

Vorlesung Programmieren

public class Test extends MiniJava { public static void main (String [] args) { write(args[0]+args[1]); } } // end of class Test

Java Virtual Machine (JVM) Bytecode

2 Eine einfache Programmiersprache

2 Eine einfache Programmiersprache

Algorithmen und Programmierung II

2 Eine einfache Programmiersprache

2 Eine einfache Programmiersprache. Variablen. Operationen Zuweisung. Variablen

2 Eine einfache Programmiersprache

Algorithmen und Datenstrukturen

Java Methoden. Informatik 1 für Nebenfachstudierende Grundmodul. Kai-Steffen Hielscher Folienversion: 1. Februar 2017

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

Tag 8 Repetitorium Informatik (Java)

Vorkurs Informatik WiSe 17/18

Informatik. Pointer (Dynamisch) Vorlesung. 17. Dezember 2018 SoSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 1

CS1005 Objektorientierte Programmierung

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Programmieren in Java

pue13 January 28, 2017

n 1. Grundzüge der Objektorientierung n 2. Methoden, Unterprogramme und Parameter n 3. Datenabstraktion n 4. Konstruktoren n 5. Vordefinierte Klassen

Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II a[0] a[1] a[2] a[3] a[n 1]

2. Unterprogramme und Methoden

CS1005 Objektorientierte Programmierung

Grundlagen der Programmierung Prof. H. Mössenböck. 6. Methoden

C# - Einführung in die Programmiersprache Methoden. Leibniz Universität IT Services

Algorithmen und Datenstrukturen II

Variablen und Parameter

Erste Java-Programme (Scopes und Rekursion)

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Informatik II SS Inhalt. Objektlebensdauer (2/3) Objektlebensdauer (1/3)

Variablen. int Flugzeug. float. I write code Hund. String. long. Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Klassenmethoden Teil 2

Programmieren I. Kapitel 12. Referenzen

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

1. Grundzüge der Objektorientierung 2. Methoden, Unterprogramme und Parameter 3. Datenabstraktion 4. Konstruktoren 5. Vordefinierte Klassen

7. Verkettete Strukturen: Listen

Schwerpunkte. Verkettete Listen. Verkettete Listen: 7. Verkettete Strukturen: Listen. Überblick und Grundprinzip. Vergleich: Arrays verkettete Listen

Einführung in die Programmierung Blockkurs Java

Einstieg in die Informatik mit Java

Software Entwicklung 1

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Schnittstellen, Stack und Queue

Vorkurs Informatik WiSe 16/17

Klassenvariablen, Klassenmethoden

Einstieg in die Informatik mit Java

II. Grundlagen der Programmierung. Beispiel: Merge Sort. Beispiel: Merge Sort (Forts. ) Beispiel: Merge Sort (Forts. )

Einstieg in die Informatik mit Java

Programmieren I. Methoden-Spezial Heusch --- Ratz 6.1, Institut für Angewandte Informatik

Prüfung Softwareentwicklung II (IB)

Dynamische Speicherverwaltung

Programmieren I. Methoden-Special Heusch --- Ratz 6.1, Institut für Angewandte Informatik

Implementieren von Klassen

AuD-Tafelübung T-B5b

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Software Entwicklung 1. Rekursion. Beispiel: Fibonacci-Folge I. Motivation. Annette Bieniusa / Arnd Poetzsch-Heffter

II.3.1 Rekursive Algorithmen - 1 -

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Klausur zur Lehrveranstaltung. Technische Informatik für Ingenieure WS 2009/10

Programmiertechnik Methoden, Teil 2

Vererbung, Polymorphie

Programmierung für Mathematik HS11

Technische Universität München WiSe 2018/19 Fakultät für Informatik Übungsblatt 6 Dr. Ch. Herzog 26. November 2018

Fakultät IV Elektrotechnik/Informatik

Java Referenzdatentypen genauer betrachtet

5.4 Arrays. Oft müssen viele Werte gleichen Typs gespeichert werden. Idee: Lege sie konsekutiv ab! Greife auf einzelne Werte über ihren Index zu!

Informatik II - Tutorium 5

Algorithmen und Datenstrukturen

Informatik - Übungsstunde

Informatik II. Woche 13, Giuseppe Accaputo

Algorithmen und Datenstrukturen

Informatik II Übung 05. Benjamin Hepp 3 April 2017

To know recursion, you must first know recursion. Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel 17 1

Methoden und Wrapperklassen

Vorkurs C++ Programmierung

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2017/18. Vorbereitende Aufgaben

Objektorientierte Programmierung

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

Betriebssysteme. Wintersemester Kapitel 3 Speicherverwaltung. Patrick Kendzo

C++ - Objektorientierte Programmierung Konstante und statische Elemente

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Objektorientierte Programmierung (ZQ1u2B)

Programmiertechnik Übungen zu Klassen & -methoden

Klausur Kompaktkurs Einführung in die Programmierung Dr. T. Weinzierl & M. Sedlacek 25. März 2011

Martin Unold INFORMATIK. Geoinformatik und Vermessung

1 Einleitung Generizität Syntax... 2

Technische Informatik 1 Übung 2 Assembler (Rechenübung) Georgia Giannopoulou (ggeorgia@tik.ee.ethz.ch) 22./23. Oktober 2015

Einstieg in die Informatik mit Java

Java Einführung Methoden. Kapitel 6

Klausur Software-Entwicklung März 01

Grundlagen der Programmierung Prof. H. Mössenböck. 10. Klassen

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Zeiger in C und C++ Zeiger in Java und C/C++

Allgemeine Hinweise:

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

12 Abstrakte Klassen, finale Klassen und Interfaces

Transkript:

Der Speicher des Programms ist in verschiedene Speicherbereiche untergliedert Speicherbereiche, die den eigentlichen Programmcode und den Code der Laufzeitbibliothek enthalten; einen Speicherbereich für globale/statische Variablen; einen Speicherbereich Heap, und einen Speicherbereich Stack. Variablen werden üblicherweise auf dem Heap oder dem Stack gespeichert. Adressraum. Heap Stack Globale Variablen Bibliotheksfunktionen Program.

Heap vs. Stack vs. statisch Heap Auf dem Heap können zur Laufzeit zusammenhängende Speicherbereiche angefordert werden, und in beliebiger Reihenfolge wieder freigegeben werden. Stack Der Stack ist ein Speicherbereich, auf dem neue Elemente oben gespeichert werden, und Freigaben in umgekehrter Reihenfolge (d.h. oben zuerst) erfolgen müssen (LIFO = Last In First Out). Statische Variablen Statische Variablen werden zu Beginn des Programms angelegt, und zum Ende des Programms wieder gelöscht. In Java müssen Elemente auf dem Heap nicht explizit wieder freigegeben werden. Diese Freigabe übernimmt der Garbage Collector. Harald Räcke 143

Statische Variablen Statische Variablen (auch Klassenvariablen) werden im Klassenrumpf ausserhalb einer Funktion definiert. Jede Funktion der Klasse kann dann diese Variablen benutzen; deshalb werden sie manchmal auch globale Variablen genannt. Harald Räcke 144

Beispiel Statische Variablen 1 public class GGT extends MiniJava { 2 static int x, y; 3 static void readinput() { 4 x = read(); 5 y = read(); 6 } 7 public static void main (String[] args) { 8 readinput(); 9 while (x!= y) { 10 if (x < y) 11 y = y - x; 12 else 13 x = x - y; 14 } 15 write(x); 16 } 17 } Harald Räcke 145

Verwendung des Heaps Speicherallokation mit dem Operator new: i n t [ ] [ ] arr ; arr = new i n t [ 1 0 ] [ ] ; // array mit int - Verweisen Immer wenn etwas mit new angelegt wird, landet es auf dem Heap. Wenn keine Referenz mehr auf den angeforderten Speicher existiert kann der Garbage Collector den Speicher freigeben: i n t [ ] [ ] arr ; arr = new i n t [ 1 0 ] [ ] ; // array mit int - Verweisen arr = null ; // j e t z t koennte GC freigeben Harald Räcke 146

Verwendung des Heaps Beispiel: 1 public static int[] readarray(int number) { 2 // number = Anzahl zu lesender Elemente 3 int[] result = new int[number]; 4 for (int i = 0; i < number; ++i) { 5 result[i] = read(); 6 } 7 return result; 8 } 9 public static void main(string[] args) { 10 readarray(6); 11 } Da die von readarray zurückgegebene Referenz nicht benutzt wird, kann der GC freigeben. Harald Räcke 147

Verwendung des Heaps Beispiel: 1 public static void main(string[] args) { 2 int[] b = readarray(6); 3 int[] c = b; 4 b = null; 5 } Da c immer noch eine Referenz auf das array enthält erfolgt keine Freigabe. Harald Räcke 148

Verwendung des Stacks Bei Aufruf einer Funktion (auch main()) werden lokale Variablen (d.h. auch Werte von aktuellen Parametern) und die Rücksprungadresse als Frames auf dem Stack gespeichert. Während der Programmausführung sind nur die Variablen im obersten Frame zugreifbar. Bei der Beendigung einer Funktion wird der zugehörige Stackframe gelöscht. Harald Räcke 149

Parameterübergabe Call-by-Value public s t a t i c void setvar ( i n t z ) { z = 1; } setvar() setvar() public s t a t i c void main ( String [ ] args ) z{ 0 kopiere den Wert i n t x ; ret 0FDA von x in die lokale x = 0; Animation ist nur in der main() Variable z setvar ( x ) ; Vorlesungsversion der Folien x 0 args 2B80 vorhanden. write ( "x == " + x ) ; main() } x args 2B80 z ret 1 0FDA Stack Das ist die einzige Form der Parameterübergabe, die Java unterstützt. Die Variable, die wir bei dem Aufruf übergeben, verändert ihren Wert nicht. Harald Räcke 150

Parameterübergabe Call-by-Reference ret 0FDA public s t a t i c void setvar ( i n t &z ) { z = 1; setvar() } &z 0DA7 ret 0FDA kopiere die Adresse public s t a t i c void main ( String [ ] args main() ) { von x in die lokale i n t x ; Referenzvariable z Animation ist nur in der x 1 args 2B80 x = 0; Vorlesungsversion der Folien main() setvar ( x ) ; vorhanden. x 0 args 2B80 } write ( "x == " + x ) ; setvar() &z main() x 0DA7 args Stack 2B80 Diese Form der Parameterübergabe ist in Java nicht möglich, aber z.b. in C++. Harald Räcke 151

Parameterübergabe Referenzvariablen Auch Referenzvariablen werden per call-by-value übergeben. Man kann den Inhalt des zugehörigen Objekts/Arrays aber verändern. public s t a t i c void setvar ( i n t [ ] a ) { a [ 1 ] = 1; } arr a public s t a t i c void main ( String [ ] args ) { // i n i t i a l i z e array elements to 0 i n t [ ] arr = new i n t [ 3 ] ; 0 10 0 } setvar ( arr ) ; write ( " arr [ 1 ] == " + arr [ 1 ] ) ; Ausgabe: arr[1] == 1

Parameterübergabe Referenzvariablen Wenn man das Objekt selber verändert, ist die Änderung nicht nach aussen sichtbar. public s t a t i c void setvar ( i n t [ ] a ) { a = new i n t [ 3 ] ; a [ 1 ] = 1; } public s t a t i c void main ( String [ ] args ) { // i n i t i a l i z e array elements to 0 i n t [ ] arr = new i n t [ 3 ] ; setvar ( arr ) ; write ( " arr [ 1 ] == " + arr [ 1 ] ) ; } arr a 0 0 0 0 10 0 Ausgabe: arr[1] == 0

Rekursive Funktionen ret 17B2 tmp 2 n 3 fak() ret 17B2 tmp n 3 Rekursive Funktionen sind Funktionen, die sich selber aufrufen fak() (eventuell über Umwege). ret 17B2 tmp 24 n 4 Beispiel: Fakultätsberechnung fak() { ret 17B2 tmp 6 n 4 1 n = 0 n! = fak() n (n 1)! sonst ret 17B2 tmp n 4 Animation ist nur in der public s t a t i c long fak ( i n t n ) { fak() Vorlesungsversion der Folien long tmp; ret 0FDA tmp 120 n 5 vorhanden. fak() i f ( n > 0) { ret 0FDA tmp 24 n 5 tmp = fak ( n- 1 ) ; fak() tmp *= n ; ret 0FDA tmp n 5 return tmp; } else return 1; } Stack

Vollständiger Code 1 public class Fakultaet { 2 public static long fak(int n) { 3 if (n > 0) 4 return n*fak(n-1); 5 else 6 return 1; 7 } 8 public static void main(string args[]) { 9 System.out.println(fak(20)); 10 } 11 } Harald Räcke 155

Fibonaccizahlen { n 0 n 1 F n = F n 1 + F n 2 n 2 13 21 2 3 1 1 5 8

Vollständiger Code 1 public class Fibonacci { 2 public static long fib(int n) { 3 if (n > 1) 4 return fib(n-1)+fib(n-2); 5 else 6 return n; 7 } 8 9 public static void main(string args[]) { 10 System.out.println(fib(50)); 11 } 12 } Harald Räcke 157

Fibonaccizahlen Programmlauf benötigt mehr als 1min. Warum ist das so langsam? Fn Fn 1 Fn 2 Fn 2 Fn 3 Fn 3 Fn 4 Fn 3 Fn 4 Fn 4 Fn 5 Fn 4 Fn 5 Fn 5 Fn 6 Fn 4 Fn 5 Fn 5 Fn 6 Fn 5 Fn 6 Fn 6 Fn 7 Fn 5 Fn 6 Fn 6 Fn 7 Fn 6 Fn 7 Fn 7 Fn 8 Wir erzeugen viele rekursive Aufrufe für die gleichen Teilprobleme!

Fibonaccizahlen Lösung Speichere die Lösung für ein Teilproblem in einer globalen Variable. Wenn das Teilproblem das nächste mal gelöst werden soll braucht man nur nachzuschauen... Harald Räcke 159

Vollständiger Code 1 public class FibonacciImproved { 2 // F 93 does not fit into a long 3 static long[] lookup = new long[93]; 4 5 public static long fib(int n) { 6 if (lookup[n] > 0) return lookup[n]; 7 8 if (n > 1) { 9 lookup[n] = fib(n-1)+fib(n-2); 10 return lookup[n]; 11 } else 12 return n; 13 } 14 public static void main(string args[]) { 15 System.out.println(fib(50)); 16 } 17 }