Seminar „Effiziente Programmierung in C“
Beschreibung
In diesem Seminar geht es um konkrete Methode zum Zeitsparen beim Programmieren. Das bezieht sich sowohl auf die Zeit zum Debuggen und Weiterentwickeln, als auch auf die Laufzeit des Programms. Dabei sollen Informationen zu den verschiedenen Themen recherchiert werden, und anhand von konkreten Beispielen dargestellt werden. Es können auch die Ergebnisse kleiner vergleichender Untersuchungen zur Auswirkung verschiedener Konstrukte und Methoden gezeigt werden.
Es geht bei diesem Seminar explizit nicht um das einfache Vorstellen von Sprachkonstrukten, sondern um die Recherche & Bewertung von Nutzungsmöglichkeiten.
Organisatorisches
Wichtig: 3 Wochen vor dem Termin beim Betreuer melden!
Abzugeben sind:
- Präsentation als PDF Datei (wenn viel Farbe verwendet wird, bitte auch eine Druckversion)
- Ausarbeitung als PDF Datei
- Compilierfähiger Beispielcode als .tgz Archiv (mindestens für alle Beispiele, die in Präsentation und/oder Ausarbeitung verwendet wurden, gerne auch mehr)
Wenn im Rahmen dieses Seminars Performancemessungen gemacht werden, müssen diese auf den Knoten west1, … west10 unseres Lehre-Clusters durchgeführt werden. Sprecht einfach euren Betreuer an, dann geben wir euch eine Account.
Beachten Sie auch unsere allgemeinen organisatorischen Hinweise zu Seminaren.
Zielgruppe
Das Seminar eignet sich für Studierende der Informatik in den Diplom- und Bachelorstudiengängen. Studierende anderer Studiengänge müssen die Anrechnung mit dem jeweiligen Prüfungsausschuss klären.
Interessierte Zuhörer sind auch herzlich willkommen.
Voraussetzungen
Grundkenntnisse in C, C++ oder Objective-C.
Daten der Veranstaltung
Dozenten
- Nathanael Hübbe
- Michael Kuhn
- Konstantinos Chasapis
- Thomas Ludwig
Themenliste
Die Themenliste hier gibt eine erste Übersicht über den Inhalt des Seminars, die Liste wird noch nach Absprache mit den Teilnehmern angepasst.
- Kommentierung:
- Welche Denkschulen gibt es?
- Welche Antworten finden sie auf die Fragen
- Was ist ein hilfreicher Kommentar?
- Was sollte man kommentieren?
- Was sollte man nicht kommentieren?
- Welche Hinweise sind allgemein gültig, worin unterscheiden sie sich?
- Und was heißt das für mich als Programmierer?
- Siehe auch: http://queue.acm.org/detail.cfm?id=1053354
- Umgang mit Buffern:
- Was kann man tun, um Indexfehler zu vermeiden?
- Allokation auf dem Heap ↔ Allokation auf dem Stack
- Siehe auch:
- Umgang mit Pointern
- Wie nutzt man sie sinnvoll?
- Was sind die Performance-Aspekte?
- Und wie vermeidet man Fehler?
- Einige Stichworte: Uninitialisierte Pointer, Falsche Typen, dangling pointer, NULL pointer, Alloziierungsfehler, Aliasfehler.
- Mehrdimensionale Arrays
- Wie funktionieren sie?
- Wie kann man sie typsicher übergeben?
- Wie kann man sie korrekt casten?
- Im Gegensatz zu den anderen Themen geht es hierbei explizit um die korrekte, detailierte und verständliche Darstellung eines Sprachfeatures, mit dem Ziel, dass die Zuhörer es wirklich verstehen; nicht um die Frage, wo und wie es sinnvoll einzusetzen ist. Der Grund ist, dass es ein komplexes Feature ist, das nur selten angewendet wird weil es noch viel seltener verstanden wird.
- Siehe auch:
- Undefined Behavior:
- Was ist Undefined Behavior?
- Wie schlägt der Compiler Kapital aus Undefined Behavior?
- Was sind die Gefahren?
- Worauf sollte man achten?
- Präprozessor:
- Was kann man damit machen?
- Wie geht das?
- Wo ist es sinnvoll?
- Bringt es Performance?
- Und wo sind die Fallen?
- Objektorientierung in C
- Geht das?
- Und wenn ja, wie?
- Und was ist mit “private” und “public”?
- Die Programmiersprache Vala
- Sprachweiterentwicklung von C
- Objektorientierung
- Welcher C Code entsteht dabei?
- Polymorphie in C:
- Welche Ansätze gibt es dafür?
- Lohnt sich der Aufwand?
- Was bedeuten die verschiedenen Ansätze für die Performance?
- Reference Counting:
- Was ist das?
- Was bringt es?
- Wie setzt man es ein?
- Wieviel Rechenzeit kostet es?
- Und welche Gefahren gibt es?
- C11
- Was ist neu?
- In welchen Situationen kann man es sinnvoll einsetzen?
- Was sollte man sich unbedingt merken?
- Zu den Themen bezüglich Objektorientierung, siehe auch:
- Compiler-Optimierung
- Was kann der Compiler?
- Was kann er nicht?
- Und wie nutzt man es?
- Die Keywörter “restricted”, “static” & “inline”
- Was tun sie?
- Was bringt das?
- Und wie setzt man es sinnvoll ein?
- Alignment
- Wo wird es angewendet?
- Was bewirkt es?
- Wie kann man Overhead vermeiden?
- Caches:
- Wie funktionieren sie?
- Was bedeuten Caches für die Programmierung?
- Und wie nutzt man sie effizient?
- Indirektion:
- Welche Spielarten gibt es?
- Was bringt sie, was kostet sie?
- Wie kann man sie effizient einsetzen?
- Datenstrukturen im Linux-Kernel:
- Wie funktionieren sie?
- Inwiefern unterscheiden sie sich von anderen Implementierungen von verlinkten Listen, Bäumen, etc.?
- Was sind die Vor- & Nachteile dieses Ansatzes?
- Wann sollte man sie verwenden?
- Effizienz von Allokatoren
- Welche Fragen stellen sich bei der Implementation von `malloc()`?
- Welche Algorithmen kommen in Frage/wurden untersucht?
- Welche fertigen Implementationen gibt es?
- Wie ist die Performance dieser Implementationen?
- Algorithmus Analyse:
- Wie kann ich die Performance eines Algorithmus bewerten?
- Ist O(n) immer besser als O(n^2)?
- Wie hilft die Algorithmus Analyse bei der Optimierung?
- Welche Art von Optimierungspotenzial kann man mit Algorithmus Analyse nicht erkennen?
- Algorithmen:
- Algorithmenstrukturen:
- Für alle Unterthemen:
- Was ist das Grundprinzip?
- Welche Algorithmen wenden es an? (Nur ein bis drei Beispiele, aber die bitte mit ausreichend Tiefe!)
- Was sind die typischen Merkmale?
- Wann kann man es anwenden?
- Wann ist es sinnvoll?
- Teile & Herrsche
- Greedy Algorithmen
- Dynamische Programmierung
- Hashing
- Was ist ein Hashwert?
- Wie funktioniert eine Hashtabelle?
- Was bringt es, was kostet es?
- Wie benutzt man typische Bibliotheksimplementationen?
- Und was ist ein HTree?
- Laufzeitkosten:
- Was ist wie teuer?
- Funktionsaufrufe
- Berechnungen
- Mathefunktionen
- if-Konstrukte
- switch-Anweisungen
- Speicherzugriffe
- Systemaufrufe
Weitere Themen können gerne vorgeschlagen werden.
Zeitplan
Materialien
Literaturhinweise
* http://smackerelofopinion.blogspot.de/2012/09/striving-for-better-code-quality.html
Ben Klemens: 21st Century C, ISBN-13:978-1-449-32714-9
Robert C. Martin: Clean Code / A Handbook of Agile Software Craftsmanship, ISBN-13:978-0-13-235088-4