====== 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. Beachten Sie auch unsere allgemeinen organisatorischen [[:teaching:organisatorische_hinweise:seminar_proseminar#seminare|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 ===== || Zeit || Donnerstag, 10--12 Uhr || || Ort || [[http://maps.google.com/maps?q=DKRZ,+Bundesstra%C3%9Fe+45a,+20146+Hamburg&hl=de&cd=2&ei=BUxYS-GvKIuLOKaotbgJ&sig2=Kv8CBjHeXm8lAVC3XxRrIQ&ie=UTF8&view=map&cid=262423906154203330&ved=0CBsQpQY&hq=DKRZ,+Bundesstra%C3%9Fe+45a,+20146+Hamburg&hnear=&z=16&iwloc=A|DKRZ]], Raum 034 || || Beginn || 18.10.2012 || || Vorbesprechung || 18.10.2012, 10--12 Uhr || || Mailingliste || [[http://wr.informatik.uni-hamburg.de/listinfo/epc-1213|EPC-1213]] || ===== Dozenten ===== * [[People:Alumni:Nathanael Hübbe]] * [[People:Alumni:Michael Kuhn]] * [[People:Alumni:Julian Kunkel]] ===== Themenliste ===== Die Themenliste hier gibt eine erste Übersicht über den Inhalt des Seminars, die Liste wird noch nach Absprache mit den Teilnehmern angepasst. * Kommentierung: * Was ist ein hilfreicher Kommentar? * Was sollte man kommentieren? * Was sollte man nicht kommentieren? * 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: * https://developer.apple.com/library/mac/#documentation/security/conceptual/SecureCodingGuide/Articles/BufferOverflows.html * http://www.ibm.com/developerworks/linux/library/l-sp4/index.html * 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. * Undefined Behavior: * Was ist Undefined Behavior? * Wie schlägt der Compiler Kapital aus Undefined Behavior? * Was sind die Gefahren? * Worauf sollte man achten? * Siehe auch: http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html * Präprozessor: * Was kann man damit machen? * Wie geht das? * Bringt es Performance? * Und wo sind die Fallen? * Objektorientierung in C: * Geht das? * Und wenn ja, wie? * Und was ist mit "private" und "public"? * 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? * Siehe auch: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html * Zu den Themen bezüglich Objektorientierung, siehe auch: * http://www.eventhelix.com/realtimemantra/basics/object_oriented_programming_in_c.htm * http://www.planetpdf.com/codecuts/pdfs/ooc.pdf * Compiler-Optimierung: * Was kann der Compiler? * Was kann er nicht? * Und wie nutzt man es? * Das "restricted" Keyword: * Was tut es? * Wie tut es das? * Und wie benutzt man es sinnvoll? * "static" & "inline": * Was bedeutet das? * Was bringt es? * Und wie setzt man es sinnvoll ein? * Die innere Schleife: * Was ist das? * Wie erkennt man sie? * Und wie hilft sie bei der Optimierung? * 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? * 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? * Laufzeitkosten: * Was ist wie teuer? * Funktionsaufrufe * Berechnungen * Mathefunktionen * if-Konstrukte * switch-Anweisungen * Speicherzugriffe * Systemaufrufe Weitere Themen können gerne vorgeschlagen werden. ===== Zeitplan ===== * 8. 11. 2012: **Pointer** -- //Alexander Lambertz// ((Nathanael Hübbe)) -- {{:teaching:wintersemester_2012_2013:epc-1213-lambertz-pointer-praesentation.pdf|Präsentation}} * 22. 11. 2012: **Präprozessor** -- //Christian Peter// ((Michael Kuhn)) -- {{:teaching:wintersemester_2012_2013:epc-1213-peter-praeprozessor-praesentation.pdf|Präsentation}} {{:teaching:wintersemester_2012_2013:epc-1213-peter-praeprozessor-ausarbeitung.pdf|Ausarbeitung}} * 22. 11. 2012: **Function Pointer** -- //Christopher Gerlach// ((Konstantinos Chasapis)) * 29. 11. 2012: **Compileroptimierung** -- //Mirko Köster// ((Julian Kunkel)) -- {{:teaching:wintersemester_2012_2013:epc-1213-koester-compiler_optimization-praesentation.pdf|Präsentation}} {{:teaching:wintersemester_2012_2013:epc-1213-koester-compiler_optimization-druckversion.pdf|Präsentation (Druckversion)}} {{:teaching:wintersemester_2012_2013:epc-1213-koester-compiler_optimization-ausarbeitung.pdf|Ausarbeitung}} * 6. 12. 2012: **Buffer** -- //Christoph Brauer// ((Michael Kuhn)) -- {{:teaching:wintersemester_2012_2013:epc-1213-brauer-buffer-praesentation.pdf|Präsentation}} {{:teaching:wintersemester_2012_2013:epc-1213-brauer-buffer-materialien.tar.gz|Materialien}} {{:teaching:wintersemester_2012_2013:epc-1213-brauer-buffer-ausarbeitung.pdf|Ausarbeitung}} * 13. 12. 2012: **Kommentare** -- //Sebastian Rothe// ((Michael Kuhn)) -- {{:teaching:wintersemester_2012_2013:epc-1213-rothe-kommentare-praesentation.pdf|Präsentation}} {{:teaching:wintersemester_2012_2013:epc-1213-rothe-kommentare-ausarbeitung.pdf|Ausarbeitung}} * 13. 12. 2012: **Polymorphie** -- //Anna-Marie Costea// ((Konstantinos Chasapis)) * 20. 12. 2012: **Caches** -- //Philipp Ruppel// ((Konstantinos Chasapis)) * 20. 12. 2012: **Objektorientierung** -- //Rado Grigoras// ((Nathanael Hübbe)) -- {{:teaching:wintersemester_2012_2013:epc-1213-grigoras-oo-praesentation.pdf|Präsentation}} {{:teaching:wintersemester_2012_2013:epc-1213-grigoras-oo-materialien.tar.gz|Materialien}} * 10. 1. 2013: **Hashing** -- //Alexander Koglin// ((Julian Kunkel)) -- {{:teaching:wintersemester_2012_2013:epc-1213-koglin-hashing-praesentation.pdf|Präsentation}} {{:teaching:wintersemester_2012_2013:epc-1213-koglin-ausarbeitung.pdf|Ausarbeitung}} * 17. 1. 2013: **Reference Counting** -- //Kevin Köster// ((Michael Kuhn)) -- {{:teaching:wintersemester_2012_2013:epc-1213-koester-reference-counting-praesentation.pdf|Präsentation}} {{:teaching:wintersemester_2012_2013:epc-1213-koester-reference-counting-ausarbeitung.pdf|Ausarbeitung}} * 24. 1. 2013: **restrict** -- //Torsten Zühlke// ((Julian Kunkel)) * 31. 1. 2013: **static & inline** -- //Söhnke Kracht// ((Konstantinos Chasapis)) * 31. 1. 2013: **Geschwindigkeit von Sprachelementen** -- //Tobias Rummelt// ((Nathanael Hübbe)) ===== Materialien ===== ===== Literaturhinweise ===== * http://smackerelofopinion.blogspot.de/2012/09/striving-for-better-code-quality.html Robert C. Martin: Clean Code / A Handbook of Agile Software Craftsmanship, ISBN-13:978-0-13-235088-4 Ben Klemens: 21st Century C, ISBN-13:978-1-449-32714-9