Informatik II Übung 04

Ähnliche Dokumente
Praktikum Compilerbau Sitzung 9 Java Bytecode

1. Typen und Literale (6 Punkte) 2. Zuweisungen (6 = Punkte)

II.1.1. Erste Schritte - 1 -

Objektorientierte Programmierung

Java-Schulung Grundlagen

Bäume. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 10: Collections 4. Inhalt. Bäume. Einführung. Bäume.

Primitive Datentypen

Einführung Datentypen Verzweigung Schleifen. Java Crashkurs. Kim-Manuel Klein May 4, 2015

Programmierung 2. Übersetzer: Code-Erzeugung. Sebastian Hack. Klaas Boesche. Sommersemester

Grundlagen zur nebenläufigen Programmierung in Java

Java: Eine Übersicht. Dennis Giffhorn. Lehrstuhl für Programmierparadigmen Universität Karlsruhe

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Programmentwicklung ohne BlueJ

Einführung in die Programmierung für Wirtschaftsinformatik

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

1. Erste Schritte 2. Einfache Datentypen 3. Anweisungen und Kontrollstrukturen 4. Verifikation 5. Reihungen (Arrays)

1.2 Attribute und Methoden Aufbau einer Java-Klasse:

Abstrakte Datentypen.

Informatik II. /* c) Baumstruktur in einen String schreiben und zurueckgeben */ public String tostring() {

Gliederung Grundlagen Schlüsselworte try-catch Fehlerobjekte Fehlerklassen Schlüsselwort finally Schlüsselwort throws selbst erstellte Exceptions

Große Übung Praktische Informatik 1

Java für C++ Programmierer

Einführung in die Programmierung

Einführung in Javadoc

13 Java 4 - Entwurfsmuster am Beispiel des Rucksackproblems

Informatik II. PVK Part1 Severin Wischmann n.ethz.ch/~wiseveri

Vorkurs Informatik WiSe 15/16

J.5 Die Java Virtual Machine

Java Reflection. Meta-Programmierung mit der java.lang.reflection API. Prof. Dr. Nikolaus Wulff

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Datenbankanwendungsprogrammierung Crashkurs Java

Tutorium Java Ein Überblick. Helge Janicke

1 Polymorphie (Vielgestaltigkeit)

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

Einstieg in die Informatik mit Java

Aufgabenblatt Nr. 5 Generizität und TicTacToe

Probeklausur: Programmierung WS04/05

Kontrollstrukturen, Pseudocode und Modulo-Rechnung

Praktikum Informatik II Prof. Dr. Martin Trauth, Dr. Michael Männel

Erster Kontakt mit Java und Pseudocode

public class SternchenRechteckGefuellt {

Musterlösungen zur Klausur Informatik 3

Probeklausur: Programmierung WS04/05

5. Tutorium zu Programmieren

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

Java: Vererbung. Teil 3: super()

Verteilte Systeme CS5001

JAVA - Methoden

Java Virtual Machine (JVM) Übersicht

Vorlesung Informatik II

Speicherstrukturen. Aufgabe 1-1: Fragen zu FAT (File Allocation Table) Aufgabe 1-2: Datensätze variabler Länge. Kind.java:

Wiederholung Wozu Methoden? Methoden Schreiben Methoden Benutzen Rekursion?! Methoden. Javakurs 2012, 3. Vorlesung

Versuchsziele Kenntnisse in der Anwendung von: Sortieren mit Klassen Benutzung von generischen Klassen o Definition o Sortierung.

Programmdokumentation

Software-Engineering Software-Management

1. Der Einstieg in Java. Was heißt Programmieren?

Übung 9. Quellcode Strukturieren Rekursive Datenstrukturen Uebung 9

Übung zur Vorlesung Einführung in Software Engineering

(06 - Anwendungen von Stapeln und Schlangen)

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Programmieren in Java

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

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

Binärbäume. Prof. Dr. E. Ehses,

Objektorientierte Programmierung

im Rahmen des Seminars - Programmiersprachen Markus Nestvogel

Softwaretechnologie - Wintersemester 2012/ Dr. Günter Kniesel

Programmierung. Programme, Compiler, virtuelle Maschinen, Java

Programmierung in C. Grundlagen. Stefan Kallerhoff

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.

Eclipse 3.0 (Windows)

IT- Handbuch für Fachinformatiker, 7. Auflage: Text- Lösungen Sascha Kersken

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Übungen Informatik I. JAVA - Einführung. elga Gabler, Holger Vogelsang, Christian Pape. Übungen Informatik 1 Folie 1

Grundlagen von Python

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Lösungsvorschläge. zu den Aufgaben im Kapitel 4

Rainer Stropek cubido. Baumschule Expression Trees in C#, CLR und DLR

Buffer Overflow 1c) Angriffsstring: TTTTTTTTTTTTTTTT (16x) Beachte: Padding GCC-Compiler Zusatz: gcc O2 verhindert hier den Angriff (Code Optimierung)

1. Der Einstieg in Java

Karlsruher Institut für Technologie

Beispiel: DB-Mock (1/7)

Software Engineering I

TCP/IP Programmierung. C# TimeServer Java6 TimeClient

Test zu Grundlagen der Programmierung Leitung: Michael Hahsler. 21. November 2003

Vergleich verschiedener OO-Programmiersprachen

Java Programmierung auf der Konsole / unter Eclipse

Rekursion. Was heißt "rekursiv" Page 1. Eine Methode m() heißt rekursiv, wenn sie sich selbst aufruft. Beispiel: Berechnung der Fakultät (n!

Aufgabe 1. »Programmieren«, WS 2006/2007. Nino Simunic M.A.

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Fehler die bei der Programmerstellung passieren können teilweise vom Compiler erkannt werden

Programmierkurs Java

Java für Anfänger Teil 1: Intro. Programmierkurs Manfred Jackel

Transkript:

Informatik II Übung 04 Michael Baumann mbauman@student.ethz.ch n.ethz.ch/~mbauman 23.03.2016

Ablauf 1) Nachbesprechung Serie 3 2) Stacks 3) Vorbesprechung Serie 4 4) Bytecode und Assembler 2

Ablauf 1) Nachbesprechung Serie 3 2) Stacks 3) Vorbesprechung Serie 4 4) Bytecode und Assembler 3

Serie 3 4

Serie 3 Aufgabe 1 public static String decrypt(string s) { StringBuffer buf = new StringBuffer(""); for(int i = 0; i < s.length(); ++i) { buf.append((char)(s.charat(i) - 3)); return buf.tostring(); Encrypt: 4092 ms, decrypt: 42 ms (mein PC) Bei encrypt wird bei jeder Änderung der ganze String kopiert Strings sind dafür schneller bei lesenden Zugriffen z. B. suchen 5

Serie 3 Aufgabe 2 a): X2 : Var: ~. (~X1 ): ~(X1 OR ~X 2 ): (X2 ) OR (~X 1 OR X 2 ): Clause: ( Var ) b) OR (X1 OR X 2 ) AND (~X 1 ): Expr: (X1 ) AND (~X 1 OR ~X 2 ) AND (X 2 ): Clause AND Clause 6

Serie 3 Aufgabe 2 a): X2 : nicht erzeugbar Var: ~. (~X1 ): ~(X1 OR ~X 2 ): (X2 ) OR (~X 1 OR X 2 ): Clause: ( Var ) b) OR (X1 OR X 2 ) AND (~X 1 ): Expr: (X1 ) AND (~X 1 OR ~X 2 ) AND (X 2 ): Clause AND Clause 7

Serie 3 Aufgabe 2 a): X2 : nicht erzeugbar Var: ~. (~X1 ): erzeugbar ~(X1 OR ~X 2 ): (X2 ) OR (~X 1 OR X 2 ): Clause: ( Var ) b) OR (X1 OR X 2 ) AND (~X 1 ): Expr: (X1 ) AND (~X 1 OR ~X 2 ) AND (X 2 ): Clause AND Clause 8

Serie 3 Aufgabe 2 a): X2 : nicht erzeugbar Var: ~. (~X1 ): erzeugbar ~(X1 OR ~X 2 ): nicht erzeugbar (X2 ) OR (~X 1 OR X 2 ): Clause: ( Var ) b) OR (X1 OR X 2 ) AND (~X 1 ): Expr: (X1 ) AND (~X 1 OR ~X 2 ) AND (X 2 ): Clause AND Clause 9

Serie 3 Aufgabe 2 a): X2 : nicht erzeugbar Var: ~. (~X1 ): erzeugbar ~(X1 OR ~X 2 ): nicht erzeugbar (X2 ) OR (~X 1 OR X 2 ): nicht erzeugbar b) (X1 OR X 2 ) AND (~X 1 ): (X1 ) AND (~X 1 OR ~X 2 ) AND (X 2 ): Expr: Clause: Clause AND ( Var OR Clause ) 10

Serie 3 Aufgabe 2 a): X2 : nicht erzeugbar Var: ~. (~X1 ): erzeugbar ~(X1 OR ~X 2 ): nicht erzeugbar (X2 ) OR (~X 1 OR X 2 ): nicht erzeugbar b) (X1 OR X 2 ) AND (~X 1 ): erzeugbar (X1 ) AND (~X 1 OR ~X 2 ) AND (X 2 ): erzeugbar Expr: Clause: Clause AND ( Var OR Clause ) 11

Serie 3 Aufgabe 3 Warum nicht in Knoten? 12

Serie 3 Aufgabe 3 b) public class KD { // string parsing public static void parse(string kd) throws ParseException; // parse helpers (entity parsing) private static int parsetree(string kd, int position) throws ParseException; private static int parsesubtree(string kd, int position) throws ParseException; private static int parsenode(string kd, int position) throws ParseException; // atomic helpers (single character parsing) private static boolean checkchar(char expected, String kd, int position); 13

Serie 3 Aufgabe 3 b) public static void parse(string kd) throws ParseException { int offset = parsetree(kd, 0); if(offset!= kd.length()) { throw new ParseException("and the tree dies suddenly", offset); 14

Serie 3 Aufgabe 3 b) public static boolean checkchar(char c, String kd, int position) { if (position < kd.length()) return kd.charat(position) == c; return false; 15

Serie 3 Aufgabe 3 b) private static int parsetree(string kd, int position) throws ParseException { if(checkchar('-', kd, position)) { return position + 1; Baum Baum Node ( Unterbaum ) 16

Serie 3 Aufgabe 3 b) private static int parsetree(string kd, int position) throws ParseException { if(checkchar('-', kd, position)) { return position + 1; position = parsenode(kd, position); Baum return position; Baum Node ( Unterbaum ) 17

Serie 3 Aufgabe 3 b) private static int parsetree(string kd, int position) throws ParseException { if(checkchar('-', kd, position)) { return position + 1; position = parsenode(kd, position); if(checkchar('(', kd, position)) { if(!checkchar(')', kd, position)) throw new ParseException("expected ')'", position); position++; return position; Baum Baum Node ( Unterbaum ) 18

Serie 3 Aufgabe 3 b) private static int parsetree(string kd, int position) throws ParseException { if(checkchar('-', kd, position)) { return position + 1; position = parsenode(kd, position); if(checkchar('(', kd, position)) { position++; position = parsesubtree(kd, position); if(!checkchar(')', kd, position)) throw new ParseException("expected ')'", position); position++; return position; Baum Baum Node ( Unterbaum ) 19

Serie 3 Aufgabe 3 b) private static int parsesubtree(string kd, int position) throws ParseException { position = parsetree(kd, position); return position; parsechildren() Nachfolger Baum, 20

Serie 3 Aufgabe 3 b) private static int parsesubtree(string kd, int position) throws ParseException { position = parsetree(kd, position); while (checkchar(',', kd, position)) { position += 1; position = parsetree(kd, position); return position; parsechildren() Nachfolger Baum, 21

Serie 3 Aufgabe 3 b) private static int parsenode(string kd, int position) throws ParseException { if (position >= kd.length()) throw new ParseException("Expected a node", position); char c = kd.charat(position); if (Character.isUpperCase(c)) return position + 1; else throw new ParseException(String.format( "'%c' is not a valid node name", c), position); 22

Demo: Debugging mit Eclipse 23

Stacks 24

Stacks: Theorie Stack = Stapel Nur auf oberstes Element Zugriff LIFO Beispiele Funktionsstack (siehe Aufgabe 3 und TI1 im 3. Semester) Klammerung 25

Beispiel: Klammercheck public static boolean check(string s) { Stack<Character> stack = new Stack<Character>(); for(int i = 0; i < s.length(); i++) { switch(s.charat(i)) { case '(': stack.push('('); break; case ')': if(stack.isempty()) { return false; if(stack.pop()!= '(') { return false; break; return stack.isempty(); 26

Serie 3 27

Aufgabe 1 Konstruktor Array mit gegebener Kapazität initialisieren tostring() Format: [i0, i1,, i(n-1)] StringBuffer: buf.append( earp ); 28

Aufgabe 1 grow() Kapazität verdoppeln, kopieren Arrays.copyOf(...) push(), pop(), empty() Falls nötig grow aufrufen peek() Oberstes Element zurückgeben aber nicht entfernen size() Aktuelle Grösse capacity() Wie viele Elemente passen hinein? 29

Aufgabe 2 Ackermann-Funktion Wächst extrem schnell: A(3, 3) = 61 Wilhelm Ackermann (1986 1962, Deutchland) A(4, 2) 1019729 Sinn: Die theoretischen Informatiker findens cool :) 30

Aufgabe 2 b) Pseudocode Nicht sprachspezifisch Alles erlaubt, so lange man es versteht selbsterklärend 31

Aufgabe 2 b) Pseudocode Bitte kein Brainfuck (https://en.wikipedia.org/wiki/brainfuck) >++++++++[<++++++++ >-]<++.>++++++[<+++++++ >-]<++++++.>++++[<---- >-]<-.>++[<+++ >-]<++.+++++.>++[<--- >-]<--.>+++ [<++++ >-]<+++.>++++[<---- >-]<--.>++[<+++ >-]<++.>++++++++[<--------- >-]<---.>++++++++[<+++++++++ >-]<+.>+++[<+++ >-]<+. +.>+++++++++[<--------- >-]<---.>++++++++[<++++++++ >-]<+++++.++++.+++++.>+++[<--- >-]<.>++++++++[<-------- >-]<-----.>++++ +++++[<+++++++++ >-]<++.----.>++[<--- >-]<--.--.>+++[<+++ >-]<.>+++[<---- >-]<-.>+++[<++++ >-]<+..++++++.>+++[<---- >-]<---.>+ +++++++[<-------- >-]<-----.>++++++++[<++++++++ >-]<+++++.>+++[<++++ >-]<++.----.+++++.>+++[<---- >-]<---.>+++[<++++ >-]<+.>+++[<--- >-]<.>+++[<+++ >-]<+.>++++[<---- >-]<.+++++.---.>++++++++[<-------->-]<-----.>++++++[<+++++++ >-]<++++++.>++ +++[<++++++ >-]<++++.---.>++[<--- >-]<--.>+++[<+++ >-]<++.>++++[<---- >-]<-.>+++[<++++ >-]<..----.----.>+++[<++++ >-]<+.+.---.+ +.>++++[<---- >-]<-.++.+++++.---.>+++++++[<-------- >-]<-.>+++[<---- >-]<.>++++++++[<++++++++>-]<+++++.>+++[<+++ >-]<.++++ ++.+++.>++[<--- >-]<--.+++.>+++[<---- >-]<.-.>+++[<+++>-]<.>++++++++[<--------- >-]<------.>+++++++++[<+++++++++ >-]<++++ +.>++[<--->-]<-.--.>++++++++[<--------- >-]<-----.>+++++++[<+++++++ >-]<++.>++++[<++++ >-]<.+++++.>+++[<++++ >-]<+++.>+++ +[<---- >-]<--.++++.>++++[<++++ >-]<+.>++++[<----- >-]<-.>+++[<++++ >-]<+.>+++++++++[<--------- >-]<-.>+++++++[<+++++++ >-]<++++.>+++++[<+++++>-]<++++.>++++[<---- >-]<.-.>+++[<++++ >-]<+.>++++++++[<--------- >-]<------.>++++++[<+++++++ >-]<+ ++.>++++++[<++++++ >-]<++++.>++++[<---- >-]<.>++[<+++ >-]<+..>++[<--->-]<-.>+++[<++++ >-]<+.>+++++++++[<--------- >-]<-.>+ ++++++++[<+++++++++ >-]<++++.>++[<--- >-]<--.>++++++++[<--------- >-]<-----.>++++[<++++ >-]<+.>++[<+++ >-]<++..------.-----.>+ ++[<---- >-]<--.>++++++[<++++++ >-]<.>++++++[<++++++ >-]<+.----.>++++++++[<-------- >-]<-----.>+++++++[<+++++++ >-]<++.>++ +++[<+++++ >-]<++++.++.>++++[<---->-]<-.++.+++++.---.>++++++++[<-------- >-]<-----.>+++++++++[<+++++++++ >-]<++++++.>+++ [<---- >-]<--.>+++[<+++ >-]<.>+++[<---- >-]<--.>++++++++[<-------- >-]<----.>++++++++[<+++++++++ >-]<+++++.>+++[<---- >-]<.>++ +[<++++ >-]<+.>+++[<--- >-]<--.+++++.+++++.>+++[<---- >-]<.>+++[<+++ >-]<++.>++++++++[<--------- >-]<----.>++++++++[<++++++ ++ >-]<+.>++++[<+++++ >-]<.>++++[<---- >-]<--.+++++.>++++++++[<--------- >-]<.>+++++[<++++++>-]<++++.>++++++[<+++++++ >-]<++++++.>++++[<---- >-]<-.>++[<+++ >-]<++.+++++.>++[<--- >-]<--.>+++++++[<-------- >-]<----.>+++++++[<++++++++ >-]<+.>++ [<+++ >-]<++.>+++++++[<-------- >-]<-------.>+++[<---- >-]<.>+++++[<++++++ >-]<++++.>++++++[<+++++++>-]<++++++.>++++[<---- >-]<-.>++[<+++ >-]<++.+++++.>++[<--- >-]<--.>+++++++[<-------->-]<----...>+++[<--- >-]<-.>++++++++[<+++++++++ >-]<+++++++.>+ ++[<--- >-]<--.+.>+++[<++++ >-]<+.>+++++++++[<--------- >-]<-.>+++++[<++++++ >-]<++++.++++.>++++++[<------ 32

Aufgabe 2 c) Ackermann: N 2 N Braucht zwei Argumente, gibt ein Resultat zurück Die Argumente sind immer zuoberst auf dem Stack Was, wenn nur noch eine Zahl auf dem Stack liegt? Stack stack = new Stack(); stack.push(4); stack.push(7); while(stack.size()!= 1) {... Benutzt Stack aus A1 oder (falls ihr A1 nicht geschafft habt) java.util.stack<integer> 33

Aufgabe 3 Vergleich C / C++ Java C wird für eine bestimmte Architektur kompiliert und kann dort direkt ausgeführt werden Java wird zu Bytecode kompiliert Dieser wird von der Java Virtual Machine interpretiert 34

Aufgabe 3: Beispiel: C++ int function(int a, int b) { return a + b; int main() { printf("%d\n", function(1, 2)); return 0; 35

Aufgabe 3: Beispiel Assember (Linux) 0000000000000000 <function>: 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp 4: 89 7d fc mov %edi,-0x4(%rbp) 7: 89 75 f8 mov %esi,-0x8(%rbp) a: 8b 45 f8 mov -0x8(%rbp),%eax d: 8b 55 fc mov -0x4(%rbp),%edx 10: 01 d0 add %edx,%eax 12: 5d pop %rbp 13: c3 retq 0000000000000014 <main>: 14: 55 push %rbp 15: 48 89 e5 mov %rsp,%rbp 18: be 02 00 00 00 mov $0x2,%esi 1d: bf 01 00 00 00 mov $0x1,%edi 22: e8 00 00 00 00 callq 27 <main+0x13> 27: 89 c6 mov %eax,%esi 29: bf 00 00 00 00 mov $0x0,%edi 2e: b8 00 00 00 00 mov $0x0,%eax 33: e8 00 00 00 00 callq 38 <main+0x24> 38: b8 00 00 00 00 mov $0x0,%eax 3d: 5d pop %rbp 3e: c3 retq 36

Aufgabe 3: Beispiel Assember (AVR) 00000000 <function>: 0: cf 93 push r28 2: df 93 push r29 4: 00 d0 rcall.+0 ; 0x6 <function+0x6> 6: cd b7 in r28, 0x3d ; 61 8: de b7 in r29, 0x3e ; 62 a: 89 83 std Y+1, r24 ; 0x01 c: 6a 83 std Y+2, r22 ; 0x02 e: 99 81 ldd r25, Y+1 ; 0x01 10: 8a 81 ldd r24, Y+2 ; 0x02 12: 89 0f add r24, r25 14: 0f 90 pop r0 16: 0f 90 pop r0 18: df 91 pop r29 1a: cf 91 pop r28 1c: 08 95 ret 0000001e <main>: 1e: cf 93 push r28 20: df 93 push r29 22: cd b7 in r28, 0x3d ; 61 24: de b7 in r29, 0x3e ; 62... 26: 62 e0 ldi r22, 0x02 ; 2 28: 81 e0 ldi r24, 0x01 ; 1 2a: 00 d0 rcall.+0 ; 0x2c <main+0xe> 2c: 88 2f mov r24, r24 2e: 90 e0 ldi r25, 0x00 ; 0 30: 29 2f mov r18, r25 32: 2f 93 push r18 34: 8f 93 push r24 36: 80 e0 ldi r24, 0x00 ; 0 38: 90 e0 ldi r25, 0x00 ; 0 3a: 89 2f mov r24, r25 3c: 8f 93 push r24 3e: 80 e0 ldi r24, 0x00 ; 0 40: 90 e0 ldi r25, 0x00 ; 0 42: 8f 93 push r24 44: 00 d0 rcall.+0 ; 0x46 <main+0x28> 46: 0f 90 pop r0 48: 0f 90 pop r0 4a: 0f 90 pop r0 4c: 0f 90 pop r0 4e: 80 e0 ldi r24, 0x00 ; 0 50: 90 e0 ldi r25, 0x00 ; 0 52: df 91 pop r29 54: cf 91 pop r28 56: 08 95 ret 37

Aufgabe 3: Vergleich Java public class Bytecode { public static int function(int a, int b) { return a + b; public static void main(string[] args) { System.out.println(function(1, 2)); 38

Aufgabe 3: Java Bytecode public class Bytecode { public Bytecode(); Code: 0: aload_0 1: invokespecial #8 // Method java/lang/object."<init>":()v 4: return public static int function(int, int); Code: 0: iload_0 1: iload_1 2: iadd 3: ireturn public static void main(java.lang.string[]); Code: 0: getstatic #21 // Field java/lang/system.out:ljava/io/printstream; 3: iconst_1 4: iconst_2 5: invokestatic #27 // Method function:(ii)i 8: invokevirtual #29 // Method java/io/printstream.println:(i)v 11: return 39

Aufgabe 3 Versucht, den Bytecode zu verstehen Wie funktioniert Rekursion intern auf dem Prozessor? Ausführung: javac JavaTip.java //compiler java JavaTip //run javap c private JavaTip //disassembler Oder einfach Class File ins Eclipse reinziehen 40

Happy Hasensuchen! 41