Copyright © 2005 Elsevier Κεφάλαιο 1 :: Εισαγωγή Πραγματολογία των Γλωσσών Προγραμματισμού Michael L. Scott
Copyright © 2005 Elsevier Εισαγωγή Γιατί υπάρχουν τόσο πολλές γλώσσες προγραμματισμού; –εξέλιξη — με το χρόνο μαθαίνουμε καλύτερους τρόπους να κάνουμε κάποια πράγματα –κοινωνικο-οικονομικοί παράγοντες: συμφέροντα εταιρειών, εμπορικό πλεονέκτημα –προσανατολισμός σε ειδικούς σκοπούς –προσανατολισμός σε ειδικό υλικό –διαφορετικές ιδέες για το τι είναι ευχάριστο στη χρήση
Copyright © 2005 Elsevier Εισαγωγή Τι κάνει μια γλώσσα επιτυχημένη; –ευκολία εκμάθησης (BASIC, Pascal, LOGO, Scheme) –ευκολία έκφρασης, εύχρηστη όταν τη μάθει κανείς, “δυνατή” (C, Common Lisp, APL, Algol-68, Perl) –ευκολία υλοποίησης (BASIC, Forth) –δυνατό να μεταγλωττίζεται σε πολύ καλό (γρήγορο/μικρό) κώδικα (Fortran) –υποστήριξη ενός ισχυρού χορηγού (COBOL, PL/1, Ada, Visual Basic) –ευρεία διάδοση με το μικρότερο κόστος (Pascal, Turing, Java)
Copyright © 2005 Elsevier Εισαγωγή Γιατί έχουμε γλώσσες προγραμματισμού; Σε τι χρησιμεύουν; –τρόπος σκέψης — τρόπος έκφρασης αλγορίθμων –γλώσσες από την οπτική του χρήστη –αφαίρεση της εικονικής μηχανής — ένας τρόπος να ορίζει κανείς τι θέλει –εκτέλεση στο υλικό χωρίς άμεση επαφή με τα bits –γλώσσες από την οπτική του κατασκευαστή υλοποιήσεων
Copyright © 2005 Elsevier Γιατί μελετούμε τις γλώσσες προγραμματισμού; Βοηθά στην επιλογή γλώσσας. –C, Modula-3 ή C++ για προγραμματισμό συστημάτων; –Fortran, APL ή Ada για αριθμητικούς υπολογισμούς; –Ada ή Modula-2 για ενσωματωμένα συστήματα; –Common Lisp, Scheme ή ML για χειρισμό συμβολικών δεδομένων; –Java ή C/CORBA για προγράμματα σε δίκτυα υπολογιστών;
Copyright © 2005 Elsevier Γιατί μελετούμε τις γλώσσες προγραμματισμού; Διευκολύνει την εκμάθηση νέων γλωσσών· κάποιες γλώσσες μοιάζουν μεταξύ τους και “κατάγονται” από άλλες. –οι αρχές μοιάζουν πιο πολύ · π.χ. αν σκέφτεστε με όρους επανάληψης, αναδρομής ή αφαίρεσης, θα είναι πιο εύκολο να μάθετε τη σύνταξη και τις σημασιολογικές λεπτομέρειες μιας νέας γλώσσας από το να τη μαθαίνατε από την αρχή. Σκεφτείτε μια αναλογία με τις ανθρώπινες γλώσσες: καλή γνώση της γραμματικής διευκολύνει την εκμάθηση νέων γλωσσών (τουλάχιστον Ινδο-ευρωπαϊκών).
Copyright © 2005 Elsevier Γιατί μελετούμε τις γλώσσες προγραμματισμού; Βοηθούν στην καλύτερη χρήση της εκάστοτε γλώσσας που χρησιμοποιείτε –κατανόηση δυσνόητων χαρακτηριστικών: Στη C βοηθά στην κατανόηση των ενώσεων, των πινάκων και των δεικτών, της ξεχωριστής μεταγλώττισης, του μεταβλητού πλήθους ορισμάτων, των εντολών catch και throw Στην Common Lisp βοηθά στην κατανόηση των συναρτήσεων/κλεισιμάτων πρώτης τάξης, των ρευμάτων, των εντολών catch και throw, και των λεπτομερειών υλοποίησης των συμβόλων
Copyright © 2005 Elsevier Γιατί μελετούμε τις γλώσσες προγραμματισμού; Βοηθούν στην καλύτερη χρήση της εκάστοτε γλώσσας που χρησιμοποιείτε (2) –κατανόηση κόστους υλοποίησης: επιλογή μεταξύ εναλλακτικών τρόπων για να γίνει κάτι, βασισμένη σε γνώση του τι συμβαίνει από κάτω: –χρήσης απλής ισοδύναμης αριθμητικής (x*x αντί x**2) –χρήση δεικτών της C ή εντολές “with” της Pascal για την ανακατασκευή υπολογισμών διευθύνσεων –αποφυγή της κλήσης κατ’ αξία μεγάλων δεδομένων στην Pascal –αποφυγή της κλήσης κατ’ όνομα στην Algol 60 –επιλογή μεταξύ υπολογισμού και αναζήτησης σε πίνακα (π.χ. για τον τελεστή πληθάριθμου στη C ή στη C++)
Copyright © 2005 Elsevier Γιατί μελετούμε τις γλώσσες προγραμματισμού; Βοηθούν στην καλύτερη χρήση της εκάστοτε γλώσσας που χρησιμοποιείτε (3) –πώς να κάνετε πράγματα σε γλώσσες που δεν τα υποστηρίζουν ρητά: έλλειψη κατάλληλων δομών ελέγχου στη Fortran χρήση σχολίων και προγραμματιστικής πειθαρχίας στις δομές ελέγχου έλλειψη αναδρομής στη Fortran, στη CSP, κλπ. κατασκευή αναδρομικού αλγορίθμου και στη συνέχεια μηχανική απαλοιφή της αναδρομής (ακόμα και για κάτι που δεν είναι αναδρομή ουράς)
Copyright © 2005 Elsevier Γιατί μελετούμε τις γλώσσες προγραμματισμού; Βοηθούν στην καλύτερη χρήση της εκάστοτε γλώσσας που χρησιμοποιείτε (4) –πώς να κάνετε πράγματα σε γλώσσες που δεν τα υποστηρίζουν ρητά: έλλειψη επώνυμων σταθερών και απαριθμήσεων στη Fortran χρήση μεταβλητών που παίρνουν αρχικές τιμές μια φορά και δεν αλλάζουν πάλι έλλειψη μονάδων κώδικα στη C και την Pascal, χρήση σχολίων και προγραμματιστικής πειθαρχίας έλλειψη επαναληπτών σχεδόν παντού, μίμησή τους με συναρτήσεις (ή μεθόδους;)
Copyright © 2005 Elsevier Προστακτικές γλώσσες Κατηγοριοποίηση γλωσσών –προστακτικές von Neumann(Fortran, Pascal, Basic, C) αντικειμενοστρεφείς(Smalltalk, Eiffel, C++?) γλώσσες σεναρίων(Perl, Python, JavaScript, PHP) –δηλωτικές συναρτησιακές(Scheme, ML, pure Lisp, FP) λογικές, γλώσσες περιορισμών(Prolog, VisiCalc, RPG)
Copyright © 2005 Elsevier Προστακτικές γλώσσες Οι προστακτικές γλώσσες, κυρίως οι von Neumann, κυριαρχούν –Κυρίως αυτές θα μας απασχολήσουν Σχεδιάζουμε όμως να ασχοληθούμε και με συναρτησιακές και λογικές γλώσσες
Copyright © 2005 Elsevier Μεταγλώττιση και Διερμηνεία Μεταγλώττιση και διερμηνεία –δεν είναι αντίθετες –δεν υπάρχει ξεκάθαρος διαχωρισμός Αμιγής Μεταγλώττιση –Ο μεταγλωττιστής μεταφράζει το αρχικό πρόγραμμα υψηλού επιπέδου σε ένα ισοδύναμο πρόγραμμα εξόδου (συνήθως σε γλώσσα μηχανής) και στη συνέχεια εξαφανίζεται:
Copyright © 2005 Elsevier Μεταγλώττιση και Διερμηνεία Αμιγής Διερμηνεία –Ο διερμηνέας μένει κατά την εκτέλεση του προγράμματος –Ο διερμηνέας είναι το σημείο ελέγχου κατά τη διάρκεια της εκτέλεσης
Copyright © 2005 Elsevier Μεταγλώττιση και Διερμηνεία Διερμηνεία: –Μεγαλύτερη ευελιξία –Καλύτερα διαγνωστικά (μηνύματα σφάλματος) Μεταγλώττιση: –Καλύτερη απόδοση
Copyright © 2005 Elsevier Μεταγλώττιση και Διερμηνεία Συνήθως πρόκειται για μεταγλώττιση ή απλή προεπεξεργασία, ακολουθούμενη από διερμηνεία Οι περισσότερες υλοποιήσεις γλωσσών περιλαμβάνουν ένα συνδυασμό μεταγλώττισης και διερμηνείας
Copyright © 2005 Elsevier Μεταγλώττιση και Διερμηνεία Η μεταγλώττιση ΔΕ χρειάζεται να παράγει γλώσσα μηχανής για κάποιο συγκεκριμένο τύπο υλικού Μεταγλώττιση είναι η μετάφραση από μια γλώσσα σε μια άλλη, με πλήρη ανάλυση της σημασίας της εισόδου Σε αντίθεση με την προεπεξεργασία, η μεταγλώττιση προϋποθέτει σημασιολογική κατανόηση αυτού που επεξεργάζεται Ο προεπεξεργαστής μπορεί συχνά να αφήσει λάθη να περάσουν. Ο μεταγλωττιστής κρύβει τα επόμενα βήματα · ο προεπεξεργαστής όχι
Copyright © 2005 Elsevier Μεταγλώττιση και Διερμηνεία Πολλές μεταγλωττιζόμενες γλώσσες έχουν διερμηνευόμενα τμήματα, π.χ. μορφοποίηση στη Fortran ή τη C Οι πιο πολλές γλώσσες χρησιμοποιούν “εικονικές εντολές” –πράξεις συνόλων στην Pascal –χειρισμοί συμβολοσειρών στη Basic Κάποιοι μεταγλωττιστές παράγουν μόνο εικονικές εντολές, π.χ., Pascal P-code, κώδικας byte της Java, Microsoft COM+
Copyright © 2005 Elsevier Μεταγλώττιση και Διερμηνεία Στρατηγικές υλοποίησης: –Προεπεξεργαστής Αφαιρεί τα σχόλια και λευκά διαστήματα Ομαδοποιεί τους χαρακτήρες σε λεκτικές μονάδες (λέξεις-κλειδιά, αναγνωριστικά, αριθμούς, σύμβολα) Αναπτύσσει συντμήσεις όπως ένας συμβολομεταφραστής μακροεντολών Προσδιορίζει συντακτικές δομές υψηλότερου επιπέδου (βρόχοι, υπορουτίνες)
Copyright © 2005 Elsevier Μεταγλώττιση και Διερμηνεία Στρατηγικές υλοποίησης: –Βιβλιοθήκη Ρουτινών και Σύνδεση Ο μεταγλωττιστής χρησιμοποιεί ένα ξεχωριστό πρόγραμμα, το συνδέτη, για να ενσωματώσει τις κατάλληλες υπορουτίνες βιβλιοθήκης (π.χ. μαθηματικές συναρτήσεις όπως οι sin, cos, log, κλπ.) στο τελικό πρόγραμμα:
Copyright © 2005 Elsevier Μεταγλώττιση και Διερμηνεία Στρατηγικές υλοποίησης: –Συμβολική γλώσσα μετά τη μεταγλώττιση Διευκολύνει την αποσφαλμάτωση (η συμβολική γλώσσα είναι πιο ευανάγνωστη από τους ανθρώπους) Απομονώνει το μεταγλωττιστή από αλλαγές στη μορφή των αρχείων γλώσσας μηχανής (χρειάζεται να αλλάξει μόνον ο συμβολομεταφραστής, ο οποίος είναι κοινός για πολλούς μεταγλωττιστές)
Copyright © 2005 Elsevier Μεταγλώττιση και Διερμηνεία Στρατηγικές υλοποίησης: –Ο προεπεξεργαστής της C (μεταγλώττιση υπό συνθήκη) Ο προεπεξεργαστής σβήνει τμήματα του κώδικα, επιτρέποντας τη δόμηση πολλών εκδόσεων ενός προγράμματος από τον ίδιο πηγαίο κώδικα
Copyright © 2005 Elsevier Μεταγλώττιση και Διερμηνεία Στρατηγικές υλοποίησης: –Μετάφραση από πηγή σε πηγή (C++) Οι υλοποιήσεις της C++ που βασίζονταν στις πρώτες εκδόσεις του μεταγλωττιστή της AT&T παρήγαγαν ενδιάμεσα προγράμματα σε C, αντί σε συμβολική γλώσσα:
Copyright © 2005 Elsevier Μεταγλώττιση και Διερμηνεία Στρατηγικές υλοποίησης: –Μετάφραση από πηγή σε πηγή (C++) Οι υλοποιήσεις της C++ που βασίζονταν στις πρώτες εκδόσεις του μεταγλωττιστή της AT&T παρήγαγαν ενδιάμεσα προγράμματα σε C, αντί σε συμβολική γλώσσα:
Copyright © 2005 Elsevier Μεταγλώττιση και Διερμηνεία Στρατηγικές υλοποίησης: –Εκκίνηση
Copyright © 2005 Elsevier Μεταγλώττιση και Διερμηνεία Στρατηγικές υλοποίησης: –Μεταγλώττιση Διερμηνευόμενων Γλωσσών Ο μεταγλωττιστής παράγει κώδικα που κάνει λογικές παραδοχές σχετικά με αποφάσεις που δε θα οριστικοποιηθούν μέχρι το χρόνο εκτέλεσης. Αν αυτές αποδειχθούν έγκυρες, ο κώδικας θα εκτελεστεί πολύ γρήγορα. Αν αποδειχθούν εσφαλμένες, ένας δυναμικός έλεγχος θα επιστρέψει τον έλεγχο στο διερμηνέα.
Copyright © 2005 Elsevier Μεταγλώττιση και Διερμηνεία Στρατηγικές υλοποίησης: –Δυναμική μεταγλώττιση και μεταγλώττιση τη στιγμή που χρειάζεται Κάποιες φορές το σύστημα προγραμματισμού μπορεί σκόπιμα να καθυστερήσει τη μεταγλώττιση ως την τελευταία δυνατή στιγμή. –Η Lisp και η Prolog καλούν το μεταγλωττιστή να μεταφράσει εκείνη τη στιγμή κώδικα που δημιουργήθηκε πρόσφατα σε γλώσσα μηχανής, ή να βελτιστοποιήσει τον κώδικα για συγκεκριμένα δεδομένα εισόδου. –Ο ορισμός της γλώσσας Java ορίζει μια ανεξάρτητη από τον υπολογιστή ενδιάμεση μορφή (κώδικα) που ονομάζεται κώδικας byte. Ο κώδικας byte είναι η πρότυπη μορφή για τη διανομή προγραμμάτων Java. –Ο κύριος μεταγλωττιστής C# παράγει ενδιάμεσο κώδικα σε κοινή ενδιάμεση γλώσσα.NET (Common Intermediate Language, CIL), ο οποίος στη συνέχεια μεταφράζεται σε γλώσσα μηχανής ακριβώς πριν από την εκτέλεση.
Copyright © 2005 Elsevier Μεταγλώττιση και Διερμηνεία Στρατηγικές υλοποίησης: –Μικροκώδικας Το σύνολο εντολών της συμβολικής γλώσσας δεν υλοποιείται σε υλικό αλλά εκτελείται σε ένα διερμηνέα. Ο διερμηνέας είναι γραμμένος σε εντολές χαμηλού επιπέδου (μικροκώδικας ή υλικολογισμικό), είναι αποθηκευμένος σε μνήμη μόνο για ανάγνωση και εκτελείται από το υλικό.
Copyright © 2005 Elsevier Μεταγλώττιση και Διερμηνεία Υπάρχουν μεταγλωττιστές για κάποιες διερμηνευόμενες γλώσσες αλλά δεν είναι αμιγείς: –επιλεκτική μεταγλώττιση τμημάτων κώδικα που μπορούν να μεταγλωττιστούν και εξελιγμένη προεπεξεργασία του υπόλοιπου πηγαίου κώδικα –η διερμηνεία τουλάχιστον κάποιων τμημάτων του κώδικα είναι ακόμα απαραίτητη για τους λόγους που προαναφέρθηκαν Ασυνήθιστοι μεταγλωττιστές –μορφοποιητές κειμένου –μεταγλωττιστές ολοκληρωμένων κυκλωμάτων –επεξεργαστές γλωσσών ερωτημάτων
Copyright © 2005 Elsevier Προγραμματιστικά περιβάλλοντα Εργαλεία
Copyright © 2005 Elsevier Γενικά για τη μεταγλώττιση Φάσεις της μεταγλώττισης
Copyright © 2005 Elsevier Γενικά για τη μεταγλώττιση Σάρωση: –χωρίζει το πρόγραμμα σε “λεκτικές μονάδες”, που αποτελούν τις μικρότερες μονάδες του προγράμματος με αυτοτελή σημασία· εξοικονομεί χρόνο γιατί η επεξεργασία της εισόδου χαρακτήρα προς χαρακτήρα είναι αργή –μπορούμε να ρυθμίσουμε το λεκτικό αναλυτή αν η δουλειά του είναι απλή · επίσης μας γλιτώνει από αρκετή πολυπλοκότητα σε μεταγενέστερα στάδια –μπορεί να σχεδιαστεί συντακτικός αναλυτής που να δέχεται χαρακτήρες αντί για λεκτικές μονάδες σαν είσοδο αλλά θα είναι άσχημος –η σάρωση είναι αναγνώριση μιας κανονικής γλώσσας, π.χ., μέσω DFA
Copyright © 2005 Elsevier Γενικά για τη μεταγλώττιση Συντακτική ανάλυση είναι η αναγνώριση μιας γλώσσας χωρίς συμφραζόμενα, π.χ. μέσω PDA –Η συντακτική ανάλυση ανακαλύπτει τη δομή “χωρίς συμφραζόμενα” του προγράμματος –Στην πράξη, βρίσκει τη δομή που μπορείτε να περιγράψετε με συντακτικά διαγράμματα (“κυκλοι και βέλη” σε ένα εγχειρίδιο της Pascal)
Copyright © 2005 Elsevier Γενικά για τη μεταγλώττιση Σημασιολογική ανάλυση είναι η ανακάλυψη της σημασίας του προγράμματος –Ο μεταγλωττιστής στην πραγματικότητα κάνει τη λεγόμενη ΣΤΑΤΙΚΗ σημασιολογική ανάλυση. Αυτή είναι η σημασία που μπορεί να προσδιοριστεί στο χρόνο μεταγλώττισης –Κάποια πράγματα (π.χ. αναφορές σε στοιχείο πίνακα εκτός των ορίων του πίνακα) δε μπορούν να προσδιοριστούν μέχρι το χρόνο εκτέλεσης. Αποτελούν τμήμα της ΔΥΝΑΜΙΚΗΣ σημασιολογίας του προγράμματος
Copyright © 2005 Elsevier Γενικά για τη μεταγλώττιση H ενδιάμεση μορφή (intermediate form, IF) δημιουργείται μετά τη σημασιολογική ανάλυση (αν το πρόγραμμα περάσει όλους τους ελέγχους) –Συνήθως επιλέγεται για ανεξαρτησία από τη μηχανή, ευκολία βελτιστοποίησης ή μικρό μέγεθος (αντικρουόμενοι στόχοι) –Συνήθως μοιάζουν με κώδικα μηχανής για κάποια ιδεατή μηχανή, π.χ. μια μηχανή στοίβας ή μια μηχανή με άπειρους καταχωρητές –Πολλοί μεταγλωττιστές περνούν τον κώδικα μέσα από παραπάνω από μια ενδιάμεσες μορφές
Copyright © 2005 Elsevier Γενικά για τη μεταγλώττιση Η βελτιστοποίηση δέχεται ένα πρόγραμμα σε ενδιάμεσο κώδικα και παράγει ένα ισοδύναμο που να είναι πιο γρήγορο ή να καταλαμβάνει λιγότερο χώρο –Ο όρος δεν είναι σωστός: απλά βελτιώνουμε κώδικα –Η φάση της βελτιστοποίησης είναι προαιρετική Η φάση της παραγωγής κώδικας παράγει συμβολική γλώσσα ή (κάποιες φορές) επανατοποθετήσιμη γλώσσα μηχανής
Copyright © 2005 Elsevier Γενικά για τη μεταγλώττιση Κάποιες βελτιώσεις για τη συγκεκριμένη μηχανή (χρήση ειδικών εντολών ή τρόπων διευθυνσιοδότησης, κλπ.) μπορεί να εφαρμοστούν κατά τη διάρκεια ή μετά την παραγωγή του τελικού κώδικα Πίνακας συμβόλων: όλες οι φάσεις εξαρτώνται από έναν πίνακα για τον εντοπισμό των αναγνωριστικών του προγράμματος που περιγράφει τι γνωρίζει ο μεταγλωττιστής για αυτά –Ο πίνακας συμβόλων μπορεί να διατηρείται (σε κάποια μορφή) για χρήση από αποσφαλματωτές, ακόμα και μετά το τέλος της μεταγλώττισης
Copyright © 2005 Elsevier Γενικά για τη μεταγλώττιση Λεκτική και Συντακτική Ανάλυση –Πρόγραμμα ΜΚΔ (Pascal)
Copyright © 2005 Elsevier Γενικά για τη μεταγλώττιση Λεκτική και Συντακτική Ανάλυση –GCD Program Tokens Η λεκτική και η συντακτική ανάλυση αναγνωρίζουν τη δομή του προγράμματος, ομαδοποιούν χαρακτήρες σε λεκτικές μονάδες που είναι οι μικρότερες μονάδες του προγράμματος με αυτοτελή σημασία
Copyright © 2005 Elsevier Γενικά για τη μεταγλώττιση Λεκτική και Συντακτική Ανάλυση –Γραμματική χωρίς συμφραζόμενα και Συντακτική Ανάλυση Η συντακτική ανάλυση οργανώνει τις λεκτικές μονάδες σε ένα δένδρο συντακτικής ανάλυσης που αναπαριστά τις δομές υψηλού επιπέδου σε σχέση με τα συστατικά από τα οποία αποτελούνται Οι τρόποι με τους οποίους συνδυάζονται αυτά τα συστατικά ορίζονται από ένα σύνολο δυνητικά αναδρομικών κανόνων που είναι γνωστοί ως γραμματική χωρίς συμφραζόμενα
Copyright © 2005 Elsevier Γενικά για τη μεταγλώττιση Γραμματική χωρίς συμφραζόμενα και Συντακτική Ανάλυση –Παράδειγμα (πρόγραμμα Pascal)
Copyright © 2005 Elsevier Γενικά για τη μεταγλώττιση Γραμματική χωρίς συμφραζόμενα και Συντακτική Ανάλυση –Δένδρο συντακτικής ανάλυσης προγράμματος ΜΚΔ Επόμενη διαφάνεια
Copyright © 2005 Elsevier Γενικά για τη μεταγλώττιση Γραμματική χωρίς συμφραζόμενα και Συντακτική Ανάλυση –Δένδρο συντακτικής ανάλυσης προγράμματος ΜΚΔ (συνέχεια)
Copyright © 2005 Elsevier Γενικά για τη μεταγλώττιση Συντακτικό Δένδρο –Δένδρο συντακτικής ανάλυσης προγράμματος ΜΚΔ