Εισαγωγή στον προγραμματισμό
Κεφ. 6 §6.1, 6.3–6.5, 6.7 · Γλώσσες, σχεδίαση, δομημένος προγραμματισμός, περιβάλλοντα
Ο επεξεργαστής του υπολογιστή σου καταλαβαίνει μόνο 0 και 1. Εσύ γράφεις ΓΡΑΨΕ 'Γεια'. Ποιος μεταφράζει; Και γιατί ένα πρόγραμμα γραμμένο «σωστά» μπορεί να μην τρέχει καθόλου;
Το κεφάλαιο 6 είναι σχεδόν αποκλειστικά θεωρία — δηλαδή εύκολες μονάδες στο Θέμα Α, αν ξέρεις με ακρίβεια τους όρους.
Η έννοια του προγράμματος
Πρόγραμμα είναι ένα σύνολο εντολών που πρέπει να δοθούν στον υπολογιστή για να υλοποιηθεί ένας αλγόριθμος. Ο αλγόριθμος περιγράφει τι πρέπει να γίνει· το πρόγραμμα τον γράφει σε μια γλώσσα προγραμματισμού, ώστε να μπορεί να εκτελεστεί.
Ο υπολογιστής εκτελεί μόνο εντολές γλώσσας μηχανής (ακολουθίες 0 και 1). Οι γλώσσες υψηλού επιπέδου, όπως η ΓΛΩΣΣΑ, είναι κοντά στην ανθρώπινη γλώσσα και ανεξάρτητες από τον υπολογιστή — γι' αυτό χρειάζονται μετάφραση πριν από την εκτέλεση.
Φυσικές και τεχνητές γλώσσες
Οι γλώσσες προγραμματισμού είναι τεχνητές γλώσσες. Κάθε γλώσσα (φυσική ή τεχνητή) ορίζεται από:
- Αλφάβητο: το σύνολο των στοιχείων (γράμματα, ψηφία, σύμβολα) που χρησιμοποιεί.
- Λεξιλόγιο: οι επιτρεπτές ακολουθίες στοιχείων του αλφαβήτου (λέξεις).
- Γραμματική: αποτελείται από την τυπολογία (τις επιτρεπτές μορφές των λέξεων) και το συντακτικό (τους κανόνες σύνθεσης των λέξεων σε προτάσεις/εντολές).
- Σημασιολογία: το νόημα κάθε λέξης και πρότασης.
Βασικές διαφορές: οι φυσικές γλώσσες εξελίσσονται συνεχώς και επιτρέπουν ασάφειες και πολυσημίες· οι τεχνητές έχουν αυστηρούς, σταθερούς κανόνες και κάθε εντολή έχει ένα μόνο νόημα. Ένα «ορθογραφικό» λάθος σε πρόγραμμα το κάνει να μη μεταφράζεται.
Ο κανόνας «η εντολή ΑΝ πρέπει να ακολουθείται από συνθήκη και τη λέξη ΤΟΤΕ» ανήκει:
Τεχνικές σχεδίασης προγραμμάτων
Ιεραρχική σχεδίαση (top-down): το πρόβλημα αναλύεται από πάνω προς τα κάτω σε όλο και απλούστερα τμήματα, με διαγράμματα που δείχνουν την ιεραρχία τους.
Τμηματικός προγραμματισμός: κάθε τμήμα της ιεραρχικής σχεδίασης υλοποιείται ως ανεξάρτητη ενότητα (υποπρόγραμμα), που γράφεται, ελέγχεται και διορθώνεται ξεχωριστά.
Δομημένος προγραμματισμός: κάθε πρόγραμμα γράφεται χρησιμοποιώντας μόνο τρεις δομές ελέγχου: την ακολουθία, την επιλογή και την επανάληψη. Κάθε τμήμα έχει μία είσοδο και μία έξοδο και αποφεύγεται η εντολή άλματος GOTO. Ο δομημένος προγραμματισμός ενσωματώνει και την ιεραρχική σχεδίαση και τον τμηματικό προγραμματισμό.
Πλεονεκτήματα του δομημένου προγραμματισμού:
- δημιουργία απλούστερων προγραμμάτων
- άμεση μεταφορά των αλγορίθμων σε προγράμματα
- διευκόλυνση της ανάλυσης του προγράμματος σε τμήματα
- περιορισμός των λαθών κατά την ανάπτυξη
- διευκόλυνση της ανάγνωσης και κατανόησης από τρίτους
- ευκολότερη διόρθωση και συντήρηση
Αντικειμενοστραφής προγραμματισμός
Στον αντικειμενοστραφή προγραμματισμό το πρόγραμμα οργανώνεται γύρω από αντικείμενα: οντότητες που συνδυάζουν δεδομένα (ιδιότητες) και λειτουργίες (μεθόδους) που επιδρούν σε αυτά. Η σχεδίαση ξεκινά από το «ποια αντικείμενα υπάρχουν στο πρόβλημα» και όχι από το «ποιες ενέργειες γίνονται». Τον γνωρίζεις αναλυτικά στο αντίστοιχο κεφάλαιο.
Προγραμματιστικά περιβάλλοντα
Για να εκτελεστεί ένα πρόγραμμα υψηλού επιπέδου πρέπει να μεταφραστεί σε γλώσσα μηχανής. Υπάρχουν δύο είδη μεταφραστών:
- Μεταγλωττιστής (compiler): μεταφράζει ολόκληρο το πρόγραμμα και παράγει ένα ισοδύναμο πρόγραμμα σε γλώσσα μηχανής· αν βρει συντακτικά λάθη, τα αναφέρει και δεν παράγει πρόγραμμα.
- Διερμηνευτής (interpreter): διαβάζει, μεταφράζει και εκτελεί μία προς μία τις εντολές. Είναι πιο αργός στην εκτέλεση, αλλά βολικός κατά την ανάπτυξη, γιατί τα λάθη φαίνονται αμέσως.
Από τον κώδικα στο εκτελέσιμο
- Με τον συντάκτη (editor) γράφουμε το πηγαίο πρόγραμμα (source).
- Ο μεταγλωττιστής το μεταφράζει στο αντικείμενο πρόγραμμα (object) — αν δεν υπάρχουν συντακτικά λάθη.
- Ο συνδέτης-φορτωτής (linker-loader) συνδέει το αντικείμενο πρόγραμμα με άλλα έτοιμα τμήματα (π.χ. βιβλιοθήκες) και παράγει το εκτελέσιμο πρόγραμμα.
Τα σύγχρονα προγραμματιστικά περιβάλλοντα ενσωματώνουν σε ένα ενιαίο εργαλείο συντάκτη, μεταφραστή, συνδέτη και εργαλεία εκσφαλμάτωσης.
Ποιο πρόγραμμα παράγει ο συνδέτης-φορτωτής;
Παράδειγμα 1: Αντιστοίχισε κάθε εργαλείο με αυτό που παράγει ή κάνει: (1) συντάκτης, (2) μεταγλωττιστής, (3) συνδέτης-φορτωτής, (4) διερμηνευτής.
Λύση:
- (1) Συντάκτης → γράφουμε και αποθηκεύουμε το πηγαίο πρόγραμμα.
- (2) Μεταγλωττιστής → παράγει το αντικείμενο πρόγραμμα (ή λίστα συντακτικών λαθών).
- (3) Συνδέτης-φορτωτής → παράγει το εκτελέσιμο πρόγραμμα.
- (4) Διερμηνευτής → εκτελεί απευθείας εντολή προς εντολή, χωρίς να παράγει εκτελέσιμο αρχείο.
Θέμα τύπου Πανελλαδικών: Να χαρακτηρίσετε ως Σωστή ή Λάθος κάθε πρόταση.
- Ο διερμηνευτής παράγει αντικείμενο πρόγραμμα.
- Ο δομημένος προγραμματισμός χρησιμοποιεί μόνο τρεις δομές ελέγχου.
- Οι τεχνητές γλώσσες εξελίσσονται συνεχώς, όπως οι φυσικές.
- Η σημασιολογία αφορά το νόημα των εντολών.
- Το εκτελέσιμο πρόγραμμα εκτελείται πιο γρήγορα από την εκτέλεση μέσω διερμηνευτή.
Λύση: 1. Λάθος (το αντικείμενο το παράγει ο μεταγλωττιστής) · 2. Σωστό (ακολουθία, επιλογή, επανάληψη) · 3. Λάθος (έχουν αυστηρούς, σταθερούς κανόνες) · 4. Σωστό · 5. Σωστό (έχει ήδη μεταφραστεί ολόκληρο).
Ποια πρόταση για τον δομημένο προγραμματισμό είναι σωστή;
Παράδειγμα 2: Η φράση «Είδα τον φίλο μου με τα κιάλια» έχει δύο νοήματα: είτε κοίταξα με κιάλια, είτε ο φίλος μου κρατούσε κιάλια. Γιατί κάτι τέτοιο δεν επιτρέπεται σε μια γλώσσα προγραμματισμού;
Λύση: Στις φυσικές γλώσσες η πολυσημία λύνεται από τα συμφραζόμενα και την κοινή λογική του ακροατή. Ο υπολογιστής δεν έχει κοινή λογική: εκτελεί μηχανικά. Αν μια εντολή είχε δύο νοήματα, το αποτέλεσμα θα ήταν απρόβλεπτο — θα παραβιαζόταν η καθοριστικότητα. Γι' αυτό οι τεχνητές γλώσσες έχουν αυστηρό συντακτικό και μονοσήμαντη σημασιολογία: για παράδειγμα, στην έκφραση 2 + 3 * 4 η ιεραρχία των πράξεων ορίζει ότι γίνεται πρώτα ο πολλαπλασιασμός, άρα το αποτέλεσμα είναι πάντα 14.
Το 1966 οι Corrado Böhm και Giuseppe Jacopini απέδειξαν ότι κάθε πρόγραμμα μπορεί να γραφτεί μόνο με ακολουθία, επιλογή και επανάληψη. Δύο χρόνια αργότερα, το 1968, ο Edsger Dijkstra δημοσίευσε το περίφημο άρθρο «Go To Statement Considered Harmful», που έγινε το μανιφέστο του δομημένου προγραμματισμού.
Η αλυσίδα των προγραμμάτων: Πηγαίο → Αντικείμενο → Εκτελέσιμο («ΠΑΕ» πάμε!), με εργαλεία συντάκτη → μεταγλωττιστή → συνδέτη-φορτωτή. Ο διερμηνευτής «παρακάμπτει» την αλυσίδα: μεταφράζει και εκτελεί μαζί.
Ένα πρόγραμμα 10.000 εντολών θα εκτελείται καθημερινά από χιλιάδες χρήστες, χωρίς αλλαγές, για χρόνια. Ένα άλλο, 30 εντολών, γράφεται τώρα από έναν μαθητή που το διορθώνει συνεχώς. Ποιον τύπο μεταφραστή θα διάλεγες για το καθένα και γιατί;
Δοκίμασε πρώτα μόνος σου — μετά δες τη λύση
Για το πρώτο, μεταγλωττιστή: η μετάφραση γίνεται μία φορά και μετά κάθε εκτέλεση του εκτελέσιμου είναι γρήγορη, χωρίς ξανά μετάφραση. Για το δεύτερο, διερμηνευτή: ο μαθητής βλέπει αμέσως το αποτέλεσμα κάθε αλλαγής και το σημείο του λάθους, χωρίς κάθε φορά ολόκληρη μεταγλώττιση και σύνδεση· η πιο αργή εκτέλεση δεν έχει σημασία σε 30 εντολές.
- Σύγχυση αντικείμενου (από τον μεταγλωττιστή) με εκτελέσιμο (από τον συνδέτη-φορτωτή) πρόγραμμα.
- «Ο διερμηνευτής είναι ταχύτερος στην εκτέλεση.» Λάθος: ο μεταγλωττισμένος κώδικας εκτελείται ταχύτερα.
- Σύγχυση συντακτικού (μορφή) με σημασιολογία (νόημα).
- Αναφορά του αντικειμενοστραφή ως «τέταρτης δομής ελέγχου» του δομημένου προγραμματισμού.
- Πρόγραμμα: σύνολο εντολών που υλοποιεί έναν αλγόριθμο σε γλώσσα προγραμματισμού.
- Γλώσσα: αλφάβητο, λεξιλόγιο, γραμματική (τυπολογία, συντακτικό), σημασιολογία.
- Ιεραρχική σχεδίαση → τμηματικός → δομημένος προγραμματισμός (ακολουθία, επιλογή, επανάληψη, χωρίς GOTO).
- Αντικειμενοστραφής: το πρόγραμμα οργανώνεται γύρω από αντικείμενα με δεδομένα και μεθόδους.
- Συντάκτης → πηγαίο, μεταγλωττιστής → αντικείμενο, συνδέτης-φορτωτής → εκτελέσιμο· ο διερμηνευτής εκτελεί εντολή προς εντολή.