ΣΥΓΧΡΟΝΕΣ ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ



Σχετικά έγγραφα
Πρόλογος στην ελληνική έκδοση

Γλώσσες προγραμματισμού

ΑΕΠΠ Ερωτήσεις θεωρίας

10. Με πόσους και ποιους τρόπους μπορεί να αναπαρασταθεί ένα πρόβλημα; 11. Περιγράψτε τα τρία στάδια αντιμετώπισης ενός προβλήματος.

Ε Ι Α Γ Ω Γ Η Σ Ο Ν Π Ρ Ο Γ Ρ Α Μ Μ Α Σ Ι Μ Ο Κ Ε Υ Α Λ Α Ι Ο 6. Σο πρόγραμμα γράφεται σε κάποια γλώσσα προγραμματισμού.

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΜΑΡΙΑ Σ. ΖΙΩΓΑ ΚΑΘΗΓΗΤΡΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

ΕΞΕΤΑΣΤΕΑ ΥΛΗ (SYLLABUS) ADVANCED αντικειμενοστραφής προγραμματισμός ΕΚΔΟΣΗ 1.0. Σόλωνος 108,Τηλ Φαξ

Πληροφορική 2. Γλώσσες Προγραμματισμού

Επιµέλεια Θοδωρής Πιερράτος

Μεταγλωττιστές. Γιώργος Δημητρίου. Μάθημα 8 ο. Πανεπιστήμιο Θεσσαλίας - Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών

Μαλούτα Θεανώ Σελίδα 1

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ

Προβλήματα, αλγόριθμοι, ψευδοκώδικας

Κεφάλαιο 3 Η Σημασιολογία των Γλωσσών Προγραμματισμού

Κεφάλαιο 6 Υλοποίηση Γλωσσών Προγραμματισμού

ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΑΡΧΕΣ ΤΗΣ ΕΠΙΣΤΗΜΗΣ ΤΩΝ Η/Υ

Γλώσσες υψηλού επιπέδου Περιέχουν περισσότερες εντολές για την εκτέλεση πολύπλοκων εργασιών Τα προγράµµατα µεταφράζονται σε γλώσσα µηχανής είτε από το

Κεφ. 2 Θέματα Θεωρητικής Επιστήμης Υπολογιστών. Κοντογιάννης Βασίλειος ΠΕ19

ΠΕΡΙΓΡΑΜΜΑ ΜΑΘΗΜΑΤΟΣ

ΚΕΦΑΛΑΙΟ 6 ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ. Η επίλυση ενός προβλήματος με τον υπολογιστή περιλαμβάνει τρία εξίσου σημαντικά στάδια.

Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον κεφ.6 Εισαγωγή στον Προγραμματισμό

<<ΔΗΜΗΤΡΗΣ ΜΑΝΩΛΗΣ ΦΥΣΙΚΟΣ ΜCs>> 1

FORTRAN και Αντικειμενοστραφής Προγραμματισμός

Κεφάλαιο 2.3: Προγραμματισμός. Επιστήμη ΗΥ Κεφ. 2.3 Καραμαούνας Πολύκαρπος

ΕΙΔΗ,ΤΕΧΝΙΚΕΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΑ ΠΡΟΓΡΑΜΜΑΤΙ- ΣΜΟΥ

Αλγοριθμική & Δομές Δεδομένων- Γλώσσα Προγραμματισμού Ι (PASCAL)

xvi Προσέγγιση δομεσ δεδομενων και αλγοριθμοι

Περιεχόμενα. Περιεχόμενα

ΛΟΓΙΣΜΟΣ ΜΙΑΣ ΜΕΤΑΒΛΗΤΗΣ, ΕΣΠΙ 1

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ Π ΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ Π ΕΡΙΒΑΛΛΟΝ

Σου προτείνω να τυπώσεις τις επόμενες τέσσερις σελίδες σε ένα φύλο διπλής όψης και να τις έχεις μαζί σου για εύκολη αναφορά.

Περιεχόμενα Πρόλογος 1. Εισαγωγή 2. Τα Βασικά Μέρη ενός Προγράμματος Prolog

ΕΡΩΤΗΣΕΙΣ ΑΞΙΟΛΟΓΗΣΗΣ

ΚΕΦΑΛΑΙΟ 6 ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ. 03/01/09 Χαράλαμπος Τζόκας 1

Προγραμματισμός Η/Υ. Προτεινόμενα θέματα εξετάσεων Εργαστήριο. Μέρος 1 ό. ΤΕΙ Λάρισας- Σχολή Τεχνολογικών Εφαρμογών Τμήμα Πολιτικών Έργων Υποδομής

4. Συντακτικό μιας γλώσσας είναι το σύνολο των κανόνων που ορίζει τις μορφές με τις οποίες μια λέξη είναι αποδεκτή.

ΟΜΑΔΑ Ε ΓΕΩΡΓΙΟΥ ΦΩΤΕΙΝΗ ΗΛΙΟΥΔΗ ΑΦΡΟΔΙΤΗ ΜΕΤΑΛΛΙΔΟΥ ΧΡΥΣΗ ΝΙΖΑΜΗΣ ΑΛΕΞΑΝΔΡΟΣ ΤΖΗΚΑΛΑΓΙΑΣ ΑΝΔΡΕΑΣ ΤΡΙΓΚΑΣ ΑΓΓΕΛΟΣ

ΔΙΔΑΚΤΙΚΗ της ΠΛΗΡΟΦΟΡΙΚΗΣ

Α. Ερωτήσεις Ανάπτυξης

ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ ΑΛΓΟΡΙΘΜΟΥΣ ΚΑΙ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Αναδρομή Ανάλυση Αλγορίθμων

Διδακτική της Πληροφορικής ΙΙ

Περιεχόμενα. Δομές δεδομένων. Τεχνικές σχεδίασης αλγορίθμων. Εισαγωγή στον προγραμματισμό. Υποπρογράμματα. Επαναληπτικά κριτήρια αξιολόγησης

Η γλώσσα προγραμματισμού Strange

- Επιστημονικός Υπεύθυνος Ενεργείας: Θεόδωρος Γ. Εξαρχάκος Καθηγητής του Πανεπιστημίου Αθηνών Πρόεδρος του Παιδαγωγικού Ινστιτούτου «Αναμόρφωση / εκ

ΚΕΦΑΛΑΙΟ 6 - ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

3 Αλληλεπίδραση Αντικειμένων

Κεφάλαιο 4 Σημασιολογία μιας Απλής Προστακτικής Γλώσσας

ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΔΙΟΙΚΗΣΗ ΕΠΙΧΕΙΡΗΣΕΩΝ ΕΠΙΠΕΔΟ ΣΠΟΥΔΩΝ Προπτυχιακό ΚΩΔΙΚΟΣ ΜΑΘΗΜΑΤΟΣ GD2520

5 ΕΙΣΑΓΩΓΗ ΣΤΗ ΘΕΩΡΙΑ ΑΛΓΟΡΙΘΜΩΝ

ΑΕΠΠ Ερωτήσεις τύπου Σωστό-Λάθος

Η ΑΕΠΠ IN A GLANCE! ΦΡΟΝΤΙΣΤΗΡΙΑ ΠΟΛΥΜΕΝΗ

Περιεχόμενα 1 Πρωτοβάθμια Λογική Χρήστος Νομικός ( Τμήμα Μηχανικών Η/Υ Διακριτά και Πληροφορικής Μαθηματικά Πανεπιστήμιο ΙΙ Ιωαννίνων ) / 60

Διάλεξη 2η: Αλγόριθμοι και Προγράμματα

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ

Τεχνολογία Λογισµικού Ι Κεφάλαιο 5

Outline. 4 Object-Oriented Programming

Περίγραμμα. Διαδικαστικά. Εργαστήρια Τεχνικών Προγραμματισμού 21/2/2017. ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ και Τεχνικές Προγραμματισμού

ΚΕΦΑΛΑΙΟ 5. Κύκλος Ζωής Εφαρμογών ΕΝΟΤΗΤΑ 2. Εφαρμογές Πληροφορικής. Διδακτικές ενότητες 5.1 Πρόβλημα και υπολογιστής 5.2 Ανάπτυξη εφαρμογών

τις αναδρομικές ακολουθίες (recursive sequences) στις οποίες ορίζαμε

Σχόλια και υποδείξεις για το Σχέδιο Μαθήματος

ΠΕΡΙΕΧΟΜΕΝΑ. Πρόλογος στη δεύτερη έκδοση

ΜΕΡΙΚΑ ΣΤΟΙΧΕΙΑ ΓΙΑ ΤΙΣ ΓΛΩΣΣEΣ ΠPOΓPAMMATIΣMOY

Κεφάλαιο 10 ο Υποπρογράµµατα

Δομές Δεδομένων. Ενότητα 1 - Εισαγωγή. Χρήστος Γκουμόπουλος. Πανεπιστήμιο Αιγαίου Τμήμα Μηχανικών Πληροφοριακών και Επικοινωνιακών Συστημάτων

ΒΙΒΛΙΑ ΒΙΒΛΙΑ

Προγραμματισμός Η/Υ. Συναρτήσεις & Υποπρογράμματα. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

ΠΕΡΙΕΧΟΜΕΝΑ. Εντολές επιλογής Εντολές επανάληψης

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ. Στέφανος Ουγιάρογλου

Υπολογιστικά & Διακριτά Μαθηματικά

Ανάπτυξη και Σχεδίαση Λογισμικού

ΕΠΛ 003: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ και Τεχνικές Προγραμματισμού

Ψευδοκώδικας. November 7, 2011

ΚΕΦΑΛΑΙΟ 10 ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

Ποσοτικές Μέθοδοι στη Διοίκηση Επιχειρήσεων ΙΙ Σύνολο- Περιεχόμενο Μαθήματος

Σχολικό Βιβλίο - Κεφάλαιο 7 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕ PASCAL ΠΑΡΟΥΣΙΑΣΗ 13

Δομημένος Προγραμματισμός

2 ΟΥ και 7 ΟΥ ΚΕΦΑΛΑΙΟΥ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ

Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον

1. Η σκοπιμότητα της ένταξης εργαλείων ψηφιακής τεχνολογίας στη Μαθηματική Εκπαίδευση

Κεφάλαιο 7 : Είδη, Τεχνικές, και Περιβάλλοντα Προγραµµατισµού

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ ΠΡΟΓΡΑΜΜΑ ΠΑΙΔΑΓΩΓΙΚΗΣ ΚΑΤΑΡΤΙΣΗΣ 2 η ΕΡΓΑΣΙΑ ΠΡΑΚΤΙΚΗΣ ΑΣΚΗΣΗΣ ΠΑΡΑΤΗΡΗΣΕΙΣ ΣΧΕΔΙΟ ΜΑΘΗΜΑΤΟΣ

Εισαγωγή στον Προγραμματισμό

Γράφοντας ένα σχολικό βιβλίο για τα Μαθηματικά. Μαριάννα Τζεκάκη Αν. Καθηγήτρια Α.Π.Θ. Μ. Καλδρυμίδου Αν. Καθηγήτρια Πανεπιστημίου Ιωαννίνων

Ανάπτυξη Εφαρµογών σε Προγραµµατιστικό Περιβάλλον

ΑΝΑΛΥΤΙΚΟ ΠΡΟΓΡΑΜΜΑ ΕΞΕΤΑΣΗΣ

Α Ν Α Λ Τ Η Α Λ Γ Ο Ρ Ι Θ Μ Ω Ν Κ Ε Υ Α Λ Α Ι Ο 5. Πως υπολογίζεται ο χρόνος εκτέλεσης ενός αλγορίθμου;

Εισαγωγή στις Αρχές της Επιστήμης των ΗΥ

Εισαγωγή στην πληροφορική

Θέματα Μεταγλωττιστών

Κεφάλαιο 6 ο Εισαγωγή στον Προγραμματισμό 1

Κεφάλαιο 9 Συναρτησιακός προγραμματισμός Υπολογισμός με συναρτήσεις

Προγραμματισμός ΙI (Θ)

Σχέδια μαθημάτων για την δημιουργία συναρτήσεων υπολογισμού του ΜΚΔ και του ΕΚΠ στην MSWLogo

Ελληνική Δημοκρατία Τεχνολογικό Εκπαιδευτικό Ίδρυμα Ηπείρου. Πληροφορική II. Ενότητα 3 : Γλώσσες προγραμματισμού. Δρ.

Ερωτήσεις πολλαπλής επιλογής - Κεφάλαιο 2

ΘΕΜΑ Α ΑΡΧΗ 1ΗΣ ΣΕΛΙΔΑΣ

Transcript:

Adam Brooks Webber University of Winsconsin - Milwaukee ΣΥΓΧΡΟΝΕΣ ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Μια πρακτική εισαγωγή Μετάφραση επιστημονική επιμέλεια: Γεώργιος Φρ. Γεωργακόπουλος Ιωάννης Παπαδόγγονας E-BOOK ΠΑΝΕΠΙΣΤΗΜΙΑΚΕΣ ΕΚΔΟΣΕΙΣ ΚΡΗΤΗΣ Ιδρυτική δωρεά Παγκρητικής Ενώσεως Αμερικής ΗΡΑΚΛΕΙΟ 2011

ΠΑΝΕΠΙΣΤΗΜΙΑΚΕΣ ΕΚΔΟΣΕΙΣ ΚΡΗΤΗΣ ΙΔΡΥΜΑ ΤΕΧΝΟΛΟΓΙΑΣ ΚΑΙ ΕΡΕΥΝΑΣ Hράκλειο Kρήτης, T.Θ. 1385, 711 10. Tηλ.: 2810 391097, Fax: 2810 391085 Aθήνα: Mάνης 5, 10681. Tηλ.: 210 3849020-22, Fax: 210 3301583 e-mail: info@cup.gr www.cup.gr ΣΕΙΡΑ: ΠΑΝΕΠΙΣΤΗΜΙΑΚΗ ΒΙΒΛΙΟΘΗΚΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ / ΕΠΙΣΤΗΜΗ ΥΠΟΛΟΓΙΣΤΩΝ ΔιευθυνΤΕΣ σειρας: Γεώργιος Φρ. Γεωργακόπουλος - Ιωάννης Παπαδόγγονας Τίτλος πρωτοτύπου: Modern Programming Languages. A Practical Introduction 2003 by Franklin, Beedle & Associates Inc. για την ελληνική γλώσσα, 2005 ΠΑΝΕΠΙΣΤΗΜΙΑΚΕΣ ΕΚΔΟΣΕΙΣ ΚΡΗΤΗΣ Μετάφραση - επιστημονική επιμέλεια: Επιμέλεια έκδοσης: Στοιχειοθεσία - σελιδοποίηση: Μακέτα εξωφύλλου: Γεώργιος Φρ. Γεωργακόπουλος, Αναπληρωτής Καθηγητής Τμήματος Επιστήμης Υπολογιστών Πανεπιστημίου Κρήτης Ιωάννης Παπαδόγγονας, Δρ Φυσικής, Επιστημονικός επιμελητής ΠΕΚ Ιωάννης Παπαδόγγονας ΠΑΝΕΠΙΣΤΗΜΙΑΚΕΣ ΕΚΔΟΣΕΙΣ ΚΡΗΤΗΣ Βάσω Αβραμοπούλου ISBN 978-960-524-282-4

Στον John Galloway McCubbin 1931-2000

Περιεχόμενα Πρόλογος στην ελληνική έκδοση......................... xvii Πρόλογος...................................... xix Ευχαριστίες.....................................xxiii KΕΦΑΛΑΙΟ 1: Γλώσσες προγραμματισμού.................... 1 1.1. Εισαγωγή.................................. 1 1.2. Η εκπληκτική ποικιλία........................... 2 Προστακτικές γλώσσες.......................... 2 Συναρτησιακές γλώσσες.......................... 3 Λογικοκεντρικές γλώσσες......................... 3 Οντοστρεφείς γλώσσες........................... 4 1.3. Οι παράξενες αντιμαχίες......................... 5 1.4. Η αξιοπερίεργη εξέλιξη.......................... 7 1.5. Οι πολλαπλές διασυνδέσεις........................ 7 1.6. Σύντομο σχόλιο για τις Διεπαφές για Προγραμματισμό Εφαρμογών 9 1.7. Ανακεφαλαίωση.............................. 9 KΕΦΑΛΑΙΟ 2: Ο ορισμός των συντακτικών κανόνων.............. 11 2.1. Εισαγωγή................................. 11 2.2. Ενδεικτική γραμματική για την αγγλική γλώσσα............ 11 2.3. Ενδεικτική γραμματική για μια γλώσσα προγραμματισμού..... 13 2.4. Ορισμός μιας γραμματικής: η μορφή ΒΝ................14 2.5. Η σχεδίαση μιας γραμματικής......................16 2.6. Η λεκτική και η φραστική δομή μιας γλώσσας............ 18 2.7. Άλλες μορφές γραμματικής........................ 20 Μορφή ΒΝ.................................. 20 Μορφή ΕΒΝ................................. 20 Συντακτικά διαγράμματα.........................22 Ασυμφραστικές τυπικές γραμματικές................... 23 2.8. Ανακεφαλαίωση..............................24 Ασκήσεις................................... 25 Βιβλιογραφία............................... 26

viii ΣΥΓΧΡΟΝΕΣ ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ KΕΦΑΛΑΙΟ 3: Σύνταξη και σημασιολογία: το σημείο συνάντησης..... 27 3.1. Εισαγωγή................................. 27 3.2. Τελεστές................................... 28 3.3. Προτεραιότητα............................... 29 3.4. Προσεταιριστικότητα...........................32 3.5. Άλλες πολυσημίες............................ 35 3.6. Στρυφνές γραμματικές........................... 37 3.7. Συντακτικά δένδρα και η μορφή EBN των γραμματικών.......38 3.8. Αφηρημένα συντακτικά δένδρα.....................39 3.9. Ανακεφαλαίωση..............................40 Ασκήσεις................................... 40 Βιβλιογραφία............................... 41 KΕΦΑΛΑΙΟ 4: Γλωσσικά συστήματα.......................43 4.1. Εισαγωγή................................. 43 4.2. Η τυπική ακολουθία εργασιών..................... 43 Βελτιστοποίηση.............................. 48 4.3. Παραλλαγές της τυπικής ακολουθίας................. 49 Η απόκρυψη των ενδιάμεσων βημάτων.................49 Ενιαία περιβάλλοντα ανάπτυξης (ΕΠΑ)................ 50 Διερμηνηνευτές............................... 50 Εικονικές μηχανές.............................52 Ύστερη σύνδεση............................... 54 Σκιαγράφηση............................... 56 Δυναμική μετάφραση............................ 56 4.4. Συναπτικά στάδια.............................57 Γλωσσοσχεδιαστικό στάδιο........................57 Υλοποιητικό στάδιο............................57 Μεταφραστικό στάδιο.......................... 58 Συνδετικό στάδιο............................. 58 Φορτωτικό στάδιο.............................58 Εκτελεστικό στάδιο............................. 58 4.5. Αποσφαλματωτές.............................59 4.6. Εκτελεστική υποστήριξη.........................60 4.7. Ανακεφαλαίωση..............................61 Ασκήσεις................................... 62

ΠΕΡΙΕΧΟΜΕΝΑ ix KΕΦΑΛΑΙΟ 5: Πρώτη επαφή με τη γλώσσα ML................ 67 5.1. Eισαγωγή................................. 67 5.2. Πρώτα βήματα με το γλωσσικό σύστημα ML.............. 67 5.3. Σταθερές................................... 69 5.4. Τελεστές................................... 70 5.5. Υποθετικές εκφράσεις.......................... 73 5.6. Τυπομετατροπή και εφαρμογή συναρτήσεων.............. 73 5.7. Ορισμός μεταβλητών...........................75 5.8. Ρακοσυλλογή................................ 76 5.9. Πλειάδες και κατάλογοι.......................... 77 5.10. Ορισμοί συναρτήσεων..........................81 5.11. Τύποι και επισημείωση τύπων......................85 5.12. Ανακεφαλαίωση..............................86 Ασκήσεις................................... 87 Βιβλιογραφία............................... 89 KΕΦΑΛΑΙΟ 6: Τύποι................................. 91 6.1. Εισαγωγή................................. 91 6.2. Μια ζούγκλα από τύπους......................... 92 Οι τύποι είναι σύνολα...........................92 Πρωταρχικοί και κατασκευασμένοι τύποι................93 Απαριθμήματα...............................94 Πλειάδες................................... 96 Συμβολοσειρές, συστοιχίες και κατάλογοι................97 Ενώσεις...................................98 Υπότυποι................................. 100 Συναρτησιακοί τύποι........................... 102 6.3. Η χρήση των τύπων........................... 103 Επισημείωση τύπων........................... 103 Συναγωγή τύπου............................. 103 Έλεγχος ορθοτυπίας........................... 104 Ζητήματα ισοδυναμίας τύπων...................... 106 6.4. Ανακεφαλαίωση............................. 107 Ασκήσεις.................................. 108 KΕΦΑΛΑΙΟ 7: Δεύτερη επαφή με τη γλώσσα ML............ 109 7.1. Εισαγωγή............................. 109 7.2. Γνωστά μας μορφότυπα..................... 109 7.3. Άλλα παραδείγματα απλών μορφοτύπων.............110 7.4. Σύνθετα μορφότυπα....................... 111

x ΣΥΓΧΡΟΝΕΣ ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ 7.5. Σύνοψη των μορφοτύπων ML μέχρι στιγμής...........112 7.6. Εναλλακτικά μορφότυπα για συναρτήσεις........... 113 7.7. Το μορφοτυπικό ύφος γραφής προγραμμάτων......... 114 7.8. Τοπικοί ορισμοί μεταβλητών....................116 7.9. Ένθετοι ορισμοί συναρτήσεων...................120 7.10. Ανακεφαλαίωση..........................122 Ασκήσεις..............................122 KΕΦΑΛΑΙΟ 8: Πολυμορφισμός...................... 125 8.1. Εισαγωγή............................. 125 8.2. Υπερφόρτιση........................... 125 8.3. Μετασκευή παραμέτρων......................128 8.4. Παραμετρικός πολυμορφισμός..................131 8.5. Υποτυπικός πολυμορφισμός....................133 8.6. Ανακεφαλαίωση..........................135 Ασκήσεις..............................137 Βιβλιογραφία........................... 139 KΕΦΑΛΑΙΟ 9: Τρίτη επαφή με τη γλώσσα ML...............141 9.1. Εισαγωγή............................. 141 9.2. Μορφότυπα η συνέχεια.................... 141 9.3. Τιμές συναρτήσεων και ανώνυμες συναρτήσεις.........143 9.4. Υψηλοτάξιες συναρτήσεις και επαλληλία παραμέτρων.....146 9.5. Προκαθορισμένες υψηλοτάξιες συναρτήσεις...........148 Η απεικονιστική συνάρτηση map.................... 148 Η δ-σωρευτική συνάρτηση foldr................... 149 Η α-σωρευτική συνάρτηση foldl................... 152 9.6. Ανακεφαλαίωση..........................153 Ασκήσεις............................. 153 KΕΦΑΛΑΙΟ 10: Εμβέλεια...........................157 10.1. Εισαγωγή............................. 157 10.2. Ορισμοί και εμβέλεια........................158 10.3. Εμβελειοθέτηση μέσω παραγράφων...............160 10.4. Εμβελειοθέτηση με επώνυμους ονοματοχώρους........ 163 10.5. Εμβελειοθέτηση με πρωταρχικούς ονοματοχώρους.......167 10.6. Δυναμική εμβελειοθέτηση.....................169 10.7. Λίγα σχόλια για την τμηματική μετάφραση...........171 10.8. Ανακεφαλαίωση..........................172 Ασκήσεις..............................173 Βιβλιογραφία........................... 175

ΠΕΡΙΕΧΟΜΕΝΑ xi KΕΦΑΛΑΙΟ 11: Τέταρτη επαφή με τη γλώσσα ML............177 11.1. Εισαγωγή............................. 177 11.2. Απαριθμήματα...........................177 11.3. Τιμοκατασκευαστές με παραμέτρους.............. 179 11.4. Τυποκατασκευαστές με παραμέτρους...............181 11.5. Αναδρομικοί τυποκατασκευαστές.................183 11.6. Ανακεφαλαίωση και αποχαιρετισμός στην ML..........188 Ασκήσεις..............................190 Βιβλιογραφία........................... 191 KΕΦΑΛΑΙΟ 12: Οι θέσεις μνήμης για τις μεταβλητές..........193 12.1. Εισαγωγή............................. 193 12.2. Ενεργοειδικές μεταβλητές.................... 193 Άλλα είδη μεταβλητών.......................195 12.3. Δελτία ενεργοποίησης...................... 196 12.4. Στατική δέσμευση των δελτίων ενεργοποίησης.........197 12.5. Στοίβες και δυναμική δέσμευση των δελτίων ενεργοποίησης. 198 12.6. Χειρισμός ένθετων ορισμών συναρτήσεων........... 205 12.7. Οι συναρτήσεις ως παράμετροι................. 210 12.8. Μακρόβιες συναρτήσεις..................... 213 12.9. Ανακεφαλαίωση..........................215 Ασκήσεις..............................216 KΕΦΑΛΑΙΟ 13: Πρώτη επαφή με τη γλώσσα Java.............219 13.1. Eισαγωγή............................. 219 13.2. Με τις οντότητες κατά νου....................220 13.3. Απλές εκφράσεις και εντολές.................. 222 Σταθερές και τύποι δεδομένων..................... 222 Τελεστές για πράξεις επί ακεραίων................... 224 Τελεστές για πράξεις επί πραγματικών................. 224 Συναρμογή συμβολοσειρών....................... 225 Συγκριτικοί τελεστές........................... 226 Λογικοί τελεστές............................. 226 Παρενεργικοί τελεστές.......................... 226 Κλήσεις μεθόδων............................. 230 Οντοπαραγωγικές εκφράσεις...................... 232 Προσεταιριστικότητα, προτεραιότητες, μετασκευές, κ.λπ....... 233 Απλές εντολές............................... 233 Σύνθετες εντολές............................. 234 Δηλωτικές εντολές............................ 235

xii ΣΥΓΧΡΟΝΕΣ ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Η υποθετική εντολή if......................... 235 Η επαναληπτική εντολή while.................... 236 Η επιστροφική εντολή return..................... 237 13.4. Ορισμοί κλάσεων..........................238 13.5. Παραπομπές και δείκτες..................... 243 13.6. Πρώτη επαφή με ένα γλωσσικό σύστημα Java......... 245 13.7. Ανακεφαλαίωση..........................248 Ασκήσεις..............................248 Βιβλιογραφία........................... 251 KΕΦΑΛΑΙΟ 14: Διαχείριση μνήμης.....................253 14.1. Εισαγωγή............................. 253 14.2. Ένα μοντέλο μνήμης με χρήση συστοιχιών της Java.......253 14.3. Στοίβες...............................256 14.4. Σωροί............................... 260 Ο μηχανισμός της «πρώτης επαρκούς» περιοχής........... 261 Συγκόλληση συνεχόμενων αδέσμευτων περιοχών........... 267 Πρόχειροι κατάλογοι και ύστερη συγκόλληση............. 269 Κατακερματισμός μνήμης........................ 271 Άλλες τεχνικές διαχείρισης του μνημοσωρού............. 272 14.5. Τρέχουσες σωροπαραπομπές...................274 Εντοπισμός των τρεχουσών σωροπαραπομπών.......... 274 Σύμπτυξη σωρού............................. 278 Ρακοσυλλογή............................... 279 14.6. Ανακεφαλαίωση..........................284 Ασκήσεις..............................284 Βιβλιογραφία........................... 287 KΕΦΑΛΑΙΟ 15: Δεύτερη επαφή με τη γλώσσα Java........... 289 15.1. Εισαγωγή............................. 289 15.2. Η υλοποίηση διεπαφών......................289 15.3. Επέκταση κλάσεων........................295 15.4. Επέκταση και υλοποίηση......................301 15.5. Πολλαπλή κληρονόμηση και υποκατάστατά της.........302 15.6. Αρχέτυπα και υποκατάστατά τους................304 15.7. Ανακεφαλαίωση..........................308 Ασκήσεις..............................308

ΠΕΡΙΕΧΟΜΕΝΑ xiii KΕΦΑΛΑΙΟ 16: Οντοστρέφεια.......................317 16.1. Εισαγωγή............................. 317 16.2. Οντοστρεφής προγραμματισμός.................318 Οντοστρεφής ML............................. 318 Μη οντοστρεφής Java.......................... 323 Σύνοψη.................................. 326 16.3. Οντοστρεφείς γλώσσες - απάνθισμα χαρακτηριστικών.....326 Κλάσεις.................................. 327 Πρωτότυπα................................ 327 Κληρονόμηση............................... 329 Ενθυλάκωση............................... 330 Πολυμορφισμός.............................. 331 16.4. Ανακεφαλαίωση..........................333 Ασκήσεις............................. 334 Βιβλιογραφία........................... 337 KΕΦΑΛΑΙΟ 17: Τρίτη επαφή με τη γλώσσα Java.............339 17.1. Εισαγωγή............................. 339 17.2. Εκπέμψιμες οντότητες...................... 340 17.3. Παραλαβή εξαιρέσεων...................... 342 17.4. Εκπομπή εξαιρέσεων........................348 17.5. Ελεγκτέες εξαιρέσεις........................351 17.6. Διαχείριση σφαλμάτων.......................354 Απλή δήλωση των προϋποθέσεων.................... 356 Εξαντλητικοί ορισμοί........................... 357 Καταστροφικά σφάλματα........................ 358 Σήμανση των σφαλμάτων........................ 359 Εκπομπή εξαιρέσεων........................... 363 17.7. Και «τελικά»............................365 17.8. Ανακεφαλαίωση και αποχαιρετισμός στην Java.........367 Ασκήσεις..............................368 Βιβλιογραφία........................... 379 KΕΦΑΛΑΙΟ 18: Παράμετροι........................ 381 18.1. Εισαγωγή............................. 381 18.2. Αντιστοιχία............................ 382 18.3. Τιμοδοτική διαβίβαση...................... 383 18.4. Τιμοληπτική διαβίβαση......................386 18.5. Δοσοληπτική διαβίβαση..................... 389

xiv ΣΥΓΧΡΟΝΕΣ ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ 18.6. Παραπεμπτική διαβίβαση.....................391 18.7. Διαβίβαση μέσω ανάπτυξης μακροεντολής............396 18.8. Ονομαστική διαβίβαση......................399 18.9. Οικονομική (ονομαστική) διαβίβαση.............. 401 18.10. Ζητήματα προδιαγραφών.....................403 18.11. Ανακεφαλαίωση..........................404 Ασκήσεις..............................405 KΕΦΑΛΑΙΟ 19: Πρώτη επαφή με τη γλώσσα Prolog...........407 19.1. Εισαγωγή............................. 407 19.2. Οι δομικοί λίθοι: οι όροι της Prolog................408 19.3. Πρώτα βήματα με ένα γλωσσικό σύστημα prolog....... 410 19.4. Κανόνες...............................415 19.5. Οι δύο όψεις της Prolog..................... 418 19.6. Ένα μικρό σχόλιο για την ερμηνεία των όρων..........420 19.7. Τελεστές..............................421 19.8. Κατάλογοι.............................423 Ειδικός συμβολισμός σχετικά με τους καταλόγους.......... 423 Το προσαρτησιακό κατηγόρημα append και άλλα ευέλικτα κατηγορήματα............................. 424 Το αντιστρεπτικό κατηγόρημα reverse και άλλα μη ευέλικτα κατηγορήματα............................. 428 Η ανώνυμη μεταβλητή.......................... 430 19.9. Αρνήσεις και αποτυχίες......................431 19.10. Το είδος των εργασιών για τις οποίες προσφέρεται η Prolog. 433 19.11. Ανακεφαλαίωση..........................436 Ασκήσεις..............................436 Βιβλιογραφία........................... 439 KΕΦΑΛΑΙΟ 20: Δεύτερη επαφή με τη γλώσσα Prolog..........441 20.1. Εισαγωγή............................. 441 20.2. Ενοποίηση.............................441 Ο έλεγχος εμφάνισης........................... 444 20.3. Μια διαδικαστική θεώρηση....................445 Οπισθοχώρηση.............................. 446 Αντικατάσταση.............................. 447 20.4. Μια υλοποιητική θεώρηση.....................449 Το αναλυτικό βήμα............................ 449 Ο διερμηνευτής της Prolog........................ 450 Η συγκέντρωση των αντικαταστάσεων................. 452

ΠΕΡΙΕΧΟΜΕΝΑ xv 20.5. Μια αφηρημένη θεώρηση - τα αποδεικτικά δένδρα.......454 Ο ορισμός των αποδεικτικών δένδρων................. 454 Άπειρα αποδεικτικά δένδρα....................... 456 Μετονομασίες μεταβλητών....................... 457 20.6. Η πιο ανάλαφρη όψη της Prolog.................460 Τα άτομα ως συμβολοσειρές....................... 461 Αναγραφή και ανάγνωση : write και read.............. 461 Βεβαίωση και ανάκληση: assert και retract............ 462 Ένα παιγνίδι περιπέτειας......................... 464 20.7. Ανακεφαλαίωση..........................471 Ασκήσεις..............................472 KΕΦΑΛΑΙΟ 21: Κοστολόγηση.......................475 21.1. Εισαγωγή............................. 475 21.2. Κοστολόγηση πράξεων σε καταλόγους..............476 21.3. Κοστολόγηση της κλήσης συναρτήσεων............ 481 21.4. Κοστολόγηση της αναζήτησης στην Prolog...........488 21.5. Κοστολόγηση πράξεων σε συστοιχίες...............490 21.6. Εφήμερες αρχές κοστολόγησης..................496 21.7. Ανακεφαλαίωση..........................498 Ασκήσεις..............................499 KΕΦΑΛΑΙΟ 22: Τρίτη επαφή με τη γλώσσα Prolog...........503 22.1. Εισαγωγή............................. 503 22.2. Αριθμητικοί υπολογισμοί.....................503 Αριθμητική αποτίμηση.......................... 504 Αριθμητικές συγκρίσεις......................... 506 Παραδείγματα.............................. 507 22.3. Διερεύνηση προβληματοχώρου................. 510 Το πρόβλημα του σακιδίου........................ 510 Το πρόβλημα των οκτώ βασιλισσών................... 516 22.4. Ανακεφαλαίωση και αποχαιρετισμός στην Prolog....... 522 Ασκήσεις..............................523 Βιβλιογραφία........................... 524 KΕΦΑΛΑΙΟ 23: Τυπική σημασιολογία.................. 527 23.1. Εισαγωγή............................. 527 23.2. Γλώσσα Micro-1......................... 527 Ο διερμηνευτής.............................. 529 Μια φυσική σημασιολογία........................ 532

xvi ΣΥΓΧΡΟΝΕΣ ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ 23.3. Γλώσσα Micro-2: η προσθήκη μεταβλητών............533 Ο διερμηνευτής.............................. 534 Μια φυσική σημασιολογία........................ 536 Περί σφαλμάτων............................. 537 23.4. Γλώσσα Micro-3: η προσθήκη συναρτήσεων...........538 Ένας διερμηνευτής............................ 538 Μια φυσική σημασιολογία........................ 543 Περί σφαλμάτων............................. 543 Περί της σειράς αποτίμησης....................... 544 23.5. Άλλα είδη τυπικής σημασιολογίας................546 Εκτελεστική σημασιολογία....................... 546 Αξιωματική σημασιολογία........................ 547 Υποδηλωτική σημασιολογία....................... 549 23.6. Ανακεφαλαίωση..........................550 Ασκήσεις..............................551 Βιβλιογραφία........................... 554 KΕΦΑΛΑΙΟ 24: Η ιστορία των γλωσσών προγραμματισμού...... 555 24.1. Εισαγωγή............................. 555 24.2. Η προϊστορία του προγραμματισμού.............. 555 Η ιστορία των βαβυλώνιων προγραμματιστών............ 555 Η ιστορία του Μοχάμεντ Αλ-Χουάριζμι................ 557 Η ιστορία της Augusta Ada, κόμισσας του Lovelace.......... 557 24.3. Πρώιμες γλώσσες προγραμματισμού.............. 559 Η ιστορία της Plankalkül......................... 559 Η ιστορία της Fortran.......................... 561 Η ιστορία της Lisp............................ 565 Η ιστορία της Algol............................ 568 Η ιστορία της Smalltalk......................... 572 24.4. Οι γλώσσες που εξετάσαμε σε αυτό το βιβλίο..........575 Η ιστορία της Prolog........................... 575 Η ιστορία της ML............................. 577 Η ιστορία της Java............................ 578 24.5. Ανακεφαλαίωση..........................581 Βιβλιογραφία........................... 582 Επίλογος...................................585 Ευρετήριο..................................587 Γλωσσάριο................................. 601

Πρόλογος στην ελληνική έκδοση Οι Πανεπιστημιακές Εκδόσεις Κρήτης έχουν την χαρά να παρουσιάσουν το βιβλίο Σύγχρονες γλώσσες προγραμματισμού, του Adam Brooks Webber. Το συγκεκριμένο σύγγραμμα επιλέχθηκε διότι είναι από τα ελάχιστα αυτού του είδους στη διεθνή βιβλιογραφία. Τα πιο αξιοσημείωτα χαρακτηριστικά του είναι τα εξής: α) Ο τρόπος προσέγγισης. Ο συγγραφέας δεν πραγματεύεται, όπως γίνεται συνήθως, απλά και μόνο κάποια ή κάποιες συγκεκριμένες γλώσσες προγραμματισμού, αλλά το ίδιο το φαινόμενο των γλωσσών προγραμματισμού: Πώς και γιατί έχουν αναπτυχθεί γλώσσες προγραμματισμού με διαφορετικές μορφές; Τι εκφραστική αξία έχουν αυτές οι γλώσσες; Ποιες είναι οι κυριότερες τεχνοτρο πίες προγραμματισμού (λ.χ. προστακτική, οντοστρεφής, συναρτησιακή, λογικοκεντρική, κ.λπ.), και πώς χρησιμοποιούνται; β) Ο βαθμός εμβάθυνσης. Ο συγγραφέας δεν μένει στα «φαινόμενα», αλλά διεισδύει στο παρασκήνιο των γλωσσών, δηλαδή στα καθήκοντα των γλωσσικών συστημάτων: Πώς είναι δυνατή η υλοποίηση γλωσσών με μύρια διαφορετικά χαρακτηριστικά; Πώς δομούνται τα γλωσσικά συστήματα που κάνουν εφικτή τη μαγεία του προγραμματισμού σε οποιoδήποτε προγραμματιστικό ύφος; Τι προβλήματα καλούνται να λύσουν και πώς το επιτυγχάνουν; γ) Η μέθοδος διδασκαλίας. Ο συγγραφέας εναλλάσσει (στη ροή των κεφαλαίων) την αφ υψηλού θεώρηση με την εισαγωγική και πρακτική διδασκαλία τριών γλωσσών προγραμματισμού (ML, Java, Prolog), που αντιστοιχούν σε τρία θεμελιώδη είδη προγραμματισμού: τον οντοστρεφή, τον συναρτησιακό και τον λογικοκεντρικό προγραμματισμό. Η παρουσίαση παραμένει απλή, εισαγωγική, και αποτελεσματικά διδακτική με ευχάριστο τρόπο. Το βιβλίο φωτίζει λοιπόν τις λογικές και τεχνικές βάσεις των γλωσσών προγραμματισμού, και ως εκ τούτου ενδείκνυται ιδιαίτερα για τη διδασκαλία ενός μαθήματος με αυτό το αντικείμενο. Ταυτόχρονα, μπορεί να φανεί πολύ χρήσιμο σε οποιονδήποτε «μαχόμενο» προγραμματιστή, είτε επαγγελματία είτε ερασιτέ-

xviii ΣΥΓΧΡΟΝΕΣ ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ χνη, αφού αναδεικνύει πλευρές των καθημερινών προγραμματιστικών εργα λείων οι οποίες συχνά μένουν κρυφές ή αδίδακτες. Τόσο η ορολογία όσο και η φύση του θέματος προκαλούν εύλογα πολλές μεταφραστικές δυσκολίες (αφού σχεδόν όλες οι γλώσσες προγραμματισμού γράφονται στην αγγλική γλώσσα). Σε κάποιες περιπτώσεις κρίναμε σκόπιμο να παρεμβάλουμε σχόλια στον κώδικα, τα οποία ξεκινούν με τη διπλή πλάγια κάθετο, //. Σε άλλα σημεία προσθέσαμε υποσημειώσεις με αστερίσκο για τη μετάφραση κάποιων από τα μηνύματα των γλωσσικών συστημάτων, ενώ σε λίγες περιπτώσεις τροποποιήσαμε ορισμένες ονομασίες μεταβλητών ώστε να είναι πιο κατανοη τές από τον Έλληνα αναγνώστη. Εν γένει, επιμεληθήκαμε αυτό το βιβλίο και την ορολογία του γνωστικού αντικειμένου με ιδιαίτερη φροντίδα, ώστε να έχουμε μια γνήσια ελληνική μετάφραση, και όχι ένα κουραστικό μίγμα από ελληνικούς και αγγλικούς όρους. Για όσες περιπτώσεις δεν το κατορθώσαμε, ελπίζουμε στην κατανόηση του αναγνώστη. Τέλος, θα θέλαμε να ευχαριστήσουμε την κ. Διονυσία Δασκάλου, γενική επιμελήτρια των ΠΕΚ, για τη συμβολή της σε διάφορα στάδια της παραγωγής του βιβλίου. Γιώργος Φρ. Γεωργακόπουλος Ιωάννης Παπαδόγγονας

Πρόλογος Το βιβλίο αυτό έχει τον χαρακτήρα διδακτικού εγχειριδίου για το εισαγωγικό γε νικό μάθημα περί γλωσσών προγραμματισμού το οποίο διδάσκεται σε προπτυχιακούς φοιτητές επιστήμης υπολογιστών και μηχανολογίας υπολογιστών. Προσφέρεται για ένα μάθημα που εισάγει τις γενικές έννοιες των ποικίλων γλωσσών προγραμματισμού, και απευθύνεται σε φοιτητές που έχουν ήδη αρκετή ευχέρεια στον βασικό προγραμματισμό σε μία τουλάχιστον γλώσσα. Πραγματεύεται όλα τα βασικά θέματα των γλωσσών προγραμματισμού τα οποία προτείνονται στην έκθεση της ACM * σχετικά με τα προγράμματα σπουδών στην υπολογιστική (προ σχέδιο Steelman), και εισάγει τα πιο κεντρικά από αυτά τα θέματα με αρκετές λεπτομέρειες. Η ύλη του βιβλίου είναι διαρθρωμένη έτσι ώστε να διεγείρει το ενδιαφέρον του σύγχρονου φοιτητή. Η συνήθης προσέγγιση σε τέτοιου είδους βιβλία είναι να παρουσιάζεται η ιστορία των σημαντικότερων γλωσσών προγραμματισμού, και κατόπιν να μελετούνται λεπτομερώς οι γλώσσες αυτές μέσω μιας διδακτικής ακολουθίας που καθοδηγείται από κάποιες έννοιες ή κάποια παραδείγματα. Οι περισσότεροι φοιτητές της επιστήμης υπολογιστών, όμως, δεν είναι σε θέση να εκτιμήσουν πλήρως τις εξελικτικές λεπτομέρειες, την αφαίρεση χωρίς συγκεκριμένο στόχο, και την κατάταξη σε κατηγορίες. Οι προπτυχιακοί φοιτητές επιστήμης και μηχανολογίας υπολογιστών έχουν κατά κανόνα πρακτικό προσανατολισμό: μελετούν την υπολογιστική επειδή τους αρέσει ο προγραμματισμός και είναι καλοί σε αυτόν. Άλλοι φοιτητές μελετούν την υπολογιστική επειδή τους αρέσει η θεωρητική επιστήμη υπολογιστών και είναι καλοί σε αυτήν. Το ζητούμενο από ένα μάθημα για τις βασικές έννοιες των γλωσσών προγραμματισμού είναι να βοηθήσει όλους τους φοιτητές να κατανοήσουν τις γλώσσες προγραμματισμού σε ένα ασυνήθιστο επίπεδο αφαίρεσης. Προκειμένου να επιτευχθεί αυτός ο στόχος, το βιβλίο περιλαμβάνει αρκετές ασκήσεις προγραμματισμού και παραδείγματα πρακτικής φύσεως, ώστε να συντηρήσει το ενδιαφέρον των φοιτητών με πιο πρακτικό προσανατολισμό, χωρίς να προϋποθέτει από τον αναγνώστη * Association for Computing Machinery: Ένωση για τον Υπολογιστικό Εξοπλισμό

xx ΣΥΓΧΡΟΝΕΣ ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ υψηλό επίπεδο μαθηματικής ωριμότητας. Είναι σχεδιασμένο έτσι ώστε να καθοδηγεί τους φοιτητές να αντιλαμβάνονται σε αφηρημένο επίπεδο τις έννοιες των γλωσσών προγραμματισμού, χρησιμοποιώντας ως αφετηρία κάποιες απλές ασκήσεις προγραμματισμού. Τα κεφάλαια του βιβλίου χωρίζονται σε δύο κατηγορίες: πρακτικού και φιλοσοφικού χαρακτήρα. Τα πρώτα είναι αυτοτελή «αλφαβητάρια» για τρεις γλώσσες προγραμματισμού. Σε αυτά αναπτύσσεται ένα επίπεδο δεξιότητας που θα επιτρέψει στον φοιτητή να διεκπεραιώνει απλές ασκήσεις προγραμματισμού. Η ενασχόληση με τον προγραμματισμό σε διάφορες οικογένειες γλωσσών είναι ιδιαίτερα σημαντική για τον φοιτητή. Το βιβλίο περιλαμβάνει εισαγωγές στον προγραμματισμό για τρεις γλώσσες την ML, την Java και την Prolog από τις οποίες οι δύο τουλάχιστον θα είναι άγνωστες σε όλους σχεδόν τους φοιτητές αυτού του επιπέδου. (Υπάρχουν εξαιρετικές δωρεάν υλοποιήσεις όλων αυτών των γλωσσών για διάφορα υπολογιστικά πλαίσια, μεταξύ των οποίων τα Windows, το Unix και το λειτουργικό σύστημα Macintosh. Στον Ιστότοπο αυτού του βιβλίου, http://www.webber-labs.com/mpl.html, υπάρχουν οδηγίες για το πώς μπο ρεί κανείς να προμηθευτεί μια τέτοια υλοποίηση.) Τα κεφάλαια πρακτικού χαρακτήρα περιλαμβάνουν μια σύντομη εισαγωγή στις ιδιαιτερότητες της κάθε γλώσσας. Δεν καλύπτουν όμως τις Διεπαφές για Προγραμματισμό Εφαρμογών. Ως εκ τούτου, θα δώσουν μεν στον φοιτητή τη δυνατότητα να επιλύει ασκήσεις προγραμματισμού, αλλά όχι και να αναπτύσσει ολοκληρωμένες εφαρμογές μεγάλης κλίμακας. Στα κεφάλαια φιλοσοφικού χαρακτήρα παρουσιάζεται η θεωρητική πλευρά: οι υποκείμενες αρχές των γλωσσών προγραμματισμού. Τα κεφάλαια αυτά εναλλάσσονται με τα κεφάλαια πρακτικού χαρακτήρα, σε μια αλληλουχία που επιτρέπει την αποσαφήνιση των εννοιών μέσω παραδειγμάτων από την πρόσφατα διδαχθείσα γλώσσα, και διευκολύνει την παρουσίαση των θεωρητικών ζητημάτων στην κατάλληλη χρονική συγκυρία ώστε η σύνδεσή τους με την προγραμματιστική πρακτική να είναι όσο το δυνατόν εμφανέστερη. Παραδείγματος χάριν, το Κεφάλαιο 23 πραγματεύεται την τυπική σημασιολογία ξεκινώντας από κάποιους απλούς διερμηνευτές γραμμένους σε Prolog. Οι διερμηνευτές αυτοί οδηγούν με φυσιολογικό τρόπο σε ορισμούς γλωσσών μέσω μακροβηματικής εκτελεστικής σημασιολογίας. Αυτός είναι και ο λόγος που η τυπική σημασιολογία εμφανίζεται τόσο αργά σε αυτό το βιβλίο: μόνο αφότου έχει ολοκληρωθεί η παρουσίαση της Prolog, είναι σε θέση οι φοιτητές να μεταβούν από τις ασκήσεις Prolog σε αυτό το συναφές, αφηρημένο ζήτημα. Το βιβλίο είναι γραμμένο σε εισαγωγικό επίπεδο. Έχει ως στόχο να είναι κατανοητό και ενδιαφέρον για την πλειονότητα των φοιτητών που έχουν ολοκληρώσει μια βασική σειρά μαθημάτων ΕΥ1/ΕΥ2 σε οποιαδήποτε γλώσσα. Ένα συνηθισμένο μειονέκτημα στα υπάρχοντα βιβλία για αυτό το γνωστικό αντικείμενο εί-

ΠΡΟΛΟΓΟΣ xxi ναι ότι θέτουν σιωπηρά υπερβολικές προϋποθέσεις: πληρέστερο υπόβαθρο στην υπολογιστική, μεγαλύτερη μαθηματική ωριμότητα, και γνησιότερο ενδιαφέρον για την αφαίρεση και την κατηγοριοποίηση από αυτό που έχουν στην πραγματικότητα οι περισσότεροι φοιτητές στους οποίους απευθύνονται. Η τάση να θέτει κανείς σιωπηρά τέτοιες προϋποθέσεις είναι εύλογη, διότι πολλά ενδιαφέροντα τμήματα της θεωρίας των γλωσσών προγραμματισμού δεν είναι προσιτά στους σπουδαστές αυτού του επιπέδου. Αυτή η πρακτική, όμως, αποβαίνει εις βάρος της πλειονότητας των σπουδαστών. Η ύλη που θα πρέπει να καλυφθεί είναι υπερβολική για ένα εξάμηνο, ακόμη και χωρίς να επεκταθεί κανείς σε ζητήματα που απαιτούν γνώσεις αρχιτεκτονικής υπολογιστών, λειτουργικών συστημάτων, τυπικών γλωσσών και αυτομάτων, μαθηματικής λογικής ή επαγωγικών τεχνικών απόδειξης. Αντιθέτως, ένα μάθημα το οποίο θα ακολουθήσει αυτό το βιβλίο δεν είναι απαραίτητο να τοποθετηθεί στο τέλος μιας μακράς αλυσίδας από προαπαιτούμενα. Έτσι, το βιβλίο αυτό μπορεί να ενταχθεί πιο εύκολα σε περισσότερα προγράμματα σπουδών της επιστήμης και της μηχανολογίας υπολογιστών. Λόγω της αφηγηματικής του δομής και της γραμμικής διδακτικής του συγκρότησης, το βιβλίο μπορεί να χρησιμοποιηθεί εύκολα για διδασκαλία εάν ακολουθηθεί η υπάρχουσα σειρά παρουσίασης της ύλης, εφ όσον βέβαια υπάρχουν τα χρονικά περιθώρια για κάτι τέτοιο. Εάν οι φοιτητές γνωρίζουν ήδη κάποια από τις γλώσσες (το πιθανότερο την Java), κάποια από τα διδακτικά κεφάλαια είναι δυνατόν να παραλειφθούν ή να παρουσιαστούν επί τροχάδην, ώστε να μείνει χρόνος για λεπτομερέστερη κάλυψη άλλων, ή για την παρουσίαση επιπλέον ύλης. Για την περίπτωση που είναι απαραίτητο να παραλειφθούν και άλλα κεφάλαια, παραθέτουμε αμέσως παρακάτω χονδρικά τις πιο σημαντικές αλληλεξαρτήσεις μεταξύ των κεφαλαίων: Κεφάλαιο Κεφάλαια στα οποία βασίζεται 1: Γλώσσες προγραμματισμού 2: Ο ορισμός των συντακτικών κανόνων 3: Σύνταξη και σημασιολογία: το σημείο συνάντησης 2 4: Γλωσσικά συστήματα 5: Πρώτη επαφή με τη γλώσσα ML 2, 3 6: Τύποι 4 7: Δεύτερη επαφή με τη γλώσσα ML 2, 3, 5 8: Πολυμορφισμός 4, 6 9: Τρίτη επαφή με τη γλώσσα ML 2, 3, 5, 7 10: Εμβέλεια 4 11: Τέταρτη επαφή με τη γλώσσα ML 2, 3, 5, 7, 8, 9

xxii ΣΥΓΧΡΟΝΕΣ ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κεφάλαιο Κεφάλαια στα οποία βασίζεται 12: Οι θέσεις μνήμης για τις μεταβλητές 4, 5, 7, 9 13: Πρώτη επαφή με τη γλώσσα Java 2, 3 14: Διαχείριση μνήμης 2, 3, 13 15: Δεύτερη επαφή με τη γλώσσα Java 2, 3, 13 16: Οντοστρέφεια 2, 3, 5, 7, 9, 13, 15 17: Τρίτη επαφή με τη γλώσσα Java 2, 3, 13, 15 18: Παράμετροι 2, 3, 13 19: Πρώτη επαφή με τη γλώσσα Prolog 2, 3 20: Δεύτερη επαφή με τη γλώσσα Prolog 2, 3, 19 21: Κοστολόγηση 2, 3, 4, 5, 13, 19, 20 22: Τρίτη επαφή με τη γλώσσα Prolog 2, 3, 19, 20 23: Τυπική σημασιολογία 2, 3, 4, 5, 7, 9, 10, 12 24: Η ιστορία των γλωσσών προγραμματισμού Διάφορα Ειδικότερα, τα Κεφάλαια 11, 14, 21 και 22 μπορούν να παραλειφθούν χωρίς ιδιαίτερη βλάβη των υπολοίπων. Εάν ο χρόνος πιέζει προς το τέλος του εξαμήνου, θα ήταν καλύτερα να παραλειφθούν τα Κεφάλαια 21 και 22 παρά τα Κεφάλαια 23 ή 24. Στο Κεφάλαιο 23 επανεξετάζονται και διευκρινίζονται πολλές σημαντικές έννοιες από τα προηγούμενα κεφάλαια. Το Κεφάλαιο 24 είναι τελευταίο όχι επειδή η ιστορία των γλωσσών προγραμματισμού είναι ασήμαντο ζήτημα, αλλά επειδή γίνεται πιο ενδιαφέρον όταν οι φοιτητές κατανοούν κάποιες από τις έννοιες των οποίων η ιστορική εξέλιξη παρουσιάζεται. Η διεύθυνση του Ιστοτόπου αυτού του βιβλίου είναι http://www.webber-labs. com/mpl.html. Εκεί μπορεί κανείς να βρει, μεταξύ άλλων, ένα πλήρες σύνολο από διαφάνειες για κάθε κεφάλαιο, χρήσιμους συνδέσμους για καταφόρτωση και εγκατάσταση δωρεάν γλωσσικών συστημάτων, και όλα τα μακροσκελή τμήματα κώδικα που χρησιμοποιούνται ως παραδείγματα στο κείμενο και τις ασκήσεις. Υπάρχουν επίσης οδηγίες για να επικοινωνήσει κανείς με τον συγγραφέα προκειμένου να αναφέρει ελαττώματα, και για να αποκτήσει πρόσβαση σε επιπλέον διδακτικό υλικό αποκλειστικά για τους διδάσκοντες.

Ευχαριστίες Η οικογένειά μου με βοήθησε σημαντικά σε όλη τη διάρκεια της συγγραφής αυτού του βιβλίου, ιδιαίτερα η σύζυγός μου Kelly και τα παιδιά μου Fern και Fox. Θα αναφέρω ένα μόνο παράδειγμα: ο μικρός μου Fox, μόλις δύο ετών, μια μέρα καθώς έγραφα άνοιξε την πόρτα του γραφείου μου, είπε «αγκαλιά», με αγκάλιασε και κατόπιν έφυγε, κλείνοντας την πόρτα πίσω του. Όλοι τους φάνηκαν πραγματικά πολύ γενναιόδωροι, αφήνοντάς μου αρκετό χρόνο για τις ανάγκες της συγγραφής του βιβλίου. Σας ευχαριστώ αγαπημένοι μου. Στις αρχές της δεκαετίας του 1980, συνεργάστηκα με μια εκπληκτική ομάδα προγραμματιστών: τους φοιτητές και το διδακτικό προσωπικό του Kiewit Computation Center του Dartmouth College. Η ιδιόμορφη πρακτική της συγγραφής συστημικού λογισμικού από φοιτητές, η οποία ήταν καθιερωμένη στο Dartmouth, υπήρξε ιδιαίτερα επωφελής για μένα. Μέντοράς μου στο Kiewit ήταν ο Philip D. L. Koch, δημιουργός μιας υπέροχης συλλογής προγραμμάτων η οποία περιλάμβανε ένα λειτουργικό σύστημα κεντρικού υπολογιστή και έναν εξαιρετικό μεταφραστή της PL/I. Αυτό υπήρξε η απαρχή του ενδιαφέροντός μου για τις γλώσσες προγραμματισμού. Είμαι ευγνώμων στους φοιτητές μου στο Πανεπιστήμιο του Wisconsin Milwaukee και στο Πανεπιστήμιο του Western Illinois, οι οποίοι άντεξαν τους καλοπροαίρετους πειραματισμούς μου και με βοήθησαν να αναπτύξω, στη διάρκεια κάποιων ετών, τη δομή του μαθήματος στην οποία βασίζεται το βιβλίο αυτό. Ευχαριστώ επίσης την Stephanie Welch της Franklin Beedle & Associates, που επιμελήθηκε και σελιδοποίησε το βιβλίο στο πλαίσιο της επιμέλειας παραγωγής του. Πολλοί ήταν αυτοί που με βοήθησαν στη διάρκεια της συγγραφής διαβάζοντας και σχολιάζοντας προκαταρκτικές εκδοχές του βιβλίου: ο John Tang Boyland του Πανεπιστημίου του Wisconsin Milwaukee, ο Daniel Canas του Πανεπιστημίου του Wake Forest, ο Frank Friedman του Πανεπιστημίου Temple, ο Assaf Khoury του Πανεπιστημίου της Βοστώνης, ο Shui Lam του Πολιτειακού Πανεπιστημίου της Καλιφόρνιας, στο Long Beach, ο Ernst

xxiv ΣΥΓΧΡΟΝΕΣ ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Leiss του Πανεπιστημίου του Houston, ο Mike Morton, ο Robert Roos του Allegheny College, ο Randy Smith του Covenant College, και ο K. Vairavan του Πανεπιστημίου του Wisconsin Milwaukee. Ιδιαίτερα ευχαριστώ τον Randy Smith, ο οποίος χρησιμοποίησε μια προκαταρκτική μορφή του βιβλίου στα μαθήματά του στο Covenant College και μου μετέφερε πολύτιμα στοιχεία από τη χρήση του στη διδασκαλία. Οι εναπομένουσες ατέλειες αποτελούν, φυσικά, αποκλειστικά δική μου ευθύνη.

1 Γλώσσες προγραμματισμού 1.1. Εισαγωγή Τα προγράμματα των υπολογιστών είναι μαγεία εν δράσει. Το κάθε πρόγραμμα μοιάζει με ένα περίπλοκο, αλλά και καλαίσθητο, μαγικό ξόρκι. και το καλύτερο είναι ότι με την εκτέλεση ενός προγράμματος ανακαλύπτουμε ότι τελικά τα μάγια πιάνουν! Ακόμα και όταν το πρόγραμμά μας δεν κατορθώνει ακριβώς αυτό που είχαμε κατά νου, εντούτοις κάτι κατορθώνει πράγμα που σίγουρα δεν ισχύει για τα περισσότερα ξόρκια. Και η απόλαυση αυτής της έμπρακτης μαγείας είναι η δύναμη που ωθεί πολλούς αρχάριους στον προγραμματισμό, και που συνεχίζει να ανταμείβει τους έμπειρους προγραμματιστές. Ο συγγραφέας, τουλάχιστον, βιώνει αμείωτη αυτήν την απόλαυση εδώ και 20 χρόνια ενασχόλησης με τον προγραμματισμό. Το βιβλίο αυτό πραγματεύεται τις γλώσσες προγραμματισμού. Περιέχει διδακτικές εισαγωγές σε τρεις γλώσσες προγραμματισμού: την ML, την Java και την Prolog. 1 Οι γλώσσες αυτές είναι πολύ διαφορετικές μεταξύ τους, και αν γνωρίσετε έστω και ένα τμήμα καθεμίας από αυτές, θα έχετε τρία σαφώς διαφορετικά στίγματα στη διάθεσή σας για να «πλοηγηθείτε» στις αρχές των γλωσσών προγραμματισμού. Εάν θελήσετε να ασχοληθείτε και πρακτικά με αυτές τις γλώσσες, δεν θα δυσκολευτείτε καθόλου: υπάρχουν καλές και δωρεάν υλοποιήσεις και για τις τρεις τους, σε ποικιλία υπολογιστικών πλαισίων. Ανάμεσα στα διδακτικά κεφάλαια θα βρείτε κεφάλαια με περισσότερο φιλοσοφικό προσανατολισμό, τα οποία πραγματεύονται με πιο αφηρημένο τρόπο διάφορα σοβαρά ζητήματα που αφορούν τις γλώσσες προγραμματισμού. Αν και αυτά τα κεφάλαια έχουν πιο αφηρημένο χαρακτήρα, δεν απαιτούν ιδιαίτερο μαθηματικό υπόβαθρο. Οι γλώσσες προγραμματισμού στηρίζονται, βέβαια, σε πολύ ενδιαφέροντα και ιδιαίτερα κομψά μαθηματικά, αλλά προσφέρουν επίσης άφθονο υλικό μελέτης το οποίο δεν απαιτεί μαθηματικές γνώσεις δυσπρόσιτες ή και αδιάφορες σε πολλούς αναγνώστες. 1 Στα έντυπα εγχειρίδια των παλαιότερων γλωσσών, τα ονόματα των γλωσσών αναγράφονταν συνήθως με κεφαλαία γράμματα: FORTRAN, COBOL και BASIC. Στα νεώτερα εγχειρίδια, ακόμη και σε αυτά που αφορούν διαλέκτους των παλαιότερων γλωσσών, τα ονόματα αναγράφονται συνήθως σε μικτή γραφή: Fortran. Η σύμβαση που ακολουθούμε σε αυτό το βιβλίο είναι η εξής: για τα ονόματα που προφέρονται σαν λέξεις (π.χ. Java και Prolog) χρησιμοποιούμε μικτή γραφή, ενώ για τα ονόματα που προφέρονται σαν ακολουθίες γραμμάτων του αγγλικού αλφαβήτου (όπως η ML, που προφέρεται «εμ-ελ»), χρησιμοποιούμε κεφαλαιογράμματη γραφή.

2 ΚΕΦΑΛΑΙΟ 1 ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Πριν συνεχίσετε όμως, θα πρέπει να λάβετε υπ όψιν ότι το βιβλίο αυτό προϋποθέτει ικανοποιητική γνώση μίας τουλάχιστον γλώσσας προγραμματισμού, σε επίπεδο που αντιστοιχεί περίπου σε μια εισαγωγή διάρκειας δύο διδακτικών εξαμήνων. Δεν έχει σημασία ποια γλώσσα γνωρίζετε. Εάν όμως δεν έχετε προγραμματίσει ποτέ στη ζωή σας, τότε αυτό το βιβλίο δεν είναι ό,τι καταλληλότερο για να αρχίσετε. Στο υπόλοιπο αυτού του εισαγωγικού κεφαλαίου θα εξετάσουμε εκείνα τα στοιχεία που κάνουν τις γλώσσες προγραμματισμού ένα τόσο ενδιαφέρον θέμα: την εκπληκτική ποικιλία αυτών των γλωσσών, τις παράξενες αντιμαχίες που προκαλούν, την αξιοπερίεργη εξέλιξή τους, και τις πολλαπλές διασυνδέσεις τους με τους υπόλοιπους κλάδους της πληροφορικής. 1.2. Η εκπληκτική ποικιλία Ένα από τα στοιχεία που κάνουν τις γλώσσες προγραμματισμού τόσο γοητευτικό αντικείμενο μελέτης είναι η ποικιλομορφία τους. Ας ρίξουμε μια ματιά σε τέσσερεις γλώσσες που ανήκουν σε εντελώς ανόμοια είδη. οι τρεις από αυτές είναι οι βασικές γλώσσες με τις οποίες θα ασχοληθούμε σε αυτό το βιβλίο. Προστακτικές γλώσσες Ας δούμε ένα παράδειγμα προστακτικής γλώσσας, της γλώσσας C. Πρόκειται για μια συνάρτηση factorial(n), που υπολογίζει το παραγοντικό (factorial) ενός φυσικού αριθμού n: int factorial(int n) { int sofar = 1; while (n > 0) sofar *= n--; return sofar; } Το παραπάνω παράδειγμα περιέχει τις δύο «σφραγίδες γνησιότητας» κάθε προστακτικής γλώσσας: την τιμοδότηση και την επανάληψη. Η εντολή «sofar *= n--;» της γλώσσας C τιμοδοτεί τη μεταβλητή sofar. Η μεταβλητή αυτή έχει κάποια τρέχουσα τιμή η οποία μεταβάλλεται κάθε φορά που πραγματοποιείται μια τιμοδότηση. Η εντολή επιδρά επίσης στη μεταβλητή n, μειώνοντας κάθε φορά την τιμή της κατά μία μονάδα. Ο βρόχος «while» επαναλαμβάνει διαρκώς την εντολή. Τελικά, σε κάποιο βήμα αυτής της επανάληψης, η τρέχουσα τιμή της μεταβλητής n θα γίνει μηδέν, και η επανάληψη θα σταματήσει. Καθώς οι τιμές των μεταβλητών αλλάζουν σε κάθε βήμα, η σειρά εκτέλεσης των εντολών του προγράμματος έχει καίρια σημασία. Οι έννοιες που μόλις αναφέραμε είναι τόσο στοιχειώδεις, που περνούν απαρατήρητες από τους περισσότερους προγραμματιστές της γλώσσας C: για αυτούς είναι προφανές ότι η σειρά εκτέλεσης των εντολών παίζει καίριο ρόλο, και εξίσου προφανές ότι οι τιμές των μεταβλητών μεταβάλλονται. Υπάρχουν όμως πολλές γλώσσες προγραμ ματισμού για τις οποίες όλα τα παραπάνω δεν έχουν κανένα νόημα. γλώσσες στις οποίες δεν υπάρχουν ούτε τιμοδοτικές εντολές, ούτε επαναληπτικές εντολές, ούτε η έννοια της αλλαγής της «τρέχουσας τιμής» μιας μεταβλητής.

1.2 Η ΕΚΠΛΗΚΤΙΚΗ ΠΟΙΚΙΛΙΑ 3 Συναρτησιακές γλώσσες Ας δούμε την ίδια συνάρτηση (του παραγοντικού) υλοποιημένη στη γλώσσα ML: fun factorial x = if x <= 0 then 1 else x * factorial(x-1); Το παραπάνω παράδειγμα περιλαμβάνει δύο από τις «σφραγίδες γνησιότητας» των συναρτησιακών γλωσσών: την αναδρομή και τις μονότιμες μεταβλητές 2. Η αναδρομή είναι μια προγραμματιστική τεχνική τόσο φυσική στους προγραμματιστές της ML, όσο φυσικές είναι οι επαναληπτικές εντολές στους προγραμματιστές της C. Η ίδια συνάρτηση υλοποιημένη στη γλώσσα Lisp θα είχε ως εξής: (defun factorial (x) (if (<= x 0) 1 (* x (factorial (- x 1))))) Όπως βλέπετε, η Lisp έχει ιδιόρρυθμη σύνταξη. Αυτή η συντακτική διαφορά είναι όμως επιφανειακή. Σε βαθύτερο επίπεδο, η συνάρτηση factorial γραμμένη στη Lisp και η συνάρτηση factorial γραμμένη στην ML σχετίζονται μεταξύ τους πολύ περισσότερο απ όσο σχετίζεται η καθεμία από αυτές με τη συνάρτηση factorial γραμμένη στη γλώσσα C: και οι δύο είναι γραμμένες στο συναρτησιακό ύφος, χωρίς τιμοδοτικές ή επαναληπτικές εντολές. Τα δύο παραπάνω παραδείγματα ίσως φαίνονται πιο κομψά από την εκδοχή της C, αλλά μια τέτοια σύγκριση δεν είναι δίκαιη. Το συναρτησιακό είδος προγραμματισμού ταιριάζει ιδιαίτερα σε συναρτήσεις όπως αυτή του παραγοντικού. Σε άλλα είδη προβλημάτων, όπως π.χ. ο πολλαπλασιασμός πινάκων, το πλεονέκτημα θα το είχαν οι προστακτικές γλώσσες προγραμματισμού. Λογικοκεντρικές γλώσσες Η συνάρτηση του παραγοντικού, ενώ είναι το καταλληλότερο παράδειγμα για τη γλώσσα ML, είναι ίσως το χειρότερο για την Prolog. Παρά ταύτα ας δούμε τι μορφή έχει στην Prolog: factorial(x,1) :- X =:= 1. factorial(x,f) :- X > 1, NewX is X - 1, factorial(newx,newf), F is X * NewF. 2 Σ.τ.Μ.: Μεταβλητές από το variables όσο βέβαια τα συμφραζόμενα επιτρέπουν να ονομάζεται «μεταβλητή» κάτι που μένει σταθερό. Οι «μεταβλητές» των συναρτησιακών γλωσσών (όπως η ML) είναι ακριβέστερα επώνυμες σταθερές, γι αυτό ο σχετικός όρος της ML, που θα δοθεί αργότερα, είναι val από το value = τιμή και όχι var, από το variable = μεταβλητή.

4 ΚΕΦΑΛΑΙΟ 1 ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Οι πρώτες δύο γραμμές εκφράζουν έναν κανόνα που επιτρέπει στο σύστημα της Prolog να συμπεράνει ότι όταν το X ισούται με 1 το παραγοντικό του X είναι 1. Οι υπόλοιπες πέντε γραμμές κώδικα καθορίζουν έναν γενικό τρόπο για να διαπιστώνει κανείς ότι το παραγοντικό του X ισούται με κάποια δεδομένη τιμή. Συγκεκριμένα: «Για να αποδείξεις ότι το παραγοντικό του X ισούται με F, αρκεί να κάνεις τα εξής: να αποδείξεις ότι το X είναι μεγαλύτερο του 1. να αποδείξεις ότι το NewX είναι μικρότερο του X κατά 1. να αποδείξεις ότι το παραγοντικό του NewX ισούται με NewF. και τέλος να αποδείξεις ότι το F ισούται με X επί NewF». Η διατύπωση ενός προγράμματος μέσω κανόνων λογικού συμπερασμού είναι η «σφραγίδα γνησιότητας» του λογικού προγραμματισμού. Αν και αυτό το είδος προγραμματισμού δεν είναι το καταλληλότερο για τον υπολογισμό μαθηματικών συναρτήσεων, υπάρχουν κατηγορίες προβλημάτων στα οποία υπερέχει ξεκάθαρα. Παραδείγματα τέτοιων προβλημάτων θα δούμε από το Κεφάλαιο 19 και παρακάτω. Οντοστρεφείς γλώσσες Η συνάρτηση του παραγοντικού γραμμένη στη γλώσσα Java φαίνεται σχεδόν ίδια με την εκδοχή της στη γλώσσα C. Η Java όμως είναι μια οντοστρεφής γλώσσα, πράγμα που σημαίνει ότι αφ ενός είναι προστακτικού τύπου, και αφ ετέρου έχει σχεδιαστεί ώστε να διευκολύνει την επίλυση των διαφόρων προβλημάτων μέσω οντοτήτων (ή, αλλιώς, αντικειμένων). Ονομάζουμε οντότητα μια (συνήθως μικρή) δέσμη δεδομένων η οποία «γνωρίζει» πώς να χειρίζεται τον εαυτό της. Για παράδειγμα, ας δούμε τον ορισμό σε Java μιας οντότητας που φέρει έναν ακέραιο αριθμό, και «γνωρίζει» πώς να αναφέρει τόσο τον αριθμό αυτό, όσο και το παραγοντικό του. public class MyInteger { private int value; public MyInteger(int value) { this.value = value; } public int getvalue() { return value; } public MyInteger getfactorial() { return new MyInteger(factorial(value)); } private int factorial(int n) { int sofar = 1; while (n > 1) sofar *= n--; return sofar; } } Το παραπάνω παράδειγμα οντοστρεφούς προγραμματισμού φαίνεται φλύαρο σε σχέση με τα προηγούμενα, αλλά και πάλι η σύγκριση δεν είναι δίκαιη: ο οντοστρε

φής προγραμματισμός έχει σχεδιαστεί ώστε να διευκολύνει την οργανωμένη σύνταξη προγραμμάτων πολύ μεγάλου μεγέθους, και ως εκ τούτου δεν φανερώνει τα προτερήματά του σε παραδείγματα μικρού μεγέθους. Είδαμε λοιπόν παραδείγματα από τέσσερεις οικογένειες γλωσσών: τις προστακτικές (όπως η C), τις συναρτησιακές (όπως η ML), τις λογικοκεντρικές (όπως η Prolog), και τις οντοστρεφείς (όπως η Java). Κάθε γλώσσα προγραμματισμού μπορεί, με λίγη προσπάθεια, να καταταγεί σε κάποια από αυτές τις τέσσερεις κατηγορίες. Αυτές οι κατηγορίες δεν είναι όμως προσδιορισμένες με αυστηρότητα, και γι αυτό δεν είναι πάντοτε σαφές ποιoς είναι ο ορθότερος τρόπος ταξινόμησης μιας γλώσσας. Υπάρχουν πάμπολλες γλώσσες που κινούνται στα όρια μεταξύ των κατηγοριών αυτών. Στην πράξη συναντάμε περισσότερες κατηγορίες γλωσσών, όχι μόνο αυτές τις τέσσερεις. Οι διάφορες γλώσσες προγραμματισμού έχουν κατά καιρούς χαρακτηριστεί ως εφαρμοστικές, συγχρονικές, περιοριστικές, δηλωτικές, οριστικές, διαδικαστικές, σεναριογραφικές, μονοτιμοδοτικές και πάει λέγοντας. Μάλιστα, ορισμένες από αυτές είναι τόσο ιδιόμορφες που η ένταξή τους σε μια κατηγορία στερείται νοήματος. Ας εξετάσουμε π.χ. τη γλώσσα Forth. Ο προγραμματισμός της συνάρτησης του παραγοντικού σε αυτή τη γλώσσα θα είχε ως εξής: : FACTORIAL 1 SWAP BEGIN?DUP WHILE TUCK * SWAP 1- REPEAT ; Η Forth είναι μια στοιβoστρεφής γλώσσα, όπως λ.χ. η PostScript είναι σελιδοστρεφής. Η μονολεκτική εντολή SWAP της Forth εναλλάσσει τα δύο κορυφαία στοιχεία της στοίβας που διατηρεί η γλώσσα αυτή. Θα μπορούσαμε να αποκαλέσουμε την Forth προστακτική γλώσσα, αλλά αυτό δεν θα είχε ιδιαίτερο νόημα, καθώς έχει ελάχιστα κοινά στοιχεία με τις περισσότερες άλλες προστακτικές γλώσσες. Θεωρήστε επίσης την APL. Για να εκφραστεί η συνάρτηση παραγοντικού στη γλώσσα αυτή, αρκεί η παρακάτω έκφραση: / ι X Η APL φημίζεται για τη χρήση πάμπολλων ειδικών χαρακτήρων που απουσιάζουν από τα συνηθισμένα πληκτρολόγια. Η παραπάνω έκφραση δηλώνει ότι το X θα πρέπει να αναπτυχθεί σε μια ακολουθία διαδοχικών ακεραίων από το 1 έως το X, και όλοι αυτοί οι αριθμοί να πολλαπλασιαστούν μεταξύ τους. (Στην πράξη, δεν θα χρειαζόσασταν αυτήν την έκφραση, διότι στην APL μπορούμε να δηλώσουμε το παραγοντικό του X απλώς ως!x.) Θα μπορούσαμε να αποκαλέσουμε την APL συναρτησιακή γλώσσα, αλλά και πάλι δεν θα είχε νόημα: η APL έχει ελάχιστα κοινά σημεία με τις περισσότερες άλλες συναρτησιακές γλώσσες. 1.3. Οι παράξενες αντιμαχίες 1.3 ΟΙ ΠΑΡΑΞΕΝΕΣ ΑΝΤΙΜΑΧΙΕΣ 5 Υπάρχουν κάποια γνωστικά αντικείμενα που φαίνονται εκ του φυσικού τους αμφιλεγόμενα: η βιολογική εξέλιξη, η αρχική Μεγάλη Έκρηξη του σύμπαντος, η ανθρώπινη σεξουαλικότητα γενικά, οποιοδήποτε θέμα απασχολεί τακτικά την επιστημονική στήλη της εφημερίδας The New York Times είναι βέβαιο ότι θα προκαλέσει

6 ΚΕΦΑΛΑΙΟ 1 ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ πολλές αντιδικίες. Ισχύει όμως το ίδιο και για τις γλώσσες προγραμματισμού; Το δικό μας πεδίο μελέτης σπάνια διεισδύει μέχρι τα πρωτοσέλιδα των εφημερίδων, και είναι μάλλον ελάχιστοι αυτοί που το γνωρίζουν και που ενδιαφέρονται για αυτό. Παρά ταύτα, και παραδόξως, το θέμα των γλωσσών προγραμματισμού εγείρει συχνά θερμότατες διαμάχες. Κατ αρχάς, για κάθε γλώσσα προγραμματισμού θα βρείτε οπαδούς της πρόθυμους να υπερασπιστούν αυτήν την προτίμησή τους ενάντια σε κάθε άλλη γλώσσα. Μερικοί οπαδοί της ML «είναι στα μαχαίρια» με οπαδούς της γλώσσας Haskell. Οι οπαδοί της Forth θα πικραθούν, χωρίς πάντως να εκπλαγούν, όταν διαπιστώσουν ότι κρατούν άλλο ένα εγχειρίδιο που αγνοεί τη δική τους αγαπημένη γλώσσα. Διάφοροι οπαδοί της Prolog είναι αδύνατον να κατανοήσουν για ποιο λόγο ο λογικός προγραμματισμός δεν έχει υιοθετηθεί από όλους τους προγραμματιστές. Και υπάρχουν οπαδοί της Fortran πλήρως πεπεισμένοι ότι η δική τους προτίμηση δεν είναι μόνο η πρώτη ιστορικά, αλλά και η πρώτη σε σπουδαιότητα γλώσσα υψηλού επιπέδου. Ανάμεσα στους θιασώτες της ίδιας γλώσσας ανακύπτουν διαμάχες άλλου είδους. Τα πρότυπα των γλωσσών προγραμματισμού αναπτύσσονται συχνά μέσω διεθνών επιτροπών. Ποιοι είναι οι «εγγυητές», και ποιοι συμμετέχουν τελικά σε τέτοιες διαδικασίες αποφάσεων; Τι πρόκειται και τι δεν πρόκειται να συμπεριληφθεί στην επόμενη επίσημη έκδοση μιας γλώσσας; Η ανάπτυξη των προδιαγραφών για κάποια γλώσσα προγραμματισμού συχνά είναι διαδικασία εντυπωσιακά αργή, περίπλοκη και... μνησίκακη. Αυτό που ενδιαφέρει περισσότερο εμάς είναι οι συχνές διαφωνίες που αφορούν τους θεμελιώδεις ορισμούς. Έχουμε ήδη χρησιμοποιήσει τον όρο οντοστρεφής, ο οποίος είναι ένας από τους πιο έντονα αμφιλεγόμενους όρους. Ποιες ακριβώς ιδιότητες θα πρέπει να έχει μια γλώσσα ώστε να μπορεί να θεωρηθεί οντοστρεφής; Εμείς θα παρακάμψουμε αυτό το ερώτημα, παραθέτοντας μόνο μια άτυπη περιγραφή των οντοστρεφών γλωσσών. Θα αποφύγουμε γενικότερα να δώσουμε απολύτως αυστηρούς ορισμούς για τέτοιους αμφιλεγόμενους όρους, για δύο λόγους. Πρώτον, θα ήταν κάπως υποκριτικό να ισχυριστούμε ότι υπάρχει καν ορισμός, τη στιγμή που στην πραγματικότητα υπάρχουν πολλοί και ασύμβατοι ορισμοί. Και δεύτερον, διότι οι αυστηροί ορισμοί δεν θα είχαν πρακτική χρησιμότητα: ένας αυστηρός ορισμός λ.χ. για τον όρο «οντοστρεφής» απλώς θα πυροδοτούσε διαμάχες της μορφής: «η δική μου γλώσσα μου είναι οντοστρεφής ενώ η δική σου δεν είναι». Για τα ζητήματα που μας ενδιαφέρουν σε αυτό το βιβλίο, οι άτυπες περιγραφές είναι πιο χρήσιμες. Κάποιες γλώσσες είναι πράγματι πιο οντοστρεφείς από κάποιες άλλες, αλλά θα αφήσουμε τέτοια ζητήματα στη κρίση του αναγνώστη. 3 3 Στους μαθηματικούς κύκλους, η ανταλλαγή σκληρών αλλά και ασαφών επιχειρημάτων αποκαλείται συχνά «βατραχομυομαχία». Την έκφραση αυτή είχε χρησιμοποιήσει ως γνωστόν ο Albert Einstein για να χαρακτηρίσει μια έντονη διαμάχη μεταξύ των μαθηματικών David Hilbert και L.E.J. Brouwer, την οποία είχε αποκαλέσει στα γερμανικά «Frosch-Mäuse-Krieg» (δηλ. βατραχομυομαχία). Ο όρος προέρχεται από έναν γνωστό αρχαιοελληνικό μύθο: χρησιμοποιείται σε μια ελληνιστική παρωδία της Ιλιάδας που φέρει τον τίτλο Βατραχομυομαχία. Οι παράξενες αντιμαχίες στις γλώσσες προγραμματισμού ανήκουν συχνά στο είδος των βατραχομυομαχιών.