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