FORTRAN & Αντικειμενοστραφής Προγραμματισμός ΣΝΜΜ 2016 M8 Αντικειμενοστραφής Προγραμματισμός Δρ. Γεώργιος Παπαλάμπρου Επικ. Καθηγητής ΕΜΠ Εργαστήριο Ναυτικής Μηχανολογίας george.papalambrou@lme.ntua.gr ΕΜΠ/ΣΝΜΜ Εργαστήριο Ναυτικής Μηχανολογίας
Εισαγωγή Το αντικείμενο OOP είναι ευρύ και ειδικευμένο. Παρουσιάζονται εδώ οι βασικές αρχές με περιγραφικό τρόπο. Ο αναγνώστης μπορεί να βρεί περισσότερα στοιχεία στις εξής πηγές: - βιβλίο Metcalf et al., κεφ. 14. - https://wiki.uiowa.edu/download/attachments/109785161/fortran-novella-holcomb.pdf - https://www.clear.rice.edu/mech517/books/oop3.pdf Γενικά links FORTRAN Wiki: - http://fortranwiki.org/fortran/show/tutorials
1.1 Γλώσσες προγραμματισμού Κατηγοριοποιώντας τις γλώσσες προγραμματισμού με βάση τον τρόπο οργάνωσης του προγράμματος έχουμε: Διαδικαστικές γλώσσες (procedural) όπου το πρόγραμμα είναι οργανωμένο σε διαδικασίες, που αποτελούνται από σειρές εντολών που περιγράφουν αλγορίθμους, πχ Fortran, Pascal, C. Αντικειμενοστραφείς γλώσσες (object-oriented) όπου το πρόγραμμα είναι οργανωμένο σε αντικείμενα (objects), πχ Java, C++. J. Akin, Rice U.
1. 2 Εξέλιξη Ο Αντικειμενοστραφής προγραμματισμός δεν είναι νέα τεχνική προγραμματισμού. Μία από τις πρώτες γλώσσες που μπορούσε να προσφέρει τέτοια υποστήριξη ήταν η Simula 67, μια γλώσσα σχεδιασμένη για προσομοίωση διακριτών συμβάντων (discrete events), στο Νορβηγικό Υπολογιστικό Κέντρο στο Όσλο το 1960. Μία από τις επόμενες σημαντικές εξελίξεις ήταν το 1970 στο Xerox Palo Alto, ΗΠΑ, όπου ερευνήθηκαν τρόποι όπου διαφορετικοί άνθρωποι θα μπορούσαν να χρησιμοποιήσουν αποτελεσματικά υπολογιστική ισχύ. Ένα από τα αποτελέσματα της εργασίας ήταν το περιβάλλον Smalltalk 80, όπου τα αντικείμενα (objects) αποτελούν τον πυρήνα.
1. 2 Εξέλιξη Κατά τις δεκαετίες του 1980 και του 1990, δημιουργήθηκε μία σειρά από αντικειμενοστραφείς γλώσσες προγραμματισμού. Αυτές περιλαμβάνουν: - Eiffel, Bertrand Meyer, Eiffel Software - C ++ από C με classes, Bjarne Stroustrup στα Bell Labs - Oberon 2, Niklaus Wirth στο ETH στη Ζυρίχη(*) - Java, James Gosling, αρχικά Sun, τώρα Oracle - C #, που είναι μια πρόσφατη προσθήκη της Microsoft (*) Δείτε σχετικό υλικό για το σημαντικό έργο του Καθ. N. Wirth/ETHZ στο Internet.
1.3 Αντικειμενοστραφής Προγραμματισμός OOP Οι γλώσσες FORTRAN, Pascal υποστηρίζουν το πρότυπο dataprocedure, όπου ενεργές διαδικασίες επιδρούν σε παθητικά δεδομένα. Έτσι η function sqrt(x) λαμβάνει τον αριθμό x και επιστέφει την τετραγωνική του ρίζα. Οι γλώσσες OOP υλοποιούν προσέγγιση με κέντρο το αντικείμενο (object). Αντί τα δεδομένα να περνούν σε διαδικασίες, τα αντικείμενα (δεδομένα) εκτελούν λειτουργίες πάνω τους. Έτσι ένα αντικείμενο αποτελείται όχι μόνο από δεδομένα (που τα αποθηκεύει στην «ιδωτική» του μνήμη) αλλά έχει και την ικανότητα να αλλάξει την πληροφορία και ανα εκτελέσει διάφορες εργασίες (tasks). Οι εργασίες (tasks) ονομάζονται μέθοδοι (methods) του αντικειμένου. Οι μέθοδοι ενεργούν μέσω μηνύματος (message) στο αντικείμενο.
OOP Το αντικείμενο που λαμβάνει το μήνυμα λέγεται δέκτης (receiver). Το κάθε αντικείμενο γνωρίζει τα μηνύματα που καταλαβαίνει και για κάθε μήνυμα υπάρχει μία μέθοδος που περιγράφει πως το αντικείμενο απαντά/αντιδρά στο μήνυμα. Τα αντικείμενα (και μέθοδοι) και τα μηνύματα επιτρέπουν modular σχεδιασμό προγράμματος. Η υλοποίηση ενός αντικειμένου δεν βασ ιζεται στην εσωτερική δομή άλλων, παρά μόνο στον τρόπο απόκρισης στα μηνύματα. Έτσι για την τετραγωγνική ρίζα, σε μορφή OOP θα γραφτεί ως x sqrt, όπου το αντικείμενο x θα εκτελέσει την πράξη sqrt στο ίδιο, δηλ. το x είναι o «δέκτης» του «μηνύματος» sqrt.
Κλάσεις και Αντικείμενα Τα βασικά δομικά στοιχεία σε μία γλώσσα OOP είναι η Κλάση (class) και το Αντικείμενο (object). Μια κλάση δρα ως πρότυπο για να δημιουργήσει τα αντικείμενα. Αυτό το πρότυπο περιγράφει την κατάσταση και τη συμπεριφορά για όλα τα αντικείμενα της κλάσης. Ένα αντικείμενο είναι μια μονάδα που αποτελείται από την περιγραφή κάποιων δεδομένων και την περιγραφή των αλγορίθμων που τα επεξεργάζονται. Ένα αντικειμενοστρεφές πρόγραμμα αποτελείται από διάφορα αντικείμενα που αλληλεπιδρούν μεταξύ τους,
Κλάσεις και Αντικείμενα Η κλάση καθορίζει τα διαθέσιμα χαρακτηριστικά και η συμπεριφορά ενός συνόλου από παρόμοια αντικείμενα και ορίζεται από τον προγραμματιστή στο προόγραμμα. Μια κλάση είναι μια αφηρημένη έννοια που γίνεται συγκεκριμένη κατά το χρόνο εκτέλεσης (run time), όταν τα αντικείμενα με βάση την κλάση ορίζονται και λαμβάνουν την συμπεριφορά της κλάσης.
Κλάσεις και Αντικείμενα-Παράδειγμα κλάση «όχημα» (vehicle) αντικείμενα ιδιότητες
Κλάσεις και Αντικείμενα-Παράδειγμα Ας εξετάσουμε την κλάση «όχημα» (vehicle). Η κλάση που αναπτύχθηκε από τον προγραμματιστή περιλαμβάνει μεθόδους όπως Steer(), Accelerate() και Brake(). Η κλάση περιλαμβάνει επίσης τις ιδιότητες όπως Color, NumberOfDoors, TopSpeed και NumberOfWheels. Η κλάση είναι μια αφηρημένη σχεδίαση που γίνεται πραγματικότητα όταν δημιουργούνται αντικείμενα, όπως Car, RacingCar, Tank, Tricycle, το καθένα με τη δική του εκδοχή των μεθόδων και των ιδιοτήτων της κλάσης.
Κλάσεις και Αντικείμενα-Παραδείγματα Η βασική κλάση Η νέα κλάση
Κλάσεις και Αντικείμενα Τα αντικείμενα καταλαμβάνουν χώρο στη μνήμη. Τo κάθε αντικείμενο ορίζεται ως συγκεκριμένη περίπτωση (instance) μίας κλάσης. Όταν εκτελείται ένα πρόγραμμα, τα αντικείμενα αλληλεπιδρούν με την αποστολή μηνυμάτων μεταξύ τους. Κάθε αντικείμενο περιέχει δεδομένα και μεθόδους χειρισμού των δεδομένων. Τα αντικείμενα μπορούν να αλληλεπιδρούν χωρίς να γνωρίζουν λεπτομέρειες σχετικά με τα δεδομένα ή τις μεθόδους των υπολοίπων.
Στον επιστημονικό προγραμματισμό δεν είναι τόσο προφανής η αντιστοιχία εννοιών σε αντικείμενα. Συνηθως ο κώδικας μπορεί ακόμα να ομαδοποιηθεί σε λειτουργικές μονάδες. Για παράδειγμα, στην υπολογιστική μηχανική ένα πλέγμα (grid) θα μπορούσε να οριστεί ως ένα παράγωγο τύπου. Τα χαρακτηριστικά του θα μπορούσαν να περιλαμβάνουν τις τιμές x, y, z ενός συγκεκριμένου σημείου. Αν το πλέγμα έχει συμπεριφορές, όπως θα ήταν μία προσαρμοστική περίπτωση (adaptive mesh) τότε το πλέγμα θα πρέπει να αντιμετωπίζεται πλήρως ως αντικείμενο.
1.4 Μονάδες προγράμματος (modules) Στις εφαρμογές OOP συνήθως γίνεται ευρεία χρήση των μονάδων προγράμματος (modules), οι οποίες καλούνται από το κυρίως πρόγραμμα. Τα modules επιτρέπουν την ενθυλάκωση των σχετικών μεταβλητών και διαδικασιών, παρέχουν μηχανισμό όπου ελέγχουν ποιές διαδικασίες έξω από τη μονάδα μπορούν να έχουν πρόσβαση σε ποιά δεδομένα και ενεργοποιούν την δημιουργία των αντικειμένων. Ένα module δεν μπορεί να λειτουργήσει μόνο του, θα πρέπει να περιλαμβάνεται σε πρόγραμμα, προκειμένου να έχει πρόσβαση στα στοιχεία που συνδέει. Θα πρέπει επίσης να γίνει compile πριν από το compile άλλου προγράμματος που το χρησιμοποιεί.
Μονάδες προγράμματος (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
1.5 Βασικές Αρχές OOP Οι βασικές αρχές μίας γλώσσας OO είναι 4, ως ακολούθως: - encapsulation ή information hiding - data abstraction - inheritance και - polymorphism Θα δούμε αναλυτικότερα τις παραπάνω ιδιότητες.
1.5 Βασικές Αρχές OOP 1. Εncapsulation ή information hiding Eνθυλάκωση ή απόκρυψη πληροφοριών, όπου η εφαρμογή των δεδομένων είναι κρυμμένη μέσα σε ένα αντικείμενο (object) και οι χρήστες των δεδομένων έχουν πρόσβαση σε μια αφηρημένη μόνο μορφή του. Οι μέθοδοι χρησιμοποιούνται για την πρόσβαση και τον χειρισμό των δεδομένων. Για παράδειγμα, μια κλάση (class) σχήμα μπορεί να έχει x και y θέση, και υπάρχουν μέθοδοι για να ληφθούν και να ορισθούν οι θέσεις x και y και δημιουργηθεί και να μετακινηθεί το σχήμα. Υλοποιείται με χρήση τοπικών μεταβλητών (local variables), τύπου private.
1.5 Βασικές Αρχές OOP 2. Data abstraction Aφηρημένoς τύπος δεδομένων, όπου μπορούμε να δημιουργήσουμε πολλαπλές μεταβλητές αυτού του τύπου. Αυτό γίνεται με το (αφηρημένο) τρόπο ορισμού του αντικειμένου.
1.5 Βασικές Αρχές OOP 3. Inheritance Κληρονομικότητα, όπου ένας υπάρχων αφηρημένος τύπος δεδομένων μπορεί να επεκταθεί. Θα «κληρονομήσει» τα δεδομένα και τις μεθόδους από τον βασικό τύπο και θα προστεθούν επιπλέον δεδομένα και μέθοδοι. Ένα κλειδί στην κληρονομικότητα είναι ότι ο εκτεταμένος τύπος δεδομένων είναι συμβατός με τον βασικό τύπο. Οτιδήποτε λειτουργεί με αντικείμενα ή μεταβλητές του βασικού τύπου θα συνεργαστεί με τα αντικείμενα του εκτεταμένου τύπου. Για παράδειγμα ένας κύκλος θα έχει ακτίνα επιπλέον από την θέση x και y, ένα ορθογώνιο θα έχει πλάτος και ύψος.
1.5 Βασικές Αρχές OOP 4. Polymorphism Πολυμορφισμός, όπου οι μεταβλητές μπορούν ως εκ τούτου να είναι πολυμορφικές. Χρησιμοποιώντας το παράδειγμα σχήμα, μπορούμε να δημιουργήσουμε μια σειρά σχημάτων, όπου ένα σχήμα μπορεί να είναι ένας κύκλος και ένα άλλο σχήμα μπορεί να είναι ένα ορθογώνιο παραλληλόγραμμο.
Παραδείγματα -1/ Ο αναγνώστης μπορεί να βρεί ολοκληρωμένα προγρράμματα στις εξής πηγές: Α) wiki.uiowa.edu/download/attachments/109785161/fortran-novella- Holcomb.pdf Β) https://www.clear.rice.edu/mech517/books/oop3.pdf Α) U. Virginia Β) U. Rice [J. Akin]
Παραδείγματα-2/