Μ117: Προηγμένες Μέθοδοι Προγραμματισμού
Χειμερινό εξάμηνο 2016-17, Τετάρτη 2-6μμ, αίθουσα ΣΤ
Διδάσκων: Γιώργος Φουρτούνης (gfour@di)
Βοηθοί: Μάνος Αγγελογιαννόπουλος (eangelog@di), Θεόφιλος Μουρατίδης (mtheofilos@di)
Περιγραφή: Το μάθημα συνδέει βασικες αρχές της σχεδίασης και της υλοποίησης γλωσσών προγραμματισμού με προχωρημένες τακτικές προγραμματισμού. Καλύπτονται:
-
Σχεδιαστικά χαρακτηριστικά των σύγχρονων γλωσσών προγραμματισμού, που απαντώνται στην πράξη κατά την ανάπτυξη προγραμμάτων σε γλώσσες όπως η Java ή η C++. Ενδεικτικά αναφέρονται τα εξής:
-
Σχεδιαστικές επιλογές, εφαρμογές και επεκτάσεις του αντικειμενοστραφούς μοντέλου (πολλαπλή κληρονομικότητα, reflection, meta-object protocols, aspect-oriented programming).
-
Design patterns.
-
Πολυνηματικός προγραμματισμός.
-
Στοιχεία συστημάτων τύπων (universal/existential types, type inference) και οι μηχανισμοί γενικών τύπων που χρησιμοποιούνται στη Java και τη C++ (generics, templates, variance).
-
-
Βασικές λεπτομέρειες της υλοποίησης γλωσσών προγραμματισμού που χρειάζονται για την ανάπτυξη αποδοτικών προγραμμάτων. Καλύπτονται τεχνικές που χρησιμοποιούνται στη μεταγλώττιση γλωσσών ή στην εκτέλεση με εικονικές μηχανές (fast dynamic dispatch, garbage collection, object layout, virtual machine optimizations).
Βαθμολόγηση:
- 60% εξετάσεις (20% πρόοδος + 30% τελικό + 10% το μέγιστο των δύο)
- 35% ασκήσεις (τουλάχιστον 4 μικρές + 1 μεσαία, με διπλό βάρος, ιδεωδώς και μία τελική παρουσίαση)
- 5% συμμετοχή στην τάξη
Σημειώσεις μαθήματος (πολύ συνοπτικές):
- Εισαγωγή Java-C++
- Overloading/overriding/hiding και παραδείγματα overloading/overriding
- Εισαγωγή στο Expression Problem και στο πρότυπο Visitor, Design Patterns
- Aspect-Oriented Programming
- Πολυνηματικός προγραμματισμός
- Παραδείγματα
- Μορφή αντικειμένων στη μνήμη για απλή και πολλαπλή κληρονομικότητα
- Μορφή αντικειμένων στη μνήμη σε Java, κλήση μεθόδων interface, βελτιστοποιήσεις δυναμικών κλήσεων
- Αυτόματη ανακύκλωση μνήμης (Garbage Collection)
- Τύποι και πολυμορφισμός
Ασκήσεις:
- Άσκηση 0
- Άσκηση 1
- Άσκηση 2
- Άσκηση 3
- Άσκηση 4
Η προθεσμία των προγραμματιστικών ασκήσεων είναι τα μεσάνυχτα (11:59μμ) της μέρας που ορίζεται στην άσκηση.
Σύνδεσμοι:
- Java Tutorial
- Συλλογή από εισαγωγικά κείμενα για πρότυπα σχεδίασης
- Inversion of Control (με παράδειγμα)
- Παραδείγματα reflection σε Java και Python
- Aspect-Oriented Programming papers: An Overview of AspectJ (2001), ECOOP’97 paper και AspectJ, παράδειγμα AspectJ
- Εισαγωγή στον πολυνηματικό προγραμματισμό
- Χρήση wait(), notify() και notifyAll() για αναγνώριση συνθήκης
- Διπλωματική Myers: το κεφάλαιο 2 περιγράφει τις βασικές ιδέες για τη μορφή αντικειμένων στη C++
- Java 8 και object layout: Java Virtual Machine Specification, παράγραφος 2.7
- Άρθρο για κλήση interface στη Java
- Inline caches στο OpenJDK (υποενότητα «Methods»)
- Επισκόπηση τεχνικών ανακύκλωσης μνήμης
- Write barriers: snapshot at the beginning και incremental update
- Εισαγωγικό κείμενο για Java generics/wildcards
- Κύριο ερευνητικό άρθρο για Java generics
- Άρθρο για variance