Τεχνολογίες Υλοποίησης Αλγορίθµων Χρήστος Ζαρολιάγκης Καθηγητής Τµήµα Μηχ/κων Η/Υ & Πληροφορικής Πανεπιστήµιο Πατρών email: zaro@ceid.upatras.gr Γρηγόρης Πράσινος Υποψήφιος ιδάκτωρ Τµήµα Μηχ/κων Η/Υ & Πληροφορικής Πανεπιστήµιο Πατρών Βιβλιοθήκη Boost, Μεταπρογραµµατισµός Αρχετύπων, Γραφικές παραστάσεις 1 / 19
Boost Lambda Library Το πρόβληµα Η STL παρέχει πολλούς έτοιµους αλγόριθµους (π.χ. sort, find) των οποίων η συµπεριφορά µπορεί να µεταβληθεί µε χρήση κατάλληλων functors. Η δηµιουργία ενός ξεχωριστού functor για χρήση µόνο σε ένα σηµείο του προγράµµατος είναι σχετικά επίπονη. Το αποτέλεσµα είναι συνήθως η χρήση πιο παραδοσιακών κατασκευών (π.χ. for loop αντί για for_each()). 2 / 19
Boost Lambda Library Μία λύση Το Ϲητούµενο είναι η δυνατότητα ορισµού µικρών συναρτήσεων, κατευθείαν στο σηµείο που απαιτείται το functor. Η δυνατότητα αυτή υπάρχει στις λεγόµενες συναρτησιακές γλώσσες (functional languages), αλλά και στη C++ (πρότυπα C++11 και C++14). 3 / 19
Boost Lambda Library - Θεωρία Ορισµός Ο συµβολισµός lambda είναι ένας τρόπος αναπαράστασης συναρτήσεων. Χρησιµοποιείται γενικά για τη ϑεωρητική ανάλυση του προγραµµατισµού (π.χ. lambda calculus). Η ϐασική σύνταξη είναι: lambda x 1... x n : e Ορίζεται έτσι µια ανώνυµη συνάρτηση µε παραµέτρους x 1... x n και σώµα e. Παράδειγµα lambda x y : x+y Εφαρµογή: > f=(lambda x y : x+y) > f(2,3) > 5 4 / 19
Boost Lambda Library - Εφαρµογές Οι υψηλού επιπέδου γλώσσες προγραµµατισµού και κυρίως οι λεγόµενες συναρτησιακές γλώσσες (π.χ. Haskell, OCaml) χρησιµοποιούν παρόµοια σύνταξη (π.χ. στη Haskell \x y -> x+y). Η boost δεν χρησιµοποιεί την κλασική σύνταξη, αλλά απεικονίζει τα ορίσµατα µε placeholders: _1 έως _9. 5 / 19
Boost Lambda Library - Παράδειγµα Οπως ϕαίνεται από το παράδειγµα της sort() η σύνταξη γίνεται περίπλοκη για ενδιαφέρουσες εκφράσεις lambda. Γενικά η ϐιβλιοθήκη Boost lambda έχει διάφορους τελεστές για ειδικές περιπτώσεις, όπως µεταβίβαση σε άλλες συναρτήσεις κτλ. for_each(v.begin(), v.end(), _1 + 1); sort(v.begin, v.end(), *_1 < *_2)); sort(v.begin, v.end(), bind(my_cmp, _1, _2)); 6 / 19
Lambda expressions και C++11 Η δυνατότητα δήλωσης εκφράσεων lambda είναι τόσο σηµαντική ώστε αποτελεί µέρος των νέων πρότυπων της γλώσσας. Μία πιθανή σύνταξη είναι: [](int x, int y) -> int {int z = x + y; return z + x;} Επιτρέπεται η χρήση µεταβλητών από την εµβέλεια της δήλωσης (closure): int total = 0; for_each(v.begin(), v.end(), [&total](int x) { total += x; }); cout << total; 7 / 19
Template Metaprogramming in C++ Metaprogramming Η συγγραφή προγραµµάτων που µπορούν να τροποποιήσουν τον εαυτό τους ή άλλα προγράµµατα του ίδιου είδους. Υπάρχουν διάφοροι τύποι metaprogramming ανάλογα µε τον τρόπο που γίνεται η τροποποίηση. (Παράδειγµα: µεταγλώττιση) Χρησιµότητα Η προσαρµογή ενός προγράµµατος σε διαφορετικά περιβάλλοντα και απαιτήσεις (π.χ. embedded συστήµατα). Η συρραφή µιας εφαρµογής από µικρά έτοιµα τµήµατα. 8 / 19
Template Metaprogramming in C++ Για την έκφραση του metaprogram απαιτείται µία ειδική ξεχωριστή γλώσσα ή µία γλώσσα δύο επιπέδων που να επιτρέπει το χειρισµό προγραµµάτων της ίδιας γλώσσας. Η C++ παρέχει µέσω των templates (και µε χρήση partial specialization) το δεύτερο επίπεδο που χρειάζεται για το metaprogramming. Επειδή οι εκφράσεις µε templates υπολογίζονται την ώρα της µεταγλώττισης, αυτός ο τρόπος µετα-προγραµµατισµού ονοµάζεται static metaprogramming. 9 / 19
Template Metaprogramming in C++ Παράδειγµα - factorial // General case - RET stands for return value template <int N> struct Factorial { enum { RET = N * Factorial<N-1>::RET }; }; // Termination template <> struct Factorial<1> { enum { value = 1 }; }; // Example use cout << Factorial<5>::RET << endl; 10 / 19
Template Metaprogramming in C++ Παράδειγµα - συνδυασµοί template <int k, int n> class Combinations { private: enum { num = Factorial<n>::RET, denum = Factorial<k>::RET * Factorial<n-k>::RET }; public: enum { RET = num / denum }; }; cout << Combinations<5,2>::RET << endl; 11 / 19
Template Metaprogramming in C++ template <bool condition, class Then, class Else> struct IF { typedef Then RET; }; template <class Then, class Else> struct IF<false, Then, Else> { typedef Else RET; }; // if sizeof(int) < sizeof(long) then use long // else use int IF< sizeof(int)<sizeof(long), long, int>::ret i; 12 / 19
Template Metaprogramming in C++ - Turing Completeness Είναι δυνατή η συγγραφή κι άλλων δοµών ελέγχου (while, for). Με χρήση συγκεκριµένων συµβάσεων (π.χ. οι κλάσεις µεταπρογραµµατισµού να επιστρέφουν την τιµή τους πάντα µέσω του πεδίου RET) είναι δυνατή η ανάπτυξη ενός πλαισίου δήλωσης και κλήσης συναρτήσεων. Μπορεί να δειχθεί ότι ο µηχανισµός των templates αποτελεί µία ξεχωριστή γλώσσα που είναι Turing Complete. Τα δεδοµένα στα οποία ενεργεί αυτή η γλώσσα είναι τύποι. Η Boost περιέχει την ϐιβλιοθήκη mpl µε πολύ καλή τεκµηρίωση. 13 / 19
Γραφικές παραστάσεις Οι γραφικές παραστάσεις ϑα πρέπει: Να δείχνουν τα δεδοµένα Να προτρέπουν το αναγνώστη να δει την ουσία (κι όχι το design) Να µην διαστρεβλώνουν τα δεδοµένα Να δίνουν συνοχή σε µεγάλα σύνολα δεδοµένων Να επιτρέπουν συγκρίσεις και γενικότερα εξαγωγή συµπερασµάτων 14 / 19
Γραφικές παραστάσεις - ϑεωρία Ορισµός Lie factor = (size of effect shown in graphic) / (size of effect in data) Παράδειγµα: συνήθη γραφήµατα του γενικού δείκτη του χρηµατιστηρίου ή αποτελεσµάτων δηµοσκοπήσεων. 15 / 19
Γραφικές παραστάσεις - ϑεωρία Ορισµός Data-ink ratio = (data ink) / (total ink used to print the graphic) = proportion of a graphic s ink devoted to the non-redundant display of data information = 1.0 - proportion of a graphic that can be erased without loss of data information. Εποµένως... Ο στόχος είναι η µεγιστοποίηση του data-ink και η αποφυγή του non-data-ink µέσα σε λογικά πλαίσια. Γενικώς να αποφεύγονται µη χρήσιµα στοιχεία όπως grids, frames, fill patterns κτλ. 16 / 19
Γραφικές παραστάσεις - µερικές δυνατότητες Quartile plot. Για απεικόνιση ελάχιστης/µέγιστης τιµής και µέσου όρου. Bar chart. Στις περισσότερες περιπτώσεις δεν χρειάζεται άξονας y. Το grid, αν υπάρχει, µπορεί να είναι λευκό. Rangeframe (αντί για scatterplot). Οι άξονες δείχνουν το εύρος των δεδοµένων (αν χρειάζεται µε quartile plot). Small multiples (αντί για πολυδιάστατες παραστάσεις). Πολλαπλές µικρές γραφικές παραστάσεις, στις οποίες µία απο τις διαστάσεις έχει σταθερή τιµή. 17 / 19
Γραφικές παραστάσεις - ϑεωρία Ορισµός Data density = (number of entries in data matrix) / area of data graphic Βασική προϋπόθεση: πρέπει να υπάρχουν αρκετά δεδοµένα. 18 / 19
Γραφικές παραστάσεις - γενικές αρχές Λιτότητα στη σχεδίαση Ενσωµάτωση στη ϱοή του υπόλοιπου κειµένου (και ως προς τη ϑέση και ως προς τη σχεδίαση π.χ. γραµµατοσειρές) Προσπάθεια ανάδειξης του νοήµατος των δεδοµένων. Προσβασιµότητα: δεν χρειάζονται πολύπλοκες κωδικοποιήσεις, στοιχεία για την γραφική παράσταση να αναγράφονται κατευθείαν στην αναπαράσταση των δεδοµένων µε ολόκληρες λέξεις. Προσεκτική χρήση χρώµατος (προβληµατική κωδικοποίηση, αχρωµατοψία, ϕαινόµενα moiré) Μία καλή επιλογή για το σχήµα είναι το χρυσό παραλληλόγραµµο διαστάσεων 1 1.618 19 / 19