FORTRAN & Αντικειμενοστραφής Προγραμματισμός ΣΝΜΜ 2017 M8 Αντικειμενοστραφής Προγραμματισμός Γεώργιος Παπαλάμπρου Επικ. Καθηγητής ΕΜΠ Εργαστήριο Ναυτικής Μηχανολογίας george.papalambrou@lme.ntua.gr ΕΜΠ/ΣΝΜΜ Εργαστήριο Ναυτικής Μηχανολογίας 1
Εισαγωγή Το αντικείμενο OOP είναι ευρύ και ειδικευμένο. Παρουσιάζονται εδώ οι βασικές αρχές με περιγραφικό τρόπο. Ο αναγνώστης μπορεί να βρεί περισσότερα στοιχεία στις εξής πηγές: 1. Metcalf et al., κεφ. 14. 2. Holcomb, K., SCIENTIFIC PROGRAMMING IN FORTRAN 2003, A tutorial Including Object-Oriented Programming, [https://wiki.uiowa.edu/download/attachments/109785161/fortran-novella- Holcomb.pdf, sec. 11] 3. Akin, E., Object Oriented Programming via Fortran 90/95 [pdf από web, sec. 3, 5, 6] - προτείνεται 4. FORTRAN Wiki: http://fortranwiki.org/fortran/show/objectoriented+programming 2
1.1 Οι Γλώσσες προγραμματισμού 3
Οι Γλώσσες προγραμματισμού PC Machine language Assembly language Procedure programming grosspay=basepay+overtimepay Object Oriented programming 4
Οι Γλώσσες προγραμματισμού Victor Berdonosov, Alena Zhivotova, THE EVOLUTION OF THE OBJECT-ORIENTED PROGRAMMING LANGUAGES, Article in Procedia Engineering June 2014 - internet 5
Οι Γλώσσες προγραμματισμού 6
1.2 Εξέλιξη Ο Αντικειμενοστραφής προγραμματισμός δεν είναι νέα τεχνική προγραμματισμού. Μία από τις πρώτες γλώσσες που μπορούσε να προσφέρει τέτοια υποστήριξη ήταν η Simula 67, μια γλώσσα σχεδιασμένη για προσομοίωση διακριτών συμβάντων (discrete events), στο Νορβηγικό Υπολογιστικό Κέντρο στο Όσλο το 1960. Μία από τις επόμενες σημαντικές εξελίξεις ήταν το 1970 στο Xerox Palo Alto, ΗΠΑ, όπου ερευνήθηκαν τρόποι όπου διαφορετικοί άνθρωποι θα μπορούσαν να χρησιμοποιήσουν αποτελεσματικά υπολογιστική ισχύ. Ένα από τα αποτελέσματα της εργασίας ήταν το περιβάλλον Smalltalk (1972), όπου τα αντικείμενα (objects) αποτελούν τον πυρήνα. 7
Εξέλιξη Κατά τις δεκαετίες του 1980 και του 1990, δημιουργήθηκε μία σειρά από αντικειμενοστραφείς γλώσσες προγραμματισμού. Οι πιο καταξιώμενες πλέον περιλαμβάνουν: Python, Guido van Rossum, Ολλανδία C ++, Bjarne Stroustrup στα Bell Labs Java, James Gosling, αρχικά Sun, τώρα Oracle 8
Γλώσσες προγραμματισμού Κατηγοριοποιώντας τις γλώσσες προγραμματισμού με βάση τον τρόπο οργάνωσης του προγράμματος έχουμε: Διαδικαστικές γλώσσες (procedural) όπου το πρόγραμμα είναι οργανωμένο σε διαδικασίες, που αποτελούνται από σειρές εντολών που περιγράφουν αλγορίθμους, πχ Fortran, Pascal, C. Αντικειμενοστραφείς γλώσσες (object-oriented) όπου το πρόγραμμα είναι οργανωμένο σε αντικείμενα (objects), πχ Java, C++. J. Akin, Rice U. 9
Γλώσσες προγραμματισμού Διαδικαστική γλώσσα (procedure-oriented programming): sequence εργασιών προς εκτέλεση: reading, calculating, printing. Δίνεται έμφαση σε Functions 10
Γλώσσες προγραμματισμού Αντικειμενοστραφής γλώσσα (object-oriented programming): αντιμετωπίζει τα δεδομένα ως κρίσιμο στοιχείο στην ανάπτυξη του προγράμματος. Συνδέει τα δεδομένα πιο στενά με τις λειτουργίες και τα προστατεύει από τυχαία τροποποίηση από εξωτερικές λειτουργίες. Το OOP επιτρέπει να αποσυνθέσουμε ένα πρόβλημα σε έναν αριθμό οντοτήτων που ονομάζονται αντικείμενα (objects) και μετά χτίζει δεδομένα και λειτουργίες γύρω από αυτές τις οντότητες. Δίνεται έμφαση σε data 11
1.3 Αντικειμενοστραφής Προγραμματισμός Οι γλώσσες FORTRAN, Pascal υποστηρίζουν το πρότυπο data-procedure, όπου ενεργές διαδικασίες επιδρούν σε παθητικά δεδομένα. Έτσι η function sqrt(x) λαμβάνει τον αριθμό x και επιστέφει την τετραγωνική του ρίζα. Οι γλώσσες OOP υλοποιούν προσέγγιση με κέντρο το αντικείμενο (object). Αντί τα δεδομένα να περνούν σε διαδικασίες, τα αντικείμενα (δεδομένα) εκτελούν λειτουργίες πάνω τους. 12
Αντικειμενοστραφής Προγραμματισμός Έτσι ένα αντικείμενο αποτελείται όχι μόνο από δεδομένα (που τα αποθηκεύει στην «ιδωτική» του μνήμη) αλλά έχει και την ικανότητα να αλλάξει την πληροφορία και να εκτελέσει διάφορες εργασίες (tasks). Οι εργασίες (tasks) ονομάζονται μέθοδοι (methods) του αντικειμένου. Οι μέθοδοι ενεργούν μέσω μηνύματος (message) στο αντικείμενο. 13
OOP Το αντικείμενο που λαμβάνει το μήνυμα λέγεται δέκτης (receiver). Το κάθε αντικείμενο γνωρίζει τα μηνύματα που καταλαβαίνει και για κάθε μήνυμα υπάρχει μία μέθοδος που περιγράφει πως το αντικείμενο απαντά/αντιδρά στο μήνυμα. Τα αντικείμενα (και μέθοδοι) και τα μηνύματα επιτρέπουν modular σχεδιασμό προγράμματος. Η υλοποίηση ενός αντικειμένου δεν βασίζεται στην εσωτερική δομή άλλων, παρά μόνο στον τρόπο απόκρισης στα μηνύματα. Έτσι η τετραγωνική ρίζα, σε μορφή OOP, θα γραφτεί ως x sqrt, όπου το αντικείμενο x θα εκτελέσει την πράξη sqrt στο ίδιο, δηλ. το x είναι o «δέκτης» του «μηνύματος» sqrt. 14
OOP Όταν εκτελείται ένα πρόγραμμα, τα αντικείμενα αλληλεπιδρούν με την αποστολή μηνυμάτων μεταξύ τους. Παράδειγμα: αν «πελάτης» και «λογαριασμός» είναι δύο αντικείμενα σε ένα πρόγραμμα, τότε το αντικείμενο πελάτης μπορεί να στείλει ένα μήνυμα στο αντικείμενο λογαριασμός που ζητάει το υπόλοιπο της τράπεζας. Κάθε αντικείμενο περιέχει δεδομένα και κώδικα για τον χειρισμό των δεδομένων. Τα αντικείμενα μπορούν να αλληλεπιδράσουν χωρίς να χρειάζεται να γνωρίζουν λεπτομέρειες σχετικά με τα δεδομένα ή τον κώδικα του άλλου. Αρκεί να γνωρίζουμε τον τύπο του αποδεκτού μηνύματος και τον τύπο απάντησης που επιστρέφουν τα αντικείμενα. 15
1.4 Κλάσεις και Αντικείμενα Τα βασικά δομικά στοιχεία σε μία γλώσσα OOP είναι η Κλάση (class) και το Αντικείμενο (object). Μια κλάση δρα ως πρότυπο για να δημιουργήσει τα αντικείμενα. Αυτό το πρότυπο περιγράφει την κατάσταση και τη συμπεριφορά για όλα τα αντικείμενα της κλάσης. Ένα αντικείμενο είναι μια μονάδα που αποτελείται από την περιγραφή κάποιων δεδομένων και την περιγραφή των αλγορίθμων που τα επεξεργάζονται. Ένα αντικειμενοστρεφές πρόγραμμα αποτελείται από διάφορα αντικείμενα που αλληλεπιδρούν μεταξύ τους. 16
Κλάσεις Η κλάση καθορίζει τα διαθέσιμα χαρακτηριστικά και η συμπεριφορά ενός συνόλου από παρόμοια αντικείμενα και ορίζεται από τον προγραμματιστή στο πρόγραμμα. Μια κλάση είναι μια αφηρημένη έννοια που γίνεται συγκεκριμένη κατά το χρόνο εκτέλεσης (run time), όταν τα αντικείμενα με βάση την κλάση ορίζονται και λαμβάνουν την συμπεριφορά της κλάσης. 17
Κλάσεις και Αντικείμενα-Παράδειγμα κλάση «όχημα» (car) Αντικείμενα κλάσσης Green Ford Mustang Gasoline Red Toyota Prius Electricity Blue VW Golf Diesel 18
Κλάσεις και Αντικείμενα-Παράδειγμα κλάση «όχημα» (vehicle) αντικείμενα ιδιότητες 19
Κλάσεις και Αντικείμενα-Παράδειγμα Ας εξετάσουμε την κλάση «όχημα» (vehicle). Η κλάση που αναπτύχθηκε από τον προγραμματιστή περιλαμβάνει μεθόδους όπως Steer(), Accelerate() και Brake(). Η κλάση περιλαμβάνει επίσης τις ιδιότητες όπως Color, NumberOfDoors, TopSpeed και NumberOfWheels. Η κλάση είναι μια αφηρημένη σχεδίαση που γίνεται πραγματικότητα όταν δημιουργούνται αντικείμενα, όπως Car, RacingCar, Tank, Tricycle, το καθένα με τη δική του εκδοχή των μεθόδων και των ιδιοτήτων της κλάσης. 20
Κλάσεις και Αντικείμενα-Παραδείγμα Η βασική κλάση 21
Κλάσεις και Αντικείμενα-Παραδείγματα Η βασική κλάση Η νέα κλάση 22
Κλάσεις και Αντικείμενα Τα αντικείμενα καταλαμβάνουν χώρο στη μνήμη. Τo κάθε αντικείμενο ορίζεται ως συγκεκριμένη περίπτωση (instance) μίας κλάσης. Όταν εκτελείται ένα πρόγραμμα, τα αντικείμενα αλληλεπιδρούν με την αποστολή μηνυμάτων μεταξύ τους. Κάθε αντικείμενο περιέχει δεδομένα και μεθόδους χειρισμού των δεδομένων. Τα αντικείμενα μπορούν να αλληλεπιδρούν χωρίς να γνωρίζουν λεπτομέρειες σχετικά με τα δεδομένα ή τις μεθόδους των υπολοίπων. 23
Κλάσεις και Αντικείμενα Στον επιστημονικό προγραμματισμό δεν είναι τόσο προφανής η αντιστοιχία εννοιών σε αντικείμενα. Συνηθως ο κώδικας μπορεί ακόμα να ομαδοποιηθεί σε λειτουργικές μονάδες. Για παράδειγμα, στην υπολογιστική μηχανική ένα πλέγμα (grid) θα μπορούσε να οριστεί ως ένα παράγωγο τύπου. Τα χαρακτηριστικά του θα μπορούσαν να περιλαμβάνουν τις τιμές x, y, z ενός συγκεκριμένου σημείου. Αν το πλέγμα έχει συμπεριφορές, όπως θα ήταν μία προσαρμοστική περίπτωση (adaptive mesh) τότε το πλέγμα θα πρέπει να αντιμετωπίζεται πλήρως ως αντικείμενο. 24
1.5 Βασικές Αρχές OOP Οι βασικές αρχές μίας γλώσσας OO είναι 4, ως ακολούθως: 1. encapsulation ή information hiding 2. data abstraction 3. inheritance και 4. polymorphism Θα δούμε παρακάτω αναλυτικότερα τις 4 ιδιότητες. 25
1.5 Βασικές Αρχές OOP 1. Encapsulation ή Information hiding Eνθυλάκωση ή απόκρυψη πληροφοριών, όπου η εφαρμογή των δεδομένων είναι κρυμμένη μέσα σε ένα αντικείμενο (object) και οι χρήστες των δεδομένων έχουν πρόσβαση σε μια αφηρημένη μόνο μορφή του. Μόνον οι μέθοδοι (functions) της κλάσσης (class) μπορούν να έχουν πρόσβαση και χειρισμό των δεδομένων. Παράδειγμα: η κλάση σχήμα μπορεί να έχει x και y θέση, και υπάρχουν μέθοδοι για να ληφθούν και να ορισθούν οι θέσεις x και y και να δημιουργηθεί και να μετακινηθεί το σχήμα. Υλοποιείται με χρήση τοπικών μεταβλητών (local variables), τύπου private. 26
1.5 Βασικές Αρχές OOP 2. Data abstraction Aφηρημένoς τύπος δεδομένων, όπου μπορούμε να δημιουργήσουμε πολλαπλές μεταβλητές αυτού του τύπου. Αυτό γίνεται με τον (αφηρημένο) τρόπο ορισμού του αντικειμένου. Η αφαίρεση αναφέρεται στην πράξη εκπροσώπησης βασικών χαρακτηριστικών χωρίς να συμπεριλαμβάνονται λεπτομέρειες ή εξηγήσεις. Οι κλάσεις χρησιμοποιούν την έννοια της αφαίρεσης και ορίζονται ως μια λίστα με αφηρημένα χαρακτηριστικά όπως μέγεθος, βάρος, κόστος και λειτουργίες που επενεργούν σε αυτά τα χαρακτηριστικά. Ενσωματώνουν όλες τις βασικές ιδιότητες των αντικειμένων που πρόκειται να δημιουργηθούν. 27
1.5 Βασικές Αρχές OOP 2. Data abstraction Aφηρημένoς τύπος δεδομένων 28
1.5 Βασικές Αρχές OOP 3. Inheritance Κληρονομικότητα, όπου ένας υπάρχων αφηρημένος τύπος δεδομένων μπορεί να επεκταθεί. Θα «κληρονομήσει» τα δεδομένα και τις μεθόδους από τον βασικό τύπο και θα προστεθούν επιπλέον δεδομένα και μέθοδοι. Ένα κλειδί στην κληρονομικότητα είναι ότι ο εκτεταμένος τύπος δεδομένων είναι συμβατός με τον βασικό τύπο. Οτιδήποτε λειτουργεί με αντικείμενα ή μεταβλητές του βασικού τύπου θα συνεργαστεί με τα αντικείμενα του εκτεταμένου τύπου. Για παράδειγμα ένας κύκλος θα έχει ακτίνα επιπλέον από την θέση x και y, ένα ορθογώνιο θα έχει πλάτος και ύψος. 29
1.5 Βασικές Αρχές OOP 3. Inheritance Κληρονομικότητα 30
1.5 Βασικές Αρχές OOP 3. Inheritance Κληρονομικότητα 31
1.5 Βασικές Αρχές OOP 3. Inheritance Κληρονομικότητα 32
1.5 Βασικές Αρχές OOP 3. Inheritance Κληρονομικότητα C#, Java, Ruby 33
1.5 Βασικές Αρχές OOP 3. Inheritance Κληρονομικότητα C++, Common Lisp, EuLisp, Curl, Dylan, Eiffel, Logtalk, Object REXX, Scala, OCaml, Perl, Perl 6, POP-11, Python, Tcl 34
1.5 Βασικές Αρχές OOP 4. Polymorphism Πολυμορφισμός, όπου οι μεταβλητές ή οι πράξεις μπορούν ως εκ τούτου να είναι πολυμορφικές, πχ Χρησιμοποιώντας το παράδειγμα σχήμα, μπορούμε να δημιουργήσουμε μια σειρά σχημάτων, όπου ένα σχήμα μπορεί να είναι ένας κύκλος και ένα άλλο σχήμα μπορεί να είναι ένα ορθογώνιο παραλληλόγραμμο, τρίγωνο, κλπ. Παράδειγμα: εξετάστε τη λειτουργία πρόσθεσης (addition). Για δύο αριθμούς, η λειτουργία θα δημιουργήσει ένα άθροισμα. Εάν οι τελεστές είναι συμβολοσειρές (strings), τότε η λειτουργία θα παράγει μια τρίτη συμβολοσειρά με concatenation. 35
1.5 Βασικές Αρχές OOP 4. Polymorphism - Πολυμορφισμός Η εικόνα απεικονίζει πως ένα μόνο όνομα function, DRAW(), μπορεί να χρησιμοποιηθεί για να χειριστεί διαφορετικό αριθμό και διαφορετικούς τύπους δεδομένων. Αυτό είναι κάτι παρόμοιο με μια συγκεκριμένη λέξη που έχει πολλές διαφορετικές έννοιες ανάλογα με το πλαίσιο. 36
1.6 Μονάδες προγράμματος (modules) Στις εφαρμογές OOP συνήθως γίνεται ευρεία χρήση των μονάδων προγράμματος (modules), οι οποίες καλούνται από το κυρίως πρόγραμμα. Τα modules επιτρέπουν την ενθυλάκωση των σχετικών μεταβλητών και διαδικασιών, παρέχουν μηχανισμό όπου ελέγχουν ποιές διαδικασίες έξω από τη μονάδα μπορούν να έχουν πρόσβαση σε ποιά δεδομένα και ενεργοποιούν την δημιουργία των αντικειμένων. Ένα module δεν μπορεί να λειτουργήσει μόνο του, θα πρέπει να περιλαμβάνεται σε πρόγραμμα, προκειμένου να έχει πρόσβαση στα στοιχεία που συνδέει. Θα πρέπει επίσης να γίνει compile πριν από το compile άλλου προγράμματος που το χρησιμοποιεί. 37
Μονάδες προγράμματος (modules) Δεν είναι απαραίτητο για ένα module να είναι στο δικό του αρχείο, αλλά αυτή είναι η συνήθης πρακτική, εκτός εάν η μονάδα είναι πολύ μικρή Ο compiler πρέπει να γνωρίζει την μονάδα πριν από οποιαδήποτε άλλο τμήμα του προγράμματος μπορεί να το χρησιμοποιήσει. Η χρήση στο κυρίως πρόγραμμα γίνεται μέσω της δήλωσης use: Πρόγραμμα circle_test.f95 program circle_test use class_circle implicit none... Πρόγραμμα class_circle.f95 module class_circle implicit none private real :: pii = 23.14!constant end module class_circle 38
1.7 Παραδείγματα Ο αναγνώστης μπορεί να βρεί ολοκληρωμένα προγράμματα στις εξής πηγές: Holcomb, K., SCIENTIFIC PROGRAMMING IN FORTRAN 2003, A tutorial Including Object- Oriented Programming [sec 11] Akin, E., Object Oriented Programming via Fortran 90/95 [pdf από web, sec. 3, 5, 6] - προτείνεται Α) Holcomb, K, U. Virginia Β) J. Akin, U. Rice 39
FTN-OOP Circle & Rectangle class, Akin (2003, p. 34): 40
FTN-OOP Circle class, Akin (2003, p. 34): 41