Einführung in die Systemprogrammierung
|
|
- Angelika Meyer
- vor 7 Jahren
- Abrufe
Transkript
1 Einführung in die Systemprogrammierung Prof. Dr. Christoph Reichenbach Fachbereich 12 / Institut für Informatik 9. Juli 2015
2 Sprachen vs. Übersetzer Sprache C11 Übersetzer GNU C Compiler Intel C Compiler LLVM/Clang Sprachen können verschiedene Implementierungen haben: Übersetzer Interpreter Laufzeit-Übersetzer
3 Sprachen vs. Übersetzer Sprache C11 Übersetzer GNU C Compiler Intel C Compiler LLVM/Clang Sprachen können verschiedene Implementierungen haben: Übersetzer Interpreter Laufzeit-Übersetzer Sprachdefinition vereinigt Sprachimplementierungen
4 Die Struktur von Programmiersprachen Sprachdefinition gibt an: Lexikalische Sprachstruktur (Lexeme/Tokens) Grammatische Sprachstruktur (Syntax) Sprachsemantik: Statische Semantik Semantik der Namen: Welcher Name bindet an welche Definition? Semantik der Typen: Welche Typen können wie miteinander verknüpft werden? Dynamische Semantik Laufzeitverhalten des Programmes Beinhaltet meist: Reihenfolge und Inhalt von Ein- und Ausgaben Beinhaltet meist nicht: Ausführungsgeschwindigkeit, benötigter Speicherplatz Optimierungen müssen Sprachsemantik erhalten!
5 Der Übersetzer C-Programm Frontend Middle-End Backend Optimierung Assembler-Code
6 Der Übersetzer C-Programm Frontend Middle-End Backend Optimierung Assembler-Code
7 Der Übersetzer C-Programm Frontend Lexikalische Analyse Syntaxanalyse Namensanalyse Typüberprüfung Zwischenform Middle-End Optimierung Backend Fehlermeldungen Assembler-Code
8 Der Übersetzer C-Programm Frontend Lexikalische Analyse Syntaxanalyse Namensanalyse Typüberprüfung Zwischenform Middle-End Optimierung Backend Fehlermeldungen Assembler-Code
9 Der Übersetzer C-Programm Frontend Lexikalische Analyse Syntaxanalyse Namensanalyse Typüberprüfung Zwischenform Middle-End Optimierung Backend Registerauswahl Befehlsauswahl Codeerzeugung Fehlermeldungen Assembler-Code
10 Der Übersetzer: Frontend: Lexikalische Analyse Eingabe: { int x = L; char *c = x;
11 Der Übersetzer: Frontend: Lexikalische Analyse Eingabe: { int x = L; char *c = x; Lexikalische Analyse zerlegt Eingabe in Tokens/Lexeme Erzeugt vom Lexer (Tokenizer, Scanner) Ignoriert Leerzeichen, Zeilenumbrüche etc. (in C und C-artigen Sprachen)
12 Der Übersetzer: Frontend: Lexikalische Analyse Eingabe: { int x = L; char *c = x; Lexikalische Analyse zerlegt Eingabe in Tokens/Lexeme Erzeugt vom Lexer (Tokenizer, Scanner) Ignoriert Leerzeichen, Zeilenumbrüche etc. (in C und C-artigen Sprachen) Tokens und Lexeme: punctuator { int int identifier x punctuator = constant 17 punctuator + constant 3 long-suffix L punctuator ; char char punctuator * identifier c punctuator = identifier x punctuator ; punctuator
13 Der Übersetzer: Frontend: Parser { int x = L ; { int x = L; char *c = x; char * c = x ;
14 Der Übersetzer: Frontend: Parser declaration type-specifier declarator { int x = L ; { int x = L; char *c = x; char * c = x ;
15 Der Übersetzer: Frontend: Parser declaration initializer type-specifier declarator int-constant int-constant { int x = L ; { int x = L; char *c = x; char * c = x ;
16 Der Übersetzer: Frontend: Parser declaration initializer type-specifier declarator int-constant int-constant { int x = L ; { int x = L; char *c = x; declaration type-specifier declarator initializer char * c = x ;
17 Der Übersetzer: Frontend: Parser declaration compound-statement initializer type-specifier declarator int-constant int-constant { int x = L ; { int x = L; char *c = x; declaration type-specifier declarator initializer char * c = x ;
18 Der Übersetzer: Frontend: Parser declaration compound-statement initializer type-specifier declarator int-constant int-constant { int x = L ; { int x = L; char *c = x; declaration type-specifier declarator initializer char * c = x ; Parser erzeugt AST (Abstract Syntax Tree)
19 Frontend: Namensanalyse declaration compound-statement initializer type-specifier declarator int-constant int-constant int x L declaration type-specifier char declarator * c initializer x
20 Frontend: Namensanalyse declaration compound-statement initializer type-specifier declarator int-constant int-constant int x L declaration type-specifier char declarator * c initializer x Verwendungen von Namen werden an ihre Definitionen gebunden
21 Frontend: Typanalyse (1/2) declaration compound-statement initializer type-specifier int declarator x int int-constant int 17 + int-constant long 3 L declaration type-specifier char declarator * c char* initializer x int
22 Frontend: Typanalyse (1/2) declaration compound-statement initializer type-specifier int declarator x int int-constant int 17 + int-constant long 3 L declaration type-specifier char declarator * c char* initializer x int Typen werden an Namen gebunden
23 Frontend: Typanalyse (2/2) declaration compound-statement initializer type-specifier int declarator x int int-constant int 17 + int-constant long 3 L Γ τ(declarator) declaration = τ(initializer) type-specifier char declarator * c char* initializer x int
24 Frontend: Typanalyse (2/2) declaration compound-statement initializer type-specifier int declarator x int int-constant int-constant int long L Γ τ(declarator) declaration = τ(initializer) type-specifier Typfehler: char* int declarator initializer char * c char* x int Typregeln erzwingen Typkorrektheit
25 Der Übersetzer: Middle-End Frontend erzeugt Zwischenform des Programmes
26 Der Übersetzer: Middle-End Frontend erzeugt Zwischenform des Programmes Zwischenform hilft bei Programmanalyse: Welche Programmteile hängen voneinander ab? (Kontrollfluß/Daten) Welche Programmteile benötigen welche Ressourcen?
27 Der Übersetzer: Middle-End Frontend erzeugt Zwischenform des Programmes Zwischenform hilft bei Programmanalyse: Welche Programmteile hängen voneinander ab? (Kontrollfluß/Daten) Welche Programmteile benötigen welche Ressourcen? Middle-End optimiert Programmrepräsentierung Optimierte Zwischenform geht an Backend
28 Der Übersetzer: Optimierungen Optimierung = Programmanalyse a + Transformation t Gegeben Programm p. Falls a(p): Ergebnis von p = Ergebnis von t(p)
29 Der Übersetzer: Optimierungen Optimierung = Programmanalyse a + Transformation t Gegeben Programm p. Falls a(p): Ergebnis von p = Ergebnis von t(p) Beispiel: a[0] = 0; // A0 a[1] = a[0] ; // A1 f(); a[2] = a[0] ; // A2
30 Der Übersetzer: Optimierungen Optimierung = Programmanalyse a + Transformation t Gegeben Programm p. Falls a(p): Ergebnis von p = Ergebnis von t(p) Beispiel: a[0] = 0; // A0 a[1] = a[0] ; // A1 f(); a[2] = a[0] ; // A2 A1 auf a[1] = 0 änderbar Korrekte Programmanalysen sind konservativ: Wenn ich nicht weiß, ob ich darf, darf ich nicht
31 Der Übersetzer: Optimierungen Optimierung = Programmanalyse a + Transformation t Gegeben Programm p. Falls a(p): Ergebnis von p = Ergebnis von t(p) Beispiel: a[0] = 0; // A0 a[1] = a[0] ; // A1 f(); a[2] = a[0] ; // A2 A1 auf a[1] = 0 änderbar A2 nur auf a[2] = 0 änderbar, wenn f() nicht nach a[0] schreibt Korrekte Programmanalysen sind konservativ: Wenn ich nicht weiß, ob ich darf, darf ich nicht
32 Der Übersetzer: Backend Backend erzeugt Assembler- oder Maschinencode Unterstützt oft verschiedene Prozessoren und Aufrufkonventionen Wesentliche Aufgaben:
33 Der Übersetzer: Backend Backend erzeugt Assembler- oder Maschinencode Unterstützt oft verschiedene Prozessoren und Aufrufkonventionen Wesentliche Aufgaben: Registerauswahl: Welche Variablen in welche Register? (gesichert, temporär, Spezialregister) Andere Variablen in den Stapelspeicher
34 Der Übersetzer: Backend Backend erzeugt Assembler- oder Maschinencode Unterstützt oft verschiedene Prozessoren und Aufrufkonventionen Wesentliche Aufgaben: Registerauswahl: Welche Variablen in welche Register? (gesichert, temporär, Spezialregister) Andere Variablen in den Stapelspeicher Befehlsauswahl: Effiziente Befehle suchen, um Ausdrücke abzubilden (Direkt-Operation, Register-Operation usw.)
35 Der Übersetzer: Backend Backend erzeugt Assembler- oder Maschinencode Unterstützt oft verschiedene Prozessoren und Aufrufkonventionen Wesentliche Aufgaben: Registerauswahl: Welche Variablen in welche Register? (gesichert, temporär, Spezialregister) Andere Variablen in den Stapelspeicher Befehlsauswahl: Effiziente Befehle suchen, um Ausdrücke abzubilden (Direkt-Operation, Register-Operation usw.) Architekturspezifische Optimierungen
36 Zusammenfassung: Der Übersetzer Drei Übersetzerphasen: Frontend liest Programm ein Typanalyse und Fehlersuche Erzeugt Zwischenrepräsentation Middle-End optimiert Zwischenrepräsentation Kann übersprungen werden (schnelle Übersetzung, langsamer Code) Backend bildet Zwischenrepräsentation auf Assembler/Maschinencode ab Evtl. kleinere maschinenspezifische Optimierungen
37 Qualifizierer in C extern int sprintf(char * restrict s, const char * restrict format,...);
38 Qualifizierer in C extern int sprintf(char * restrict s, const char * restrict format,...); Typen in C können qualifiziert werden Qualifizierer wie const sind Schlüsselwörter, die als Teil von Typspezifikationen angegeben werden Geben Hinweise auf geplante Verwendung von Variablen und Funktionen Wirkung: Einfluß auf Programmoptimierung: Helfen oder blockieren Programmanalysen für Optimierungen Einfluß auf Semantik: Typanalyse kann Fehler markieren, wenn Hinweise auf Verwendung der tatsächlichen Verwendung widersprechen
39 Übersicht: Qualifizierer const Stellt sicher, daß Wert nicht verändert werden kann Erlaubt zusätzliche Optimierungen inline Erbittet Einbetten ( inlining ) von Funktionskörpern in Aufrufer Kann u.u. Programm beschleunigen restrict (auf Zeiger) Verspricht, daß kein aliasing stattfinded Erleichtert Zwischenspeichern von Werten Kann u.u. Programm beschleunigen volatile Zwingt Übersetzer, Variable im Speicher zu halten Einsatzgebiete: Gerätetreiber, nicht-lokaler Kontrollfluß
40 Qualifizierer: const Variablen, die nach Initialisierung nicht beschrieben werden, sind Konstanten Qualifizierer const const int i = v + 1; Eigenschaft wird von Typüberprüfung erzwungen: Versuchte Zuweisung ist Programmfehler const int x = 5; int f(int y) { return x * y;
41 Qualifizierer: const Variablen, die nach Initialisierung nicht beschrieben werden, sind Konstanten Qualifizierer const const int i = v + 1; Eigenschaft wird von Typüberprüfung erzwungen: Versuchte Zuweisung ist Programmfehler const int x = 5; int f(int y) { return x * y; // Mit Konstante int f(int y) { return 5 * y;
42 Qualifizierer: const C-Quellcode const int x = 5; int f(int y) { return x * y; const ermöglicht Optimierungen im Übersetzer
43 Qualifizierer: const C-Quellcode const int x = 5; int f(int y) { return x * y; mit const: f:sll $v0, $a0, 2 jr $ra addu $v0, $v0, $a0 const ermöglicht Optimierungen im Übersetzer
44 Qualifizierer: const C-Quellcode const int x = 5; int f(int y) { return x * y; mit const: f:sll $v0, $a0, 2 jr $ra addu $v0, $v0, $a0 ohne const: f:lw $v0, x($gp) nop mult $a0, $v0 mflo $v0 jr $ra nop const ermöglicht Optimierungen im Übersetzer
45 Qualifizierer: const C-Quellcode const int x = 5; int f(int y) { return x * y; mit const: Mit const: effizienter Ohne const: generischer f:sll $v0, $a0, 2 jr $ra addu $v0, $v0, $a0 ohne const: f:lw $v0, x($gp) nop mult $a0, $v0 mflo $v0 jr $ra nop const ermöglicht Optimierungen im Übersetzer
46 Qualifizierer: const und Zeiger Zwei relevante Zugriffsrechte für int *p: p += 1: Zeigerarithmetik *p += 1: Inhalt der referenzierten Speicherstelle erhöhen Optionen: int *p Wir dürfen sowohl p als auch *p modifizieren
47 Qualifizierer: const und Zeiger Zwei relevante Zugriffsrechte für int *p: p += 1: Zeigerarithmetik *p += 1: Inhalt der referenzierten Speicherstelle erhöhen Optionen: int *p Wir dürfen sowohl p als auch *p modifizieren const int *p int const *p Wir dürfen *p modifizieren, aber nicht p
48 Qualifizierer: const und Zeiger Zwei relevante Zugriffsrechte für int *p: p += 1: Zeigerarithmetik *p += 1: Inhalt der referenzierten Speicherstelle erhöhen Optionen: int *p Wir dürfen sowohl p als auch *p modifizieren const int *p int const *p Wir dürfen *p modifizieren, aber nicht p int * const p Wir dürfen p modifizieren, aber nicht *p
49 Qualifizierer: const und Zeiger Zwei relevante Zugriffsrechte für int *p: p += 1: Zeigerarithmetik *p += 1: Inhalt der referenzierten Speicherstelle erhöhen Optionen: int *p Wir dürfen sowohl p als auch *p modifizieren const int *p int const *p Wir dürfen *p modifizieren, aber nicht p int * const p Wir dürfen p modifizieren, aber nicht *p const int * const p int const * const p Wir dürfen weder p noch *p modifizieren
50 Qualifizierer: inline Funktionsaufrufe können hohe Kosten haben: Stapelspeicher beschreiben Registerwahl einschränken Stapelspeicher lesen Inlining ist Optimierung, die Funktionskörper einbettet: int f(int x) { return 2 + x; void g(int argc, int *args) { for (int i = 0; i < argc; i++) args[i] = f(args[i]);
51 Qualifizierer: inline Funktionsaufrufe können hohe Kosten haben: Stapelspeicher beschreiben Registerwahl einschränken Stapelspeicher lesen Inlining ist Optimierung, die Funktionskörper einbettet: int f(int x) { return 2 + x; void g(int argc, int *args) { for (int i = 0; i < argc; i++) args[i] = f(args[i]); // Mit Inlining void g(int argc, int *args) { for (int i = 0; i < argc; i++) args[i] = 2 + (args[i]);
52 Qualifizierer: ohne inline int f(int x) { return 2 + x; void g(int argc, int *args) { for (int i = 0; i < argc; i++) { args[i] = f(args[i]);
53 Qualifizierer: ohne inline int f(int x) { return 2 + x; void g(int argc, int *args) { for (int i = 0; i < argc; i++) { args[i] = f(args[i]); g: addiu $sp, $sp, -40 sw $ra, $s0-$s3...($sp) move $s2, $a0 blez $a0, L6 move $s3, $a1 move $s1, $zero L5:sll $s0, $s1, 2 addu $s0, $s3, $s0 lw $a0, 0($s0) jal f addiu $s1, $s1, 1 slt $v1, $s1, $s2 bne $v1, $zero, L5 sw $v0, 0($s0) L6:lw $ra, $s0-$s3...($sp) jr $ra addiu $sp, $sp, 40
54 Qualifizierer: mit inline inline int f(int x) { return 2 + x; void g(int argc, int *args) { for (int i = 0; i < argc; i++) { args[i] = f(args[i]);
55 Qualifizierer: mit inline inline int f(int x) { return 2 + x; void g(int argc, int *args) { for (int i = 0; i < argc; i++) { args[i] = f(args[i]); g: blez $a0, L9 move $a3, $a0 move $a2, $zero L5:sll $v0, $a2, 2 addu $v0, $a1, $v0 lw $v1, 0($v0) addiu $a2, $a2, 1 addiu $v1, $v1, 2 slt $a0, $a2, $a3 bne $a0, $zero, L5 sw $v1, 0($v0) L9:jr $ra nop
56 Qualifizierer: mit inline inline int f(int x) { return 2 + x; void g(int argc, int *args) { for (int i = 0; i < argc; i++) { args[i] = f(args[i]); g: blez $a0, L9 move $a3, $a0 move $a2, $zero L5:sll $v0, $a2, 2 addu $v0, $a1, $v0 lw $v1, 0($v0) addiu $a2, $a2, 1 addiu $v1, $v1, 2 slt $a0, $a2, $a3 bne $a0, $zero, L5 sw $v1, 0($v0) L9:jr $ra nop Kein expliziter f-aufruf Stapelspeicherverwaltung unnötig
57 Inlining in der Praxis Inlining ist eine der wichtigsten Optimierungen Übersetzer inlininen meist heuristisch: Funktionen mit kleinem Funktionskörper (kleiner als Inlining-Schwelle) (C, C++) Funktionen, die als Funktionszeiger übergeben werden (OCaml) Funktionen, die häufig von der gleichen Stelle aufgerufen werden (Java)
58 Inlining in der Praxis Inlining ist eine der wichtigsten Optimierungen Übersetzer inlininen meist heuristisch: Funktionen mit kleinem Funktionskörper (kleiner als Inlining-Schwelle) (C, C++) Funktionen, die als Funktionszeiger übergeben werden (OCaml) Funktionen, die häufig von der gleichen Stelle aufgerufen werden (Java) C : Exakte Bedeutung von inline ist implementierungsabhängig gcc: Der inline-qualifizierer erhöht die Inlining-Schwelle für diese Funktion
59 Inlining in der Praxis Inlining ist eine der wichtigsten Optimierungen Übersetzer inlininen meist heuristisch: Funktionen mit kleinem Funktionskörper (kleiner als Inlining-Schwelle) (C, C++) Funktionen, die als Funktionszeiger übergeben werden (OCaml) Funktionen, die häufig von der gleichen Stelle aufgerufen werden (Java) C : Exakte Bedeutung von inline ist implementierungsabhängig gcc: Der inline-qualifizierer erhöht die Inlining-Schwelle für diese Funktion Meist ist explizites inline nicht nötig
60 Qualifizierer: restrict int maxsum(int *summe, int *a, int len) { *summe = 0; int max = 0; while (len--) { *summe += a[len]; if (a[len] > max) max = a[len]; return max; Eingabe: Array a mit len Elementen Berechnet: *summe = a[0] a[len-1] return max(a[0]... a[len-1])
61 Qualifizierer: ohne restrict int maxsum(int *summe, int *a, int len) { *summe = 0; int max = 0; while (len--) { *summe += a[len]; //A1 if (a[len] > max) //A2 max = a[len]; //A3 return max; sw $zero, 0($a0) beq $a2, $zero, L5 addiu $v1, $a2, -1 move $a2, $zero move $v0, $zero L4:sll $a3, $v1, 2 addu $a3, $a1, $a3 lw $t0, 0($a3) # lade a[len] nop addu $a2, $a2, $t0 sw $a2, 0($a0) # schreibe *summe lw $a3, 0($a3) # lade a[len] nop slt $t0, $v0, $a3 beq $t0, $zero, L3 addiu $t1, $v1, -1 move $v0, $a3 L3:bne $v1, $zero, L4 move $v1, $t1 jr $ra nop L5:jr $ra move $v0, $zero
62 Qualifizierer: restrict int maxsum(int *summe, int *a, int len) { *summe = 0; int max = 0; while (len--) { *summe += a[len]; //A1 if (a[len] > max) //A2 max = a[len]; //A3 return max; Was, wenn summe in *a zeigt? aliasing: Mehrere Zeiger zeigen auf gleiches Objekt int a[3]; int x = maxsum(&a[1], a, 3); a = summe summe ist Alias von (a+1) Bestimmte Optimierungen werden durch konservative Annahmen des Übersetzers verhindert
63 Qualifizierer: ohne restrict int maxsum(int *summe, int *a, int len) { *summe = 0; int max = 0; while (len--) { *summe += a[len]; //A1 if (a[len] > max) //A2 max = a[len]; //A3 return max; sw $zero, 0($a0) beq $a2, $zero, L5 addiu $v1, $a2, -1 move $a2, $zero move $v0, $zero L4:sll $a3, $v1, 2 addu $a3, $a1, $a3 lw $t0, 0($a3) # lade a[len] nop addu $a2, $a2, $t0 sw $a2, 0($a0) # schreibe *summe lw $a3, 0($a3) # lade a[len] nop slt $t0, $v0, $a3 beq $t0, $zero, L3 addiu $t1, $v1, -1 move $v0, $a3 L3:bne $v1, $zero, L4 move $v1, $t1 jr $ra nop L5:jr $ra move $v0, $zero
64 Qualifizierer: mit restrict int maxsum(int * restrict summe, int * restrict a, int len) { *summe = 0; int max = 0; while (len--) { *summe += a[len]; if (a[len] > max) max = a[len]; return max;
65 Qualifizierer: mit restrict int maxsum(int * restrict summe, int * restrict a, int len) { *summe = 0; int max = 0; while (len--) { *summe += a[len]; if (a[len] > max) max = a[len]; return max; sw $zero, 0($a0) beq $a2, $zero, L5 addiu $v1, $a2, -1 move $a3, $zero move $v0, $zero L4:sll $a2, $v1, 2 addu $a2, $a1, $a2 lw $a2, 0($a2) # lade a[len] addiu $t1, $v1, -1 addu $a3, $a3, $a2 # 1 lw, 2 nop entfernt slt $t0, $v0, $a2 beq $t0, $zero, L3 sw $a3, 0($a0) # schreibe *summe move $v0, $a2 L3:bne $v1, $zero, L4 move $v1, $t1 jr $ra nop L5:jr $ra move $v0, $zero
66 Qualifizierer: restrict restrict verspricht, daß Aliasing unmöglich ist
67 Qualifizierer: restrict restrict verspricht, daß Aliasing unmöglich ist Compilerannahme: Aliasing zwischen Zeigern τ *a und τ *b möglich: a restrict a b ja ja restrict b ja nein
68 Qualifizierer: restrict restrict verspricht, daß Aliasing unmöglich ist Compilerannahme: Aliasing zwischen Zeigern τ *a und τ *b möglich: a restrict a b ja ja restrict b ja nein Kein Aliasing: Von Zeigern geladene Werte können länger in Registern zwischengespeichert werden... = *a; // *a lesen *b = z; // *b schreiben... = *a; // *a zwischengespeichert gdw restrict a und b
69 Qualifizierer: volatile Optimierer darf normalerweise: Variablen in Register legen Speicherzugriffreihenfolge umordnen Beide Änderungen haben normalerweise keine Auswirkung auf das sichtbare Programmverhalten
70 Qualifizierer: volatile Optimierer darf normalerweise: Variablen in Register legen Speicherzugriffreihenfolge umordnen Beide Änderungen haben normalerweise keine Auswirkung auf das sichtbare Programmverhalten Problematisch für: Gerätetreiber: Speicheradressen auf Geräteregister abgebildet Zugriffreihenfolge gemäß Hardwareprotokoll Plötzliche Sprünge (Ausnahmebehandlung): Registerinhalte gehen verloren
71 Qualifizierer: volatile volatile: Variable wird nicht in Registern gesichert Reihenfolge der volatile-zugriffe wird immer beibehalten int c; volatile int va, vb; va = 0; c = 1; vb = 2; // nach va
72 Qualifizierer: volatile volatile: Variable wird nicht in Registern gesichert Reihenfolge der volatile-zugriffe wird immer beibehalten int c; volatile int va, vb; va = 0; c = 1; vb = 2; // nach va Mögliche Schreibreihenfolgen va = 0; c = 1; va = 0; c = 1; va = 0; vb = 2; vb = 2; vb = 2; c = 1;
73 Qualifizierer: volatile volatile: Variable wird nicht in Registern gesichert Reihenfolge der volatile-zugriffe wird immer beibehalten int c; volatile int va, vb; va = 0; c = 1; vb = 2; // nach va Mögliche Schreibreihenfolgen va = 0; c = 1; va = 0; c = 1; va = 0; vb = 2; vb = 2; vb = 2; c = 1; Vorsicht: volatile alleine reicht nicht, um nebenläufige Prozesse zu synchronisieren
74 Automatische Optimierungen Übersetzer können viele Arten von Optimierungen durchführen: Inlining Auswertung konstanter Ausdrücke Rückhaltung von Speicherinhalten...
75 Automatische Optimierungen Übersetzer können viele Arten von Optimierungen durchführen: Inlining Auswertung konstanter Ausdrücke Rückhaltung von Speicherinhalten... Programmierer müssen sich nicht um Optimierungen kümmern, die der Übersetzer durchführen kann
76 Grundlegende Optimierungen Konstantenfaltung (constant folding) Konstantenpropagierung (constant propagation) Eliminierung gemeinsamer Teilausdrücke (common subexpression elimination) Eliminierung von totem Code (dead code elimination) Schleifeninvariante Codeverschiebung (loop-invariant code motion)
77 Konstantenfaltung Vor Optimierung: int x = 3 + 7;
78 Konstantenfaltung Vor Optimierung: int x = 3 + 7; Nach Optimierung: int x = 10; Berechnungen über Konstanten werden ausgewertet
79 Konstantenpropagierung Vor Optimierung: int x = 7;... // x wird nicht verändert for (int i = 0; i < x; i++) {... // x wird nicht verändert
80 Konstantenpropagierung Vor Optimierung: int x = 7;... // x wird nicht verändert for (int i = 0; i < x; i++) {... // x wird nicht verändert Nach Optimierung: int x = 7;... for (int i = 0; i < 7; i++) {... Variablen mit konstantem Inhalt werden substituiert
81 Eliminierung gemeinsamer Teilausdrücke Vor Optimierung: int x = v * v + 17; int y = v * v + 23;
82 Eliminierung gemeinsamer Teilausdrücke Vor Optimierung: int x = v * v + 17; int y = v * v + 23; Nach Optimierung: const int v2 = v * v; int x = v2 + 17; int y = v2 + 23; Mehrfach hintereinander verwendete Teilausdrücke werden extrahiert und vorberechnet
83 Eliminierung von totem Code Vor Optimierung: char *s = "C99 oder neuer"; if ( STDC_VERSION < L) { s = "vor C99";
84 Eliminierung von totem Code Vor Optimierung: char *s = "C99 oder neuer"; if ( STDC_VERSION < L) { s = "vor C99"; Nach Optimierung: char *s = "C99 oder neuer"; // Eliminiert Blöcke mit nicht erfüllbaren Vorbedingungen werden entfernt
85 Abhängigkeiten zwischen Optimierungen Optimierungen beeinflussen sich gegenseitig: Eliminierung von totem Code muß Bedingungen auswerten: Abhängigkeit: Konstantenfaltung / Konstantenpropagierung Konstantenfaltung muß Konstanten sehen: Abhängigkeit: Konstantenpropagierung Konstantenpropagierung muß wissen, daß Ausdrücke konstant sind: Abhängigkeit: Eliminierung von totem Code (De)aktivierung einer Optimierung kann andere Optimierungen indirekt beeinflussen
86 Schleifeninvariante Codeverschiebung Vor Optimierung: for (int i = 0; i <= 1000; i++) { int v = p * p; a[i] += v;
87 Schleifeninvariante Codeverschiebung Vor Optimierung: for (int i = 0; i <= 1000; i++) { int v = p * p; a[i] += v; Nach Optimierung: int v = p * p; for (int i = 0; i <= 1000; i++) { a[i] += v; Berechnungen, die in jedem Schleifenschritt das gleiche Ergebnis produzieren, werden vor die Schleife geschoben
88 Komplexe Optimierungen Schleifenteilung (loop splitting) Schleifenabwicklung (loop unrolling) Schleifenfusion (loop fusion) Stärkereduktion (strength reduction) Stapel-inlining (stack inlining) Inlining
89 Schleifenteilung Vor Optimierung: int v = 1; for (int i = 0; i <= 1000; i++) { a[i] += v; v = p * p; //A v ist nicht schleifen-invariant: A kann nicht verschoben werden
90 Schleifenteilung Vor Optimierung: int v = 1; for (int i = 0; i <= 1000; i++) { a[i] += v; v = p * p; //A v ist nicht schleifen-invariant: A kann nicht verschoben werden Nach Optimierung: int v = 1; for (int i = 0; i == 0; i++) { a[i] += v; v = p * p; //A for (int i = 1; i <= 1000; i++) { a[i] += v; v = p * p; //A Schleifen werden in Teilschleifen aufgespalten, um weitere Optimierungen zu erlauben (hier: Verschieben von A)
91 Schleifenabwicklung (1/2) Vor Optimierung: for (int i = 0; i < 4; i++) { a[i] += i; Nach Optimierung:
92 Schleifenabwicklung (1/2) Vor Optimierung: for (int i = 0; i < 4; i++) { a[i] += i; Nach Optimierung: a[0] += 0; a[1] += 1; a[2] += 2; a[3] += 3; Schleifenkörper wird kopiert, um Vergleiche/Sprünge zu sparen und weitere Optimierungen zu ermöglichen
93 Schleifenabwicklung (2/2) Vor Optimierung: for (int i = 0; i < 4000; i++) { a[i] += i;
94 Schleifenabwicklung (2/2) Vor Optimierung: for (int i = 0; i < 4000; i++) { a[i] += i; Nach Optimierung: for (int i = 0; i < 4000; i+=4) { a[i] += i; a[i+1] += i+1; a[i+2] += i+2; a[i+3] += i+3; Partielle Schleifenabwicklung für lange Schleifen, insbesondere zusammen mit Schleifenteilung
95 Schleifenfusion Vor Optimierung: for (int i = 0; i < 4000; i++) { a[i] += i; for (int i = 0; i < 4000; i++) { b[i] += a[i];
96 Schleifenfusion Vor Optimierung: for (int i = 0; i < 4000; i++) { a[i] += i; for (int i = 0; i < 4000; i++) { b[i] += a[i]; Nach Optimierung: for (int i = 0; i < 4000; i++) { a[i] += i; // Zusammengefuegt b[i] += a[i]; Schleifenkörper, die über die gleichen Daten iterieren, werden zusammengefügt
97 Stärkereduktion Vor Optimierung: for (int i = 0; i < 1000; i++) { a[i * 13] = 0;
98 Stärkereduktion Vor Optimierung: for (int i = 0; i < 1000; i++) { a[i * 13] = 0; Nach Optimierung: int i13 = 0; for (int i = 0; i < 1000; i++) { a[ i13] = 0; i13 += 13; Ersetze teure Operationen in Schleife durch billigere inkrementelle Operationen
99 Stapel-Inlining Vor Optimierung: int *a = (int *) malloc(sizeof(int) * 4); lies_daten(a); int i = a[0] + a[3]; free(a);
100 Stapel-Inlining Vor Optimierung: int *a = (int *) malloc(sizeof(int) * 4); lies_daten(a); int i = a[0] + a[3]; free(a); Nach Optimierung: int a[4]; lies_daten(a); int i = a[0] + a[3];
101 Stapel-Inlining Vor Optimierung: int *a = (int *) malloc(sizeof(int) * 4); lies_daten(a); int i = a[0] + a[3]; free(a); Nach Optimierung: int a[4]; lies_daten(a); int i = a[0] + a[3]; Einschränkung: Allozierung muß klein sein, wenn Stapelspeicher beschränkt ist
102 Stapel-Inlining Vor Optimierung: int *a = (int *) malloc(sizeof(int) * 4); lies_daten(a); int i = a[0] + a[3]; free(a); Nach Optimierung: int a[4]; lies_daten(a); int i = a[0] + a[3]; Einschränkung: Allozierung muß klein sein, wenn Stapelspeicher beschränkt ist Allozierung auf Ablagespeicher wird in Allozierung auf Stapelspeicher umgewandelt
103 Zusammenfassung: Optimierungen (1/2) Konstantenfaltung: Berechnungen auf Konstanten werden fertiggerechnet Konstantenpropagierung: Konstante Variablen werden substituiert Eliminierung gemeinsamer Teilausdrücke: Mehrfach verwendete Teilausdrücke werden extrahiert, nur ein Mal berechnet Eliminierung von totem Code: Nicht ausführbare Programmteile werden gelöscht Schleifeninvariante Codeverschiebung: Unveränderliche Berechnungen in Schleifen werden aus Schleife gehoben
104 Zusammenfassung: Optimierungen (2/2) Schleifenteilung: Schleife wird in mehrere Schleifen gespalten Schleifenabwicklung: Mehrere Kopien des Schleifenkörpers werden ausgeführt Schleifenfusion: Schleifen über gleiche Daten werden zusammengeklebt Stärkereduktion: Berechnungen mit teuren Operationen in Schleifen werden mit billigeren Operationen inkrementalisiert Stapel-inlining: malloc wird auf den Stapelspeicher verlegt Inlining: Funktionskörper werden in Aufrufstelle kopiert
105 Die Grenzen von Optimierungen Einschränkungen der Implementierung Fehlende Unterstützung Berechenbarkeit Programmgleicheit ist unentscheidbar Sprachsemantik Programmverhalten muß Sprachspezifikation entsprechen Überspezifizierung Programmierer-Spezifikation schränkt Optimierer unnötig ein Beschränktes Wissen Übersetzer sieht nicht genug Informationen
106 Optimierungsgrenzen durch Berechenbarkeitsgrenzen Gegeben: zwei Sortierfunktionen quicksort bubble_sort Beide sind semantisch äquivalent: gleiche Wirkung, soweit durch Sprachsemantik definiert Kann der Übersetzer automatisch eine durch die andere Funktion ersetzen? Zur automatischen Optimierung muß Übersetzer berechnen können, daß die Funktionen äquivalent sind
107 Optimierungsgrenzen durch Berechenbarkeitsgrenzen Gegeben: zwei Sortierfunktionen quicksort bubble_sort Beide sind semantisch äquivalent: gleiche Wirkung, soweit durch Sprachsemantik definiert Kann der Übersetzer automatisch eine durch die andere Funktion ersetzen? Zur automatischen Optimierung muß Übersetzer berechnen können, daß die Funktionen äquivalent sind Programmgleichheit ist nicht berechenbar: Diese Optimierung ist i.a. nicht möglich
108 Optimierungsgrenzen durch Sprachsemantik (1/2) a struct { short a; int w1; short b; int w2; s; // 2 Bytes // 4 Bytes // 2 Bytes // 4 Bytes w1 b w2
109 Optimierungsgrenzen durch Sprachsemantik (1/2) a a b struct { short a; int w1; short b; int w2; s; // 2 Bytes // 4 Bytes // 2 Bytes // 4 Bytes w1 b w1 w2 w2? Wir könnten Speicher sparen, wenn wir die Felder umsortieren würden
110 Optimierungsgrenzen durch Sprachsemantik (2/2) Darf der Übersetzer diese Umsortierung selbst durchführen? C11 Sprachspezifikation, : Within a structure object, the [...] members [...] have addresses that increase in the order in which they are declared. [...]
111 Optimierungsgrenzen durch Sprachsemantik (2/2) Darf der Übersetzer diese Umsortierung selbst durchführen? C11 Sprachspezifikation, : Within a structure object, the [...] members [...] have addresses that increase in the order in which they are declared. [...] Sprachspezifikation verbietet Optimierung
112 Optimierungsgrenzen durch Überspezifikation Überspezifikation: Programm beinhaltet Details, die 1. Das Berechnungsergebnis nicht beeinflussen, aber 2. Zur Berechnung nicht nötig sind Überspezifikation verhindert Optimierungen for (volatile int x = 1; x < 10; x++) { a[x] += 2; // kein Grund für volatile
113 Optimierungsgrenzen durch Überspezifikation Überspezifikation kann indirekt stattfinden: int helfer(int i) { return... int f(int i) {...helfer... Inlining von helfer möglich
114 Optimierungsgrenzen durch Überspezifikation Überspezifikation kann indirekt stattfinden: int helfer(int i) { return... int f(int i) {...helfer... Inlining von helfer möglich Aber: helfer kann nach inlining nicht eliminiert werden: Ein externes Modul könnte auf helfer zugreifen helfer ist nicht static, damit global im Sinne des Binders
115 Optimierungsgrenzen durch Überspezifikation Überspezifikation kann indirekt stattfinden: int helfer(int i) { return... int f(int i) {...helfer... Inlining von helfer möglich Aber: helfer kann nach inlining nicht eliminiert werden: Ein externes Modul könnte auf helfer zugreifen helfer ist nicht static, damit global im Sinne des Binders Überspezifikation durch fehlende Angaben möglich
116 Zusammenfassung: Einschränkungen der Optimierungen Implementierungsbeschränkungen Berechenbarkeit Sprachsemantik und Überspezifizierung Beschränktes Wissen
117 Wissen des Optimierers Optimierung: Programmanalyse a + Transformation t Wissen von a: t ist korrekt Optimierung t ist inkorrekt keine Optimierung nicht genug Informationen keine Optimierung
118 Wissen des Optimierers Optimierung: Programmanalyse a + Transformation t Wissen von a: t ist korrekt Optimierung t ist inkorrekt keine Optimierung nicht genug Informationen keine Optimierung Desto mehr der Optimierer weiß, desto besser kann er optimieren
119 Modul-Optimierung Modul-Optimierung: Normalfall Jedes Modul (Programmdatei) wird einzeln optimiert Wissen des Optimierers: Inhalt eines Moduls Modul-0 Modul-1 Modul-2 Übersetzer Übersetzer Übersetzer Binder Ausführung
120 Gesamtprogrammoptimierung whole-program optimisation Alle Module werden gleichzeitig optimiert Wissen des Optimierers: Inhalt aller Module Das Programm ist vollständig Modul-0 Modul-1 Modul-2 Übersetzer Binder Ausführung Wissen, daß das Programm vollständig ist, erlaubt viele neue Optimierungen, die sonst nur mit const oder static möglich wären
121 Bindezeit-Optimierung Modul-0 Modul-1 Modul-2 link-time optimisation Binder optimiert Module mit Informationen aus anderen Modulen Wissen des Optimierers: Teile des Modulwissens Übersetzer Übersetzer Übersetzer Binder Ausführung
122 Optimierung mit Laufzeitprofil profile-directed optimisation feedback-driven optimisation Übersetzer verwenden Laufzeitmessungen, um Programme zu beschleunigen Zusätzlich zu Modul- /Ganzprogrammoptimierung Wissen des Optimierers: Schleifendurchlaufstatistiken Sprungwahrscheinlichkeiten Oft ausgeführter Code und alles, was er vorher wußte Modul-0 Modul-1 Modul-2 Übersetzer Übersetzer Übersetzer Binder Ausführung Programmprofil
123 Optimierung: Zusammenfassung Optimierungen können zu verschiedenen Zeitpunkten stattfinden: Optimierung bei Modulübersetzung: Vorteile: Relativ schnelle Übersetzung Nachteile: Nur beschränktes Wissen Ganzprogramm-Optimierung: Vorteile: Sehr effektiv Nachteile: Sehr langsam, manchmal unmöglich: Unterstützt keine dynamisch geladenen Module Optimierung braucht viel Arbeitsspeicher Bindezeit-Optimierung: Vorteile: Optimierung jenseits von Modulgrenzen Nachteile: Große Objektdateien, langsames Binden Optimierung mit Laufzeitprofil: Vorteile: Muß Programmverhalten nicht raten Nachteile: Typischer Programmlauf nötig, hoher Aufwand
Einführung in die Systemprogrammierung
Einführung in die Systemprogrammierung Sprachen und Übersetzer Prof. Dr. Christoph Reichenbach Fachbereich 12 / Institut für Informatik 4. Juni 2015 Sprachen vs. Übersetzer Sprache C11 Übersetzer GNU C
MehrTechnische Informatik 1 Übung 2 Assembler (Computerübung) Matthias Meyer
Technische Informatik 1 Übung 2 Assembler (Computerübung) Matthias Meyer Ziele der Übung Aufgabe 1 Ein lauffähiges Assembler-Programm Umgang mit dem Debugger Aufgabe 2 (Zusatzaufgabe) Lesen und Analysieren
Mehr1 Maschinenunabhängige Optimierungen. Maschinenunabhängige Optimierungen Wintersemester 2008/09 1 / 17
1 Maschinenunabhängige Optimierungen Maschinenunabhängige Optimierungen Wintersemester 2008/09 1 / 17 Optimierungen Automatische Optimierungen sind nötig, weil unoptimierter Code meist besser lesbar ist.
MehrEinführung in die Systemprogrammierung
Einführung in die Systemprogrammierung Dynamische Programmbibliotheken Prof. Dr. Christoph Reichenbach Fachbereich 12 / Institut für Informatik 28. Mai 2015 Dynamische Programmbibliotheken Idee: Programm
MehrProgrammiersprachen Einführung in C
Programmiersprachen Einführung in C Teil 1: Von der Maschinensprache zu C Prof. Dr. Maschinensprache: MIPS R2000 Was bewirkt folgendes Programm: 00100111101111011111111111100000 10101111101111110000000000010100
MehrInformatik 1 ( ) D-MAVT F2010. Schleifen, Felder. Yves Brise Übungsstunde 5
Informatik 1 (251-0832-00) D-MAVT F2010 Schleifen, Felder Nachbesprechung Blatt 3 Aufgabe 1 ASCII... A > a Vorsicht: Lösen Sie sich von intuitiven Schlussfolgerungen. A ist nicht grösser als a, denn in
MehrEinführung in die Systemprogrammierung
Einführung in die Systemprogrammierung Der Binder Prof. Dr. Christoph Reichenbach Fachbereich 12 / Institut für Informatik 28. Mai 2015 Herausforderungen durch große Programme Große Programme: die meisten
MehrBeispiel einer Übersetzung
Beispiel einer Übersetzung Ausdruck in C aktuelle_zeit = Startzeit + vergangene_minuten*60 + vergangene_sekunden; Ausdruck im Instruktionssatz des R10000 LW r1,minuten LW r1,sekunden ADDI r2,r0,60 ADD
MehrGrundlagen der OO- Programmierung in C#
Grundlagen der OO- Programmierung in C# Technische Grundlagen 1 Dr. Beatrice Amrhein Überblick Visual Studio: Editor und Debugging Die Datentypen Methoden in C# Die Speicherverwaltung 2 Visual Studio 3
MehrOpenCL. Programmiersprachen im Multicore-Zeitalter. Tim Wiersdörfer
OpenCL Programmiersprachen im Multicore-Zeitalter Tim Wiersdörfer Inhaltsverzeichnis 1. Was ist OpenCL 2. Entwicklung von OpenCL 3. OpenCL Modelle 1. Plattform-Modell 2. Ausführungs-Modell 3. Speicher-Modell
MehrProgrammiersprachen und Übersetzer
Programmiersprachen und Übersetzer Sommersemester 2009 5. April 2009 Vorteile bei der Verwendung höherer Programmiersprachen Vorteile bei der Verwendung höherer Programmiersprachen 1. Einfache Notation
MehrEinführung in die Systemprogrammierung 0C
Einführung in die Systemprogrammierung 0C Prof. Dr. Christoph Reichenbach Fachbereich 12 / Institut für Informatik 8. Juli 2014 Klausur 10:00 12:00 am 22.07, Hörsaal V 80% reines Kompetenzwissen 20% Synthese
MehrÜbersicht. Speichertypen. Speicherverwaltung und -nutzung. Programmieren in C
Übersicht Speichertypen Speicherverwaltung und -nutzung Speichertypen Beim Laden eines Programms in den Speicher (Programmausführung) kommen 3 verschiedene Speicherbereiche zum Einsatz: Text Segment (Code
MehrEinführung in die Programmiersprache C
Einführung in die Programmiersprache C 11 Was bisher verschwiegen wurde Alexander Sczyrba Robert Homann Georg Sauthoff Universität Bielefeld, Technische Fakultät Type qualifier Typen können mit folgenden
MehrEinführung in die Programmiersprache C
Einführung in die Programmiersprache C 11 Was bisher verschwiegen wurde Alexander Sczyrba Robert Homann Georg Sauthoff Universität Bielefeld, Technische Fakultät Type qualifier Typen können mit folgenden
MehrUnterprogramme. Unterprogramme
Unterprogramme Unterprogramme wichtiges Hilfsmittel für mehrfach benötigte Programmabschnitte spielen in höheren Programmiersprachen eine wesentliche Rolle in Assembler sind bestimmte Konventionen nötig
MehrC/C++-Programmierung
1 C/C++-Programmierung Speicherverwaltung, 0, const Sebastian Hack Christoph Mallon (hack mallon)@cs.uni-sb.de Fachbereich Informatik Universität des Saarlandes Wintersemester 2009/2010 2 Speicherverwaltung
MehrTechnische Informatik 1 Übung 2 Assembler (Rechenübung) Georgia Giannopoulou (ggeorgia@tik.ee.ethz.ch) 22./23. Oktober 2015
Technische Informatik 1 Übung 2 Assembler (Rechenübung) Georgia Giannopoulou (ggeorgia@tik.ee.ethz.ch) 22./23. Oktober 2015 Ziele der Übung Aufgabe 1 Aufbau und Aufruf von Funktionen in Assembler Codeanalyse
MehrProgrammiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften
Programmiertechnik Teil 4 C++ Funktionen: Prototypen Overloading Parameter C++ Funktionen: Eigenschaften Funktionen (Unterprogramme, Prozeduren) fassen Folgen von Anweisungen zusammen, die immer wieder
MehrWelche Informatik-Kenntnisse bringen Sie mit?
Welche Informatik-Kenntnisse bringen Sie mit? So gehen Sie vor! Lösen Sie die Aufgaben der Reihe nach von 1 bis 20, ohne das Lösungsblatt zur Hilfe zu nehmen. Der Schwierigkeitsgrad der Aufgaben nimmt
MehrDeklarationen in C. Prof. Dr. Margarita Esponda
Deklarationen in C 1 Deklarationen Deklarationen spielen eine zentrale Rolle in der C-Programmiersprache. Deklarationen Variablen Funktionen Die Deklarationen von Variablen und Funktionen haben viele Gemeinsamkeiten.
Mehr6. Funktionen, Parameterübergabe
6. Funktionen, Parameterübergabe GPS-6-1 Themen dieses Kapitels: Begriffe zu Funktionen und Aufrufen Parameterübergabearten call-by-value, call-by-reference, call-by-value-and-result in verschiedenen Sprachen
MehrKonzepte der Programmiersprachen
Konzepte der Programmiersprachen Sommersemester 2010 4. Übungsblatt Besprechung am 9. Juli 2010 http://www.iste.uni-stuttgart.de/ps/lehre/ss2010/v_konzepte/ Aufgabe 4.1: Klassen in C ++ Das folgende C
MehrAssembler - Adressierungsarten
Assembler - Adressierungsarten Dr.-Ing. Volkmar Sieh Department Informatik 3: Rechnerarchitektur Friedrich-Alexander-Universität Erlangen-Nürnberg SS 2008 Assembler - Adressierungsarten 1/31 2008-04-01
MehrDefinition Compiler. Bekannte Compiler
Compiler Inhalt: Definition Compiler / bekannte Compiler Klassifikationen von Compilern Analyse-Synthese-Modell der Kompilierung Analyse des Quellprogramms Synthesephase Die Phasen eines Compilers Symboltabellenverwaltung
MehrEinführung in die Programmiersprache C
Einführung in die Programmiersprache C 4 Storage classes Alexander Sczyrba Robert Homann Georg Sauthoff Universität Bielefeld, Technische Fakultät Compilation units Compilierung eines mehrteiligen Programms:
MehrEinführung in die Programmiersprache C
Einführung in die Programmiersprache C 4 Storage classes Alexander Sczyrba Robert Homann Georg Sauthoff Universität Bielefeld, Technische Fakultät Compilation units Compilierung eines mehrteiligen Programms:
MehrCrashkurs C++ - Teil 1
Crashkurs C++ - Teil 1 Intro Speicherverwaltung Variablen, Pointer, Referenzen Felder statische & dynamische Allozierung Birgit Möller & Denis Williams AG Bioinformatik & Mustererkennung Institut für Informatik
MehrSpeicherklassen (1) Lokale Variablen
Speicherklassen (1) Lokale Variablen Lokale Variablen beschränken sich auf die Funktionen, in denen sie definiert werden Sind in der Funktion gekapselt können also nur in der Funktion verändert werden
Mehr7 Funktionen. 7.1 Definition. Prototyp-Syntax: {Speicherklasse} {Typ} Name ({formale Parameter});
S. d. I.: Programieren in C Folie 7-1 7 Funktionen 7.1 Definition Prototyp-Syntax: Speicherklasse Typ Name (formale Parameter); der Funktions-Prototyp deklariert eine Funktion, d.h. er enthält noch nicht
MehrMethoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom
Einstieg in die Informatik mit Java, Vorlesung vom 2.5.07 Übersicht 1 2 definition 3 Parameterübergabe, aufruf 4 Referenztypen bei 5 Überladen von 6 Hauptprogrammparameter 7 Rekursion bilden das Analogon
MehrAssembler - Einleitung
Assembler - Einleitung Dr.-Ing. Volkmar Sieh Department Informatik 3: Rechnerarchitektur Friedrich-Alexander-Universität Erlangen-Nürnberg SS 2008 Assembler - Einleitung 1/19 2008-04-01 Teil 1: Hochsprache
MehrC++ - Objektorientierte Programmierung Konstante und statische Elemente
C++ - Objektorientierte Programmierung Konstante und statische Elemente hat eine Kantenlänge hat eine Füllfarbe Kantenlänge setzen Füllfarbe lesen Volumen berechnen Leibniz Universität IT Services Anja
MehrProgrammierung 2. Übersetzer: Das Frontend. Sebastian Hack. Klaas Boesche. Sommersemester
1 Programmierung 2 Übersetzer: Das Frontend Sebastian Hack hack@cs.uni-saarland.de Klaas Boesche boesche@cs.uni-saarland.de Sommersemester 2012 Vom Programm zur Maschine Was passiert eigentlich mit unseren
MehrZwischencode-Erzeugung. 2. Juni 2009
Zwischencode-Erzeugung im Rahmen des Seminars "Übersetzung von künstlichen Sprachen" Sebastian Hanneken 2. Juni 2009 1 / 32 1 Einleitung Einordnung Funktion von Zwischencode 3-Adresscode (3AC) 2 Erzeugung
MehrCompiler: Einführung
Fakultät für Informatik und Mathematik Hochschule München Letzte Änderung: 10.05.2017 15:49 Inhaltsverzeichnis Ein Compiler................................... 2 Ein Compiler...................................
MehrJust-In-Time-Compiler (2)
Just-In-Time-Compiler (2) Dr.-Ing. Volkmar Sieh Department Informatik 3: Rechnerarchitektur Friedrich-Alexander-Universität Erlangen-Nürnberg WS 2011/2012 Just-In-Time-Compiler (2) 1/13 2011-09-12 Just-In-Time-Compiler
MehrElementare Konzepte von
Elementare Konzepte von Programmiersprachen Teil 2: Anweisungen (Statements) Kapitel 6.3 bis 6.7 in Küchlin/Weber: Einführung in die Informatik Anweisungen (statements) in Java Berechnung (expression statement)
MehrJust-In-Time-Compiler (2)
Just-In-Time-Compiler (2) Dr.-Ing. Volkmar Sieh Department Informatik 4 Verteilte Systeme und Betriebssysteme Friedrich-Alexander-Universität Erlangen-Nürnberg WS 2015/2016 V. Sieh Just-In-Time-Compiler
MehrVorlesung Programmieren
Vorlesung Programmieren Speicherverwaltung und Parameterübergabe Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck http://www.itm.uni-luebeck.de/people/fischer Gültigkeitsbereich von
MehrInteger Integer Integer (Voreinstellung) Integer Gleitkomma Gleitkomma leer/unbestimmt Integer ohne Vorzeichen Integer (explizit) mit Vorzeichen
1 C-Schlüsselwörter Schlüsselwörter sind in allen Programmiersprachen reservierte Wörter. In C sind auch alle Namen _[A-Z]... und... reserviert, auch _... bereichsweise. Weiterhin durch die Standard-
MehrProf. W. Henrich Seite 1
Klasse - ist ein benutzerdefinierter Datentyp (Referenztyp) - hat Datenelemente - hat Methoden - Konstruktor ist spezielle Methode zum Erstellen eines Objektes vom Typ der Klasse (Instanz) - jede Klasse
MehrProgrammieren in Java -Eingangstest-
Programmieren in Java -Eingangstest- Nummer: 1. Studiengang: Informatik B.Sc. Informatik M.Sc. ESE B.Sc. ESE M.Sc. Sonstiges: Fachsemester: Bitte Fragen, die Sie nicht beantworten können unbedingt mit
MehrInstitut für Informatik Prof. Dr. D. Hogrefe Dipl.-Inf. R. Soltwisch, Dipl.-Inform. M. Ebner, Prof. Dr. D. Hogrefe Informatik II - SS 04.
Kontrollstrukturen Informatik II SS 2004 Teil 4: Assembler Programmierung Sprünge (bedingte und unbedingte) If-then-else, Case Loop (n Durchläufe) While (Abbruchbedingung) Institut für Informatik Prof.
Mehr1. Referenzdatentypen: Felder und Strings. Referenz- vs. einfache Datentypen. Rückblick: Einfache Datentypen (1) 4711 r
1. Felder und Strings Eigenschaften von Referenzdatentypen 1. Referenzdatentypen: Felder und Strings Referenzdatentypen sind Konstrukte, mit deren Hilfe wir aus einfachen Datentypen neue eigene Typen erzeugen
Mehr1. Referenzdatentypen: Felder und Strings
1. Felder und Strings Eigenschaften von Referenzdatentypen 1. Referenzdatentypen: Felder und Strings Referenzdatentypen sind Konstrukte, mit deren Hilfe wir aus einfachen Datentypen neue eigene Typen erzeugen
MehrEinführung in die Programmierung I. 1.0 EBNF 2.0 Einfache Java Programme. Thomas R. Gross. Department Informatik ETH Zürich
252-0027 Einführung in die Programmierung I 1.0 EBNF 2.0 Einfache Java Programme Thomas R. Gross Department Informatik ETH Zürich Graphische Darstellung von EBNF Regeln Syntax Graph: graphische Darstellung
MehrÜbungsblatt 10 (Block C 2) (16 Punkte)
georg.von-der-brueggen [ ] tu-dortmund.de ulrich.gabor [ ] tu-dortmund.de pascal.libuschewski [ ] tu-dortmund.de Übung zur Vorlesung Rechnerstrukturen Wintersemester 2016 Übungsblatt 10 (Block C 2) (16
MehrU4-1 Aufgabe 3: einfache malloc-implementierung
U4 3. Übung U4 3. Übung Besprechung der Aufgabe 2: wsort Aufgabe 3: malloc-implementierung Ziele der Aufgabe Zusammenhang zwischen "nacktem Speicher" und typisierten bereichen verstehen Funktion aus der
MehrInstitut für Programmierung und Reaktive Systeme. Java 2. Markus Reschke
Java 2 Markus Reschke 07.10.2014 Datentypen Was wird gespeichert? Wie wird es gespeichert? Was kann man mit Werten eines Datentyps machen (Operationen, Methoden)? Welche Werte gehören zum Datentyp? Wie
MehrTag 4 Repetitorium Informatik (Java)
Tag 4 Repetitorium Informatik (Java) Dozent: Michael Baer Lehrstuhl für Informatik 2 (Programmiersysteme) Friedrich-Alexander-Universität Erlangen-Nürnberg Wintersemester 2017/2018 Übersicht Arrays (Reihungen)
Mehr10 Die Programmiersprache C99: Zusammenfassung
10 Die Programmiersprache C99: Zusammenfassung Jörn Loviscach Versionsstand: 25. September 2014, 18:40 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen der Videos: http://www.j3l7h.de/videos.html
MehrInformatik II - Tutorium 4
Informatik II - Tutorium 4 Vincent Becker vincent.becker@inf.ethz.ch 22.03.2017 Vincent Becker 27.03.2017 1 Übungsblatt 3 Vincent Becker 27.03.2017 2 U3.A1 Programmverifikation static int f(int i, int
MehrFelder, Zeiger und Adreßrechnung
Felder, Zeiger und Adreßrechnung Felder bestehen aus Variablen eines einzigen Datentyps. Bisher kennen wir eindimensionale Felder. In C sind Felder mit beliebigen Dimensionen möglich. Unsere räumliche
MehrAuD-Tafelübung T-B5b
6. Übung Sichtbarkeiten, Rekursion, Javadoc Di, 29.11.2011 1 Blatt 5 2 OOP Klassen Static vs. Instanzen Sichtbarkeit 3 Stack und Heap Stack Heap 4 Blatt 6 1 Blatt 5 2 OOP Klassen Static vs. Instanzen Sichtbarkeit
MehrEinführung in die Programmierung zusammengesetzte Datentypen, dynamischer Speicher
Einführung in die Programmierung zusammengesetzte Datentypen, dynamischer Speicher Arvid Terzibaschian 1 Zusammengesetzte Datentypen 2 Wozu zusammengesetzte Datentypen? Anforderung: Sie sollen ein Kundenverzeichnis
MehrKlassenvariablen, Klassenmethoden
Einstieg in die Informatik mit Java, Vorlesung vom 11.12.07 Übersicht 1 Klassenmethoden 2 Besonderheiten von Klassenmethoden 3 Aufruf einer Klassenmethode 4 Hauptprogrammparameter 5 Rekursion Klassenmethoden
MehrAlgorithmen und Datenstrukturen
Algorithmen und Datenstrukturen Wintersemester 2012/13 1. Vorlesung Kapitel 1: Sortieren Prof. Dr. Alexander Wolff Lehrstuhl für Informatik I Das Problem Eingabe Gegeben: eine Folge A = a 1, a 2,..., a
MehrSchachtelung der 2. Variante (Bedingungs-Kaskade): if (B1) A1 else if (B2) A2 else if (B3) A3 else if (B4) A4 else A
2.4.6. Kontrollstrukturen if-anweisung: Bedingte Ausführung (Verzweigung) 2 Varianten: if (Bedingung) Anweisung (Anweisung = einzelne Anweisung oder Block) Bedeutung: die Anweisung wird nur ausgeführt,
MehrC- Kurs 08 Zeiger. Dipl.- Inf. Jörn Hoffmann leipzig.de. Universität Leipzig Ins?tut für Informa?k Technische Informa?
C- Kurs 08 Dipl.- Inf. Jörn Hoffmann jhoffmann@informa?k.uni- leipzig.de Universität Leipzig Ins?tut für Informa?k Technische Informa?k Überblick Datentyp zur Verwaltung von Adressen (auf Speicherplätze)
MehrDAP2-Programmierpraktikum Einführung in C++ (Teil 2)
DAP2-Programmierpraktikum Einführung in C++ (Teil 2) Carsten Gutwenger 18. April 2008 Lehrstuhl 11 Algorithm Engineering Fakultät für Informatik, TU Dortmund Überblick Dynamischer Speicher Klassen und
MehrMethoden und Wrapperklassen
Methoden und Wrapperklassen CoMa-Übung IV TU Berlin 06.11.2012 CoMa-Übung IV (TU Berlin) Methoden und Wrapperklassen 06.11.2012 1 / 24 Themen der Übung 1 Methoden 2 Wrapper-Klassen CoMa-Übung IV (TU Berlin)
MehrMotivation und Überblick
Motivation und Überblick Drei große Bereiche der Vorlesung: Darstellung von Zahlen in Rechnern Verarbeitung von Binärdaten auf der Ebene digitaler Schaltungen Programmierung auf Maschinenebene und relativ
MehrLösungsvorschlag zur 3. Übung
Prof Frederik Armknecht Sascha Müller Daniel Mäurer Grundlagen der Informatik Wintersemester 09/10 1 Präsenzübungen 11 Schnelltest Lösungsvorschlag zur Übung a) Welche der folgenden Aussagen entsprechen
MehrVariablen. Deklaration: «Datentyp» «Variablenname» Datentyp bestimmt Größe in Bytes: sizeof Beispiel: long int v; Größe: 4 Bytes
Variablen Deklaration: «Datentyp» «Variablenname» Datentyp bestimmt Größe in Bytes: sizeof Beispiel: long int v; Größe: 4 Bytes v ist Stück im Speicher, der 4 Bytes lang ist Speicherzugriff? Über Adressen!
MehrEinleitung. Informationsquellen: - Webseite zur Vorlesung, Abschnitt Informationen zu C und C++ Kurzeinführung in C/C++
Informationsquellen: - Webseite zur Vorlesung, Abschnitt Informationen zu C und C++ 1 Einleitung Vorteile von Java: gut strukturiert mit hohem Funktionsumfang (mächtige Standardbibliothek) weitestgehend
MehrProgrammieren in C. Speicher anfordern, Unions und Bitfelder. Prof. Dr. Nikolaus Wulff
Programmieren in C Speicher anfordern, Unions und Bitfelder Prof. Dr. Nikolaus Wulff Vergleich: Felder und Strukturen Felder müssen Elemente vom selben Typ enthalten. Strukturen können Elemente unterschiedlichen
MehrEinleitung Entwicklung in C Hello-World! Konstrukte in C Zusammenfassung Literatur. Grundlagen von C. Jonas Gresens
Grundlagen von C Jonas Gresens Proseminar C Grundlagen und Konzepte Arbeitsbereich Wissenschaftliches Rechnen Fachbereich Informatik Fakultät für Mathematik, Informatik und Naturwissenschaften Universität
Mehr2 Eine einfache Programmiersprache
2 Eine einfache Programmiersprache Eine Programmiersprache soll Datenstrukturen anbieten Operationen auf Daten erlauben Kontrollstrukturen zur Ablaufsteuerung bereitstellen Als Beispiel betrachten wir
MehrC- Kurs 09 Dynamische Datenstrukturen
C- Kurs 09 Dynamische Datenstrukturen Dipl.- Inf. Jörn Hoffmann jhoffmann@informaak.uni- leipzig.de Universität Leipzig InsAtut für InformaAk Technische InformaAk Flexible Datenstrukturen Institut für
MehrGrundlagen der Programmentwicklung
Informatik für Elektrotechnik und Informationstechnik Benedict Reuschling benedict.reuschling@h-da.de Hochschule Darmstadt Fachbereich Informatik WS 2013/14 Über C++ Über C++ C++ ist eine in der Industrie
MehrSpeicher und Adressraum
Linearer Speicher (Adressraum) Technische Universität München Speicher und Adressraum Freie Speicherhalde (Heap) Freier Speicherstapel (Stack) Globale Variablen Bibliotheksfunktionen Laufzeitsystem Programmcode
MehrThemen der Übung. Methoden und Wrapperklassen. Vorteile von Methoden. Methoden. Grundlagen
Themen der Übung 1 Organisatorisches Methoden und Wrapperklassen 2 Methoden 3 Wrapper-Klassen CoMa-Übung IV TU Berlin 07.11.2012 Organisatorisches: Im Pool nur auf die Abgabeliste setzen, wenn ihr wirklich
MehrZeiger. C-Kurs 2012, 2. Vorlesung. Tino Kutschbach 10.
Zeiger C-Kurs 2012, 2. Vorlesung Tino Kutschbach tino.kutschbach@campus.tu-berlin.de http://wiki.freitagsrunde.org 10. September 2012 This work is licensed under the Creative Commons Attribution-ShareAlike
MehrObjektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)
Stefan Brass: OOP (Java), 22. Aufzählungstypen 1/20 Objektorientierte Programmierung Kapitel 22: Aufzählungstypen (Enumeration Types) Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester
MehrAlgorithmen und Datenstrukturen
Algorithmen und Datenstrukturen Wintersemester 2013/14 1. Vorlesung Kapitel 1: Sortieren Prof. Dr. Alexander Wolff Lehrstuhl für Informatik I Das Problem Eingabe Gegeben: eine Folge A = a 1, a 2,..., a
MehrPräzedenz von Operatoren
Präzedenz von Operatoren SWE-30 Die Präzedenz von Operatoren bestimmt die Struktur von Ausdrücken. Ein Operator höherer Präzedenz bindet die Operanden stärker als ein Operator geringerer Präzedenz. Mit
MehrTechnische Informatik 1 - Übung 3 3. & 4. November Philipp Miedl
Technische Informatik 1 - Übung 3 3. & 4. November 2016 Philipp Miedl Philipp Miedl 3. 11. 2016 1 Ziele der Übungen Aufgabe 1 Philipp Miedl 3. 11. 2016 2 Ziele der Übungen Aufgabe 1 Aufbau von Objekt-Dateien
Mehreinlesen n > 0? Ausgabe Negative Zahl
1 Lösungen Kapitel 1 Aufgabe 1.1: Nassi-Shneiderman-Diagramm quadratzahlen Vervollständigen Sie das unten angegebene Nassi-Shneiderman-Diagramm für ein Programm, welches in einer (äußeren) Schleife Integer-Zahlen
Mehr2 Teil 2: Nassi-Schneiderman
2 Teil 2: Nassi-Schneiderman Wie kann man Nassi-Schneiderman in einer objektorientierten Sprache verwenden? Jedes Objekt besitzt Methoden, welche die Attribute des Objektes verändern. Das Verhalten der
Mehr8. Referenzen und Zeiger
8. Referenzen und Zeiger Motivation Variable werden in C++ an speziellen Positionen im Speicher abgelegt. An jeder Position befindet sich 1 Byte. Sie sind durchnummeriert beginnend bei 0. Diese Positionen
MehrDie Programmiersprache C99: Zusammenfassung
Die Programmiersprache C99: Zusammenfassung Jörn Loviscach Versionsstand: 7. Dezember 2010, 19:30 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen in der Vorlesung. Videos dazu: http://www.youtube.com/joernloviscach
MehrEinführung in die C-Programmierung
Einführung in die C-Programmierung Warum C? Sehr stark verbreitet (Praxisnähe) Höhere Programmiersprache Objektorientierte Erweiterung: C++ Aber auch hardwarenahe Programmierung möglich (z.b. Mikrokontroller).
MehrPass by Value Pass by Reference Defaults, Overloading, variable Parameteranzahl
Funktionen Zusammenfassung von Befehlssequenzen als aufrufbare/wiederverwendbare Funktionen in einem Programmblock mit festgelegter Schnittstelle (Signatur) Derartige prozedurale Programmierung erlaubt
MehrPropädeutikum. Dipl.-Inf. Frank Güttler
Propädeutikum 2015 Vorbereitungskurs Informatikstudium Erfolgreich Studieren Programmieren (C-Kurs) guettler@informatik.uni-leipzig.de Universität Leipzig Institut für Informatik Technische Informatik
MehrLambda-Ausdrücke in Programmiersprachen 76
Lambda-Kalkül 75 Das Lambda-Kalkül geht auf Alonzo Church und Stephen Kleene zurück, die in den 30er-Jahren damit ein formales System für berechenbare Funktionen entwickelten. Zu den wichtigsten Arbeiten
MehrSystempraktikum im Wintersemester 2009/2010 (LMU): Vorlesung vom Foliensatz 2
Systempraktikum im Wintersemester 2009/2010 (LMU): Vorlesung vom 29.10. Foliensatz 2 Modularisierung (T) Eigene Headerdateien und Bibliotheken (P) Arten der Parameterübergabe (P) Arrays und Strukturen
MehrTeil 5: Zeiger, Felder, Zeichenketten Gliederung
Teil 5: Zeiger, Felder, Zeichenketten Gliederung Zeiger und Adressen Felder (Arrays) Zeichenketten (Strings) Zeigerarithmetik Mehrdimensionale Felder Zeiger und Adressen Felder Zeichenketten Zeigerarithmetik
MehrÜbungs- und Praktikumsaufgaben zur Systemprogrammierung Dipl.-Ing. H. Büchter (Lehrbeauftragter) FH-Dortmund WS 2001/2002 / SS 2002
1. Stellen Sie die schrittweise Verbesserung eines Compilers durch das Bootstrap- Verfahren mit Hilfe von T-Diagrammen dar. Gegeben ist ein auf der Maschine M lauffähiger Compiler C 1, der in S geschrieben
MehrRO-Tutorien 15 und 16
Tutorien zur Vorlesung Rechnerorganisation Tutorienwoche 2 am 04.05.2011 1 Christian A. Mandery: KIT Universität des Landes Baden-Württemberg und nationales Grossforschungszentrum in der Helmholtz-Gemeinschaft
MehrInhalt. 1 Einstieg in die Welt von C Erste Schritte in C 31. Vorwort... 15
Vorwort... 15 1 Einstieg in die Welt von C 17 1.1 Die Sprache C... 17 1.2 Die C-Standardbibliothek... 18 1.3 Die nötigen Werkzeuge für C... 21 1.4 Übersetzen mit der Entwicklungsumgebung... 23 1.5 Übersetzen
MehrEinstieg in die Informatik mit Java
1 / 26 Einstieg in die Informatik mit Java Methoden Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 26 1 Methoden 2 Methodendefinition 3 Parameterübergabe, Methodenaufruf
MehrEinstieg in die Informatik mit Java
1 / 34 Einstieg in die Informatik mit Java Klassen mit Instanzmethoden Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 34 1 Definition von Klassen 2 Methoden 3 Methoden
MehrEINFÜHRUNG IN DIE PROGRAMMIERUNG
EINFÜHRUNG IN DIE PROGRAMMIERUNG GRUNDLAGEN Tobias Witt!! 24.03.2014 ORGANISATORISCHES 09:00-10:30! Täglich Übungen zur Vertiefung! Laptop hier nicht erforderlich! Linux, OS X! Freitag: http://hhu-fscs.de/linux-install-party/
MehrAlgorithmen und Datenstrukturen
Algorithmen und Datenstrukturen Dynamische Datenobjekte Pointer/Zeiger, Verkettete Liste Eigene Typdefinitionen 1 Zeigeroperatoren & und * Ein Zeiger ist die Speicheradresse irgendeines Objektes. Eine
MehrJava: Eine kurze Einführung an Beispielen
Java: Eine kurze Einführung an Beispielen Quellcode, javac und die JVM Der Quellcode eines einfachen Java-Programms besteht aus einer Datei mit dem Suffix.java. In einer solchen Datei wird eine Klasse
MehrExercise 6. Compound Types and Control Flow. Informatik I für D-MAVT. M. Gross, ETH Zürich, 2017
Exercise 6 Compound Types and Control Flow Daniel Bogado Duffner Slides auf: Informatik I für D-MAVT bodaniel@student.ethz.ch n.ethz.ch/~bodaniel Agenda Recap/Quiz Structures Unions Enumerations Loops
MehrEinführung in den Einsatz von Objekt-Orientierung mit C++ I
Einführung in den Einsatz von Objekt-Orientierung mit C++ I ADV-Seminar Leiter: Mag. Michael Hahsler Syntax von C++ Grundlagen Übersetzung Formale Syntaxüberprüfung Ausgabe/Eingabe Funktion main() Variablen
MehrProgrammieren in C. Funktionen mit Zeigern und Adressen. Prof. Dr. Nikolaus Wulff
Programmieren in C Funktionen mit Zeigern und Adressen Prof. Dr. Nikolaus Wulff ByValue versus byreferenz C übergibt immer Kopien der Variablen an Funktionen. Es ist nur dann möglich die Werte von Variablen
Mehr2. Programmierung in C
2. Programmierung in C Inhalt: Überblick über Programmiersprachen, Allgemeines zur Sprache C C: Basisdatentypen, Variablen, Konstanten Operatoren, Ausdrücke und Anweisungen Kontrollstrukturen (Steuerfluss)
Mehr