Beobachtung 1: Beispiel: Intuitive Programme sind oft ineffizient.

Ähnliche Dokumente
Compilerbau + Virtuelle Maschinen

1 Maschinenunabhängige Optimierungen. Maschinenunabhängige Optimierungen Wintersemester 2008/09 1 / 17

Programmieren I. Überblick. Institut für Angewandte Informatik. KIT Die Forschungsuniversität in der Helmholtz-Gemeinschaft

Abschnitt 11: Korrektheit von imperativen Programmen

Compiler für f r Eingebettete Systeme (CfES)

Programmieren I. Überblick. Institut für Angewandte Informatik. KIT Die Forschungsuniversität in der Helmholtz-Gemeinschaft

Programmieren I. Überblick. Institut für Angewandte Informatik. KIT Die Forschungsuniversität in der Helmholtz-Gemeinschaft

Algorithmen und Datenstrukturen 1 Kapitel 4.1

Universität Karlsruhe (TH)

Übungs- und Praktikumsaufgaben zur Systemprogrammierung Dipl.-Ing. H. Büchter (Lehrbeauftragter) FH-Dortmund WS 2001/2002 / SS 2002

Stackmaschine; Speicheradressierung

Technische Informatik 1 Übung 8 Instruktionsparallelität (Rechenübung) Andreas Tretter 8./9. Dezember Bitte immer eine Reihe freilassen

Algorithmen und Datenstrukturen

2 Eine einfache Programmiersprache

2 Eine einfache Programmiersprache. Variablen. Operationen Zuweisung. Variablen

Algorithmen und Datenstrukturen Laufzeitabschätzung

n 1. Der Begriff Informatik n 2. Syntax und Semantik von Programmiersprachen - 1 -

Programmiersprachen und Übersetzer

Algorithmen und Datenstrukturen

Institut für Programmierung und Reaktive Systeme 7. Juli Programmieren II. Übungsklausur

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

7. Optimierung. Verschiedene Hilfsmittel zur Entscheidung der Optimierungsfrage:

Memory Models Frederik Zipp

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen - 1 -

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen - 1 -

1. Typen 1.1 Typsicherheit 1.2 Typprüfung

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

Das Programm ist deterministisch: es gibt für jedes Ziel höchstens eine Klausel, die zur erfolgreichen Ableitung des Zieles

Formale Sprachen und Automaten

Zwischencode-Erzeugung. 2. Juni 2009

Systeme I: Betriebssysteme Kapitel 8 Speicherverwaltung

2 Eine einfache Programmiersprache

Institut für Programmierung und Reaktive Systeme 6. Juli Programmieren II. Übungsklausur

Lösungshinweise/-vorschläge zum Übungsblatt 2: Grundlagen der Programmierung (WS 2018/19)

1. Teilklausur Gruppe A. Bitte in Druckschrift leserlich ausfüllen!

Mathematische Beweise und Symbolische Tests

7 Laufzeit-Speicherverwaltung

Testen nebenläufiger Objekte

Übersicht. Speichertypen. Speicherverwaltung und -nutzung. Programmieren in C

Algorithmen und Datenstrukturen 2

Grundlagen: Algorithmen und Datenstrukturen

Dynamische Speicherverwaltung

Software Entwicklung 1. Fallstudie: Arithmetische Ausdrücke. Rekursive Klassen. Überblick. Annette Bieniusa / Arnd Poetzsch-Heffter

Algorithmen und Datenstrukturen

Abstarkte Interpretation I

Parameterübergabemechanismen für den Methodenaufruf

Nachklausur LÖSUNG. Bitte in Druckschrift leserlich ausfüllen!

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

Algorithmen und Datenstrukturen

PROCESSING EINE EINFÜHRUNG IN DIE INFORMATIK. Created by Michael Kirsch & Beat Rossmy

Intensivübung zu Algorithmen und Datenstrukturen

Tutorium Softwaretechnik I

2 Eine einfache Programmiersprache

Berechenbarkeit und Komplexität Vorlesung 10

Software Entwicklung 1

Programmieren in Java

Kapitel 3: Sortierverfahren Gliederung

Definition von LR(k)-Grammatiken

Berechenbarkeit und Komplexität Vorlesung 11

Programmierung für Mathematik HS10 Übung 8

Algorithmen und Datenstrukturen (Informatik II) SS Klausur

ML Deployment. Vom Prototyp zur Produktion

In heutigen Computern findet man schnellen/teuren als auch langsamen/billigen Speicher

Systeme I: Betriebssysteme Kapitel 4 Prozesse. Maren Bennewitz

Einführung in die Programmierung

Kapitel 1: Einleitung. Gliederung. Zum Begriff Informatik Zum Begriff Algorithmus Zum Begriff Programmieren

Grundlagen der Programmierung 2 (Comp-D)

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

Welche Informatik-Kenntnisse bringen Sie mit?

Einführung in die Programmierung

Software Entwicklung 1. Spezifikation von Prozedureigenschaften. Spezifikation prozeduraler Programme. Warum Spezifikationen?

Ströme als unendliche Listen in Haskell

Grundzüge der Wirtschaftsinformatik WS 2002/03. Wiederholung Java. Programmierzyklus. Heiko Rossnagel Problem

Einführung in die Programmierung Wintersemester 2016/17

1.2 LOOP-, WHILE- und GOTO-Berechenbarkeit

Assembler - Einleitung

Effiziente Überwachung von Laufzeiteigenschaften in Soft- und Hardware

Nachklausur Bitte in Druckschrift leserlich ausfüllen!

2 Eine einfache Programmiersprache

. Die obige Beschreibung der Laufzeit für ein bestimmtes k können wir also erweitern und erhalten die folgende Gleichung für den mittleren Fall:

Klausur über den Stoff der Vorlesung Grundlagen der Informatik II (90 Minuten)

Klammersprache Definiere

Informatik I - Programmierung Globalübung Hoare-Kalkül. Thomas Weiler. Fachgruppe Informatik RWTH Aachen. T. Weiler, RWTH Aachen - 1 -

Theoretische Informatik Kap 2: Berechnungstheorie

Statische Analyse. Holger Hans Peter Freyther 1. Seminar zu Ursachen und Vermeidung von Fehlern in der Softwareentwicklung, 2006

Übung Algorithmen und Datenstrukturen

Grundlagen der theoretischen Informatik

VU Software Paradigmen / SS 2014

Algorithmen und Programmierung III

1 Funktionale vs. Imperative Programmierung

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

Grundlagen der Rechnerarchitektur. Einführung

(08 - Einfache Sortierverfahren)

Kapitel 3: Untere Schranken für algorithmische Probleme Gliederung

Informatik II: Algorithmen und Datenstrukturen SS 2013

Transkript:

Beobachtung 1: Intuitive Programme sind oft ineffizient. Beispiel: void swap (int i, int j) { int t; if (a[i] > a[j]) { t = a[j]; a[j] = a[i]; a[i] = t; } } 731

Ineffizienzen: Adressen a[i], a[j] werden je dreimal berechnet :-( Werte a[i], a[j] werden zweimal geladen :-( Verbesserung: Gehe mit Pointer durch das Feld a; speichere die Werte von a[i], a[j] zwischen! 732

void swap (int *p, int *q) { int t, ai, aj; ai = *p; aj = *q; if (ai > aj) { t = aj; *q = ai; *p = t; // t kann auch noch } // eingespart werden! } 733

Beobachtung 2: Höhere Programmiersprachen (sogar C :-) abstrahieren von Hardware und Effizienz. Aufgabe des Compilers ist es, den natürlich erzeugten Code an die Hardware anzupassen. Beispiele:... Füllen von Delay-Slots;... Einsatz von Spezialinstruktionen;... Umorganisation der Speicherzugriffe für besseres Cache-Verhalten;... Beseitigung (unnötiger) Tests auf Overflow/Range. 734

Beobachtung 3: Programm-Verbesserungen sind nicht immer korrekt :-( Beispiel: y = f() + f(); == y = 2 * f(); Idee: Spare zweite Auswertung von f()... Problem: Die zweite Auswertung könnte ein anderes Ergebnis liefern als die erste (z.b. wenn f() aus der Eingabe liest :-) 735

Beobachtung 3: Programm-Verbesserungen sind nicht immer korrekt :-( Beispiel: y = f() + f(); == y = 2 * f(); Idee: Spare zweite Auswertung von f()??? Problem: Die zweite Auswertung könnte ein anderes Ergebnis liefern als die erste (z.b. wenn f() aus der Eingabe liest :-) 736

Folgerungen: = Optimierungen haben Voraussetzungen. = Die Voraussetzungen muss man: formalisieren, überprüfen :-) = Man muss beweisen, dass die Optimierung korrekt ist, d.h. die Semantik erhält!!! 737

Beobachtung 4: Optimierungs-Techniken hängen von der Programmiersprache ab: welche Ineffizienzen auftreten; wie gut sich Programme analysieren lassen; wie schwierig / unmöglich es ist, Korrektheit zu beweisen... Beispiel: Java 738

Unvermeidbare Ineffizienzen: Array-Bound Checks; dynamische Methoden-Auswahl; bombastische Objekt-Organisation... Analysierbarkeit: + keine Pointer-Arithmetik; + keine Pointer in den Stack; dynamisches Klassenladen; Reflection, Exceptions, Threads,... Korrektheitsbeweise: + mehr oder weniger definierte Semantik; Features, Features, Features; Bibliotheken mit wechselndem Verhalten... 739

Beispiel: Zwischendarstellung von swap() 0 : A 1 = A 0 + 1 i; // A 0 == &a 1 : R 1 = M[A 1 ]; // R 1 == a[i] 2 : A 2 = A 0 + 1 j; 3 : R 2 = M[A 2 ]; // R 2 == a[ j] 4 : if (R 1 > R 2 ) { 5 : A 3 = A 0 + 1 j; 6 : t = M[A 3 ]; 7 : A 4 = A 0 + 1 j; 8 : A 5 = A 0 + 1 i; 9 : R 3 = M[A 5 ]; 10 : M[A 4 ] = R 3 ; 11 : A 6 = A 0 + 1 i; 12 : M[A 6 ] = t; } 740

Optimierung 1: 1 R == R Optimierung 2: Wiederbenutzung von Teilausdrücken A 1 == A 5 == A 6 A 2 == A 3 == A 4 M[A 1 ] == M[A 5 ] M[A 2 ] == M[A 3 ] R 1 == R 3 741

Damit erhalten wir: A 1 = A 0 + i; R 1 = M[A 1 ]; A 2 = A 0 + j; R 2 = M[A 2 ]; if (R 1 > R 2 ) { t = R 2 ; M[A 2 ] = R 1 ; M[A 1 ] = t; } 742

Optimierung 3: Verkürzung von Zuweisungsketten :-) Ersparnis: vorher nachher + 6 2 6 0 load 4 2 store 2 2 > 1 1 = 6 2 743

5 Perspektiven Herausforderungen: neue Hardware; neue Programmiersprachen; neue Anwendungen für Compiler-Technologie :-) 744

5.1 Hardware Die Code-Erzeugung soll die Möglichkeiten der Hardware optimal ausnutzen... Herausforderungen: Neue Hardware: Speicher-Hierarchie mit unterschiedlich schnellen Caches für verschiedene Zwecke; On-Board Nebenläufigkeit mit Pipelines, mehreren ALUs, spekulativer Parallelität,... Interaktion mit mächtigen Zusatzkomponenten wie Graphik-Karten... 745

Eingeschränkte Hardware: z.b. auf Chip-Karten, in Kühlschränken, Bremsanlagen, Steuerungen... == ubiquitous Computing minimaler Energie-Verbrauch :-) minimaler Platz :-) Echtzeit-Anforderungen; Korrektheit; Fehler-Toleranz. 746

5.2 Programmiersprachen Spezielle Features: mobiler Code; Nebenläufigkeit; graphische Benutzeroberflächen; Sicherheits-Komponenten; neue / bessere Typsysteme; Unterstützung für Unicode und XML. 747

Neue Programmiersprachen: XSLT; XQuery; Web-Services; anwendungs-spezifische Sprachen... 748

5.3 Programmierumgebungen Diverse Programmierhilfsmittel benutzen Compiler-Technologie... syntax-gesteuerte Editoren; Programm-Visualisierung; automatische Programm-Dokumentation; partielle Codeerzeugung aus UML-Modellen; UML-Modell-Extraktion == reverse engineering Konsistenz-Überprüfungen, Fehlersuche; Portierung. 749

5.4 Neue Anforderungen Zuverlässigkeit Sicherheit 750

... im Rest der Vorlesung behandeln wir ausgewählte Themen, die bei der Code-Erzeugung für reale Maschinen relevant sind. Auch hier spielt die Idee der Generierung einzelner Komponenten eine wichtige Rolle: 751