Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά...

30

Transcript of Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά...

Page 1: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα
Page 2: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα
Page 3: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα

Περιεχόμενα

Κεφάλαιο 0 Εισαγωγή ....................................................................... 21

0.1 Ο ρόλος των αλγορίθμων................................................................. 22

0.2 Η ιστορική εξέλιξη των υπολογιστικών μηχανών ........................... 25

0.3 Η επιστήμη των αλγορίθμων............................................................ 30

0.4 Αφαίρεση.......................................................................................... 33

0.5 Μια περιγραφή της μελέτης μας ...................................................... 34

0.6 Κοινωνικές επιπτώσεις..................................................................... 36

Κεφάλαιο 1 Αποθήκευση δεδομένων .............................................. 43

1.1 Τα μπιτ και ο τρόπος που αποθηκεύονται........................................ 44

1.2 Κύρια μνήμη..................................................................................... 53

1.3 Αποθηκευτικά μέσα ......................................................................... 57

1.4 Αναπαράσταση πληροφοριών ως σχημάτων μπιτ ........................... 66

*1.5 Το δυαδικό σύστημα ........................................................................ 75

*1.6 Αποθήκευση ακεραίων..................................................................... 81

*1.7 Αποθήκευση κλασμάτων ................................................................. 90

*1.8 Συμπίεση δεδομένων........................................................................ 95

*1.9 Σφάλματα επικοινωνίας ................................................................. 103

Κεφάλαιο 2 Χειρισμός δεδομένων ................................................. 119

2.1 Αρχιτεκτονική υπολογιστών .......................................................... 120

2.2 Γλώσσα μηχανής ............................................................................ 123

2.3 Εκτέλεση προγράμματος................................................................ 131

*2.4 Αριθμητικές λογικές εντολές ......................................................... 140

* Οι αστερίσκοι υποδεικνύουν προτάσεις για προαιρετικές ενότητες

Page 4: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα

ΠΕΡΙΕΧΟΜΕΝΑ

18

18

*2.5 Επικοινωνία με άλλες συσκευές .................................................... 146

*2.6 Άλλες αρχιτεκτονικές..................................................................... 152

Κεφάλαιο 3 Λειτουργικά συστήματα............................................. 167

3.1 Ιστορικό των λειτουργικών συστημάτων....................................... 168

3.2 Αρχιτεκτονική λειτουργικών συστημάτων .................................... 173

3.3 Συντονισμός των δραστηριοτήτων του υπολογιστή ...................... 183

*3.4 Χειρισμός ανταγωνισμού μεταξύ διεργασιών ............................... 187

3.5 Ασφάλεια........................................................................................ 194

Κεφάλαιο 4 Δικτύωση και Διαδίκτυο ............................................ 207

4.1 Βασικές αρχές δικτύων .................................................................. 208

4.2 Το Διαδίκτυο .................................................................................. 220

4.3 Ο Παγκόσμιος Ιστός....................................................................... 232

*4.4 Διαδικτυακά πρωτόκολλα .............................................................. 244

4.5 Ασφάλεια........................................................................................ 253

Κεφάλαιο 5 Αλγόριθμοι ................................................................... 273

5.1 Η έννοια του αλγορίθμου............................................................... 274

5.2 Αναπαράσταση αλγορίθμων .......................................................... 278

5.3 Επινόηση αλγορίθμων.................................................................... 287

5.4 Δομές επανάληψης ......................................................................... 295

5.5 Αναδρομικές δομές ........................................................................ 308

5.6 Αποδοτικότητα και ορθότητα ........................................................ 318

Κεφάλαιο 6 Γλώσσες προγραμματισμού...................................... 341

6.1 Ιστορική εξέλιξη............................................................................. 342

6.2 Παραδοσιακές έννοιες προγραμματισμού ..................................... 353

6.3 Διαδικασιακές μονάδες .................................................................. 368

6.4 Υλοποίηση γλώσσας ...................................................................... 377

6.5 Αντικειμενοστρεφής προγραμματισμός......................................... 388

*6.6 Προγραμματισμός ταυτόχρονων δραστηριοτήτων ........................ 397

*6.7 Δηλωτικός προγραμματισμός ........................................................ 400

Page 5: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα

ΠΕΡΙΕΧΟΜΕΝΑ

19

19

Κεφάλαιο 7 Τεχνολογία λογισμικού............................................... 417

7.1 Ο τομέας της τεχνολογίας λογισμικού........................................... 418

7.2 Ο κύκλος ζωής λογισμικού ............................................................ 422

7.3 Μεθοδολογίες τεχνολογίας λογισμικού ......................................... 427

7.4 Τμηματικότητα............................................................................... 430

7.5 Εργαλεία της δουλειάς ................................................................... 440

7.6 Διασφάλιση ποιότητας ................................................................... 451

7.7 Τεκμηρίωση.................................................................................... 455

7.8 Η διασύνδεση ανθρώπου-μηχανής................................................. 457

7.9 Ιδιοκτησία και ευθύνη λογισμικού................................................. 461

Κεφάλαιο 8 Αφαίρεση δεδομένων ................................................. 475

8.1 Βασικές δομές δεδομένων.............................................................. 476

8.2 Σχετικές έννοιες ............................................................................. 481

8.3 Υλοποίηση δομών δεδομένων ....................................................... 484

8.4 Μια σύντομη μελέτη περίπτωσης .................................................. 502

8.5 Προσαρμοσμένοι τύποι δεδομένων ............................................... 509

*8.6 Κλάσεις και αντικείμενα ................................................................ 513

*8.7 Δείκτες σε γλώσσα μηχανής .......................................................... 515

Κεφάλαιο 9 Συστήματα βάσεων δεδομένων................................. 529

9.1 Βασικές αρχές βάσεων δεδομένων ................................................ 530

9.2 Το σχεσιακό μοντέλο ..................................................................... 536

*9.3 Αντικειμενοστρεφείς βάσεις δεδομένων........................................ 550

*9.4 Διατήρηση της ακεραιότητας μιας βάσης δεδομένων ................... 554

*9.5 Παραδοσιακές δομές αρχείων........................................................ 559

9.6 Εξόρυξη δεδομένων ....................................................................... 569

9.7 Κοινωνικές επιπτώσεις της τεχνολογίας

των βάσεων δεδομένων.................................................................. 573

Κεφάλαιο 10 Γραφικά υπολογιστή .................................................. 585

10.1 Η εμβέλεια των γραφικών υπολογιστή .......................................... 586

10.2 Επισκόπηση των τριδιάστατων γραφικών ..................................... 589

10.3 Μοντελοποίηση.............................................................................. 591

10.4 Απόδοση εικόνας............................................................................ 603

*10.5 Χειρισμός καθολικού φωτισμού .................................................... 617

10.6 Κινούμενα γραφικά ........................................................................ 621

Page 6: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα

ΠΕΡΙΕΧΟΜΕΝΑ

20

20

Κεφάλαιο 11 Τεχνητή νοημοσύνη................................................... 633

11.1 Νοημοσύνη και μηχανές ................................................................ 634

11.2 Αντίληψη........................................................................................ 641

11.3 Συλλογισμός ................................................................................... 649

11.4 Άλλοι τομείς έρευνας ..................................................................... 663

11.5 Τεχνητά νευρωνικά δίκτυα............................................................. 669

11.6 Ρομποτική....................................................................................... 680

11.7 Αναμετρώντας τις συνέπειες.......................................................... 683

Κεφάλαιο 12 Θεωρία υπολογισμών ................................................ 697

12.1 Συναρτήσεις και ο υπολογισμός τους ............................................ 698

12.2 Μηχανές Turing ............................................................................. 701

12.3 Καθολικές γλώσσες προγραμματισμού ......................................... 706

12.4 Μια μη υπολογίσιμη συνάρτηση.................................................... 714

12.5 Πολυπλοκότητα προβλημάτων ...................................................... 720

*12.6 Κρυπτογραφία δημόσιου κλειδιού................................................. 732

Παραρτήματα ........................................................................................ 747

Α Πίνακας ASCII............................................................................... 749

Β Κυκλώματα για το χειρισμό των αναπαραστάσεων

συμπληρώματος ως προς δύο......................................................... 751

Γ Μια απλή γλώσσα μηχανής............................................................ 755

Δ Γλώσσες προγραμματισμού υψηλού επιπέδου .............................. 759

Ε Ισοδυναμία επαναληπτικών και αναδρομικών δομών................... 763

ΣΤ Απαντήσεις στις ερωτήσεις και τις ασκήσεις ................................ 767

Ευρετήριο .............................................................................................. 821

Page 7: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα

Πρόλογος Το βιβλίο αυτό αποτελεί µια εισαγωγή στην επιστήµη των υπολογιστών. Εξε-ρευνά το εύρος του αντικειµένου ενώ παράλληλα διαθέτει το βάθος που χρειά-ζεται για να προσφέρει µια αληθινή κατανόηση των σχετικών θεµάτων.

Κοινό Έγραψα αυτό το βιβλίο τόσο για τους φοιτητές της επιστήµης των υπολογιστών όσο και για σπουδαστές άλλων τοµέων. Οι περισσότεροι φοιτητές που ειδικεύο-νται στην επιστήµη των υπολογιστών ξεκινούν τις σπουδές τους µε την ψευδαί-σθηση ότι επιστήµη των υπολογιστών είναι µόνο προγραµµατισµός, περιηγή-σεις στον Παγκόσµιο Ιστό, και διαµοιρασµός αρχείων µέσω ∆ιαδικτύου, αφού αυτά είναι όλα όσα ουσιαστικά έχουν δει. Ωστόσο, η επιστήµη των υπολογι-στών είναι πολλά περισσότερα. Συνεπώς, οι αρχάριοι σπουδαστές της επιστήµης των υπολογιστών πρέπει να γνωρίσουν το εύρος του αντικειµένου στο οποίο σκοπεύουν να ειδικευτούν. Η γνωριµία αυτή αποτελεί το θέµα του παρόντος βι-βλίου. Το βιβλίο παρέχει στους σπουδαστές µια επισκόπηση της επιστήµης των υπολογιστών — ένα υπόβαθρο από το οποίο µπορούν να εκτιµήσουν τη συνά-φεια και τις σχέσεις µεταξύ των µελλοντικών µαθηµάτων στο πεδίο. Αυτή η προσέγγιση αποτελεί, για την ακρίβεια, το µοντέλο που χρησιµοποιείται στα ει-σαγωγικά µαθήµατα των φυσικών επιστηµών.

Στην τεχνοκρατούµενη κοινωνία όπου ζούµε, αυτό το ευρύ υπόβαθρο είναι επίσης απαραίτητο σε σπουδαστές άλλων τοµέων. Ένα µάθηµα της επιστήµης των υπολογιστών για αυτό το κοινό πρέπει να παρέχει µια πρακτική, ρεαλιστική κατανόηση ολόκληρου του πεδίου, και να µην αποτελεί απλώς µια εισαγωγή στη χρήση του ∆ιαδικτύου ή µια απλή εκγύµναση στη χρήση κάποιων δηµοφι-λών πακέτων λογισµικού. Η εκγύµναση, φυσικά, έχει τη δική της θέση σε αυτόν το χώρο, αλλά το παρόν βιβλίο αφορά την εκπαίδευση. Όπως λέει µια παλιά κι-νεζική παροιµία: “∆ώσε σε κάποιον ένα ψάρι και τον ταΐζεις για µία µέρα. Μά-θε του να ψαρεύει και τον ταΐζεις για ολόκληρη τη ζωή του”.

Έτσι, σηµαντικός στόχος κατά τη συγγραφή αυτού του βιβλίου ήταν να µεί-νει προσιτό σε µη τεχνικούς σπουδαστές. Το αποτέλεσµα είναι ότι οι προηγού-µενες εκδόσεις χρησιµοποιήθηκαν µε επιτυχία σε µαθήµατα για σπουδαστές οι οποίοι προέρχονταν από ένα µεγάλο εύρος τοµέων και επιπέδων εκπαίδευσης,

Page 8: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα

ΠΡΟΛΟΓΟΣ

8

8

από λύκεια µέχρι πανεπιστηµιακά µεταπτυχιακά προγράµµατα. Η παρούσα έκ-δοση είναι σχεδιασµένη για να συνεχίσει αυτή την παράδοση.

Νέα στοιχεία της δέκατης έκδοσης Η σηµαντικότερη αλλαγή που περιέχει αυτή η δέκατη έκδοση είναι ένα νέο κε-φάλαιο σχετικό µε τα γραφικά υπολογιστή (Κεφάλαιο 10). Το µεγαλύτερο µέ-ρος του κεφαλαίου αυτού εστιάζεται στον τοµέα των τριδιάστατων γραφικών, ο οποίος αφορά την κωδικοποίηση αφηρηµένων µοντέλων τριδιάστατων κόσµων µε σκοπό τη χρήση τους στην παραγωγή διδιάστατων εικόνων. Το υποκείµενο θέµα του κεφαλαίου είναι η περιγραφή της τεχνολογίας που χρησιµοποιείται σε βιντεοπαιχνίδια και τη σηµερινή κινηµατογραφική βιοµηχανία. Γενικότερα, το κεφάλαιο παρέχει ένα υπόβαθρο για την κατανόηση του εξελισσόµενου πεδίου της εικονικής πραγµατικότητας. Απόλαυσα τη συγγραφή αυτού του υλικού, και ελπίζω να το βρείτε πληροφοριακό και διασκεδαστικό.

Σηµαντικές αλλαγές θα συναντήσετε επίσης στο Κεφάλαιο 4 (∆ικτύωση και ∆ιαδίκτυο) και στο Κεφάλαιο 7 (Τεχνολογία λογισµικού). Πιο συγκεκριµένα, µεγάλο µέρος του υλικού σχετικά µε τη δικτύωση έχει ενηµερωθεί, ενώ η περι-γραφή της δοµής του ∆ιαδικτύου έχει ξαναγραφτεί από τη σύγχρονη οπτική των παροχέων υπηρεσιών ∆ιαδικτύου (και όχι από την οπτική των διασυνδεδεµένων περιοχών). Όσον αφορά το Κεφάλαιο 7, εκτός από µια γενική ενηµέρωση το κεφάλαιο περιλαµβάνει τώρα µια ενότητα µε θέµα τη διασύνδεση ανθρώπου-µηχανής.

Αυτή η δέκατη έκδοση περιέχει άλλη µία αλλαγή, η οποία, αν και λεπτή, ί-σως είναι ακόµα πιο σηµαντική από αυτές που αναφέρθηκαν πιο πάνω. Έχει σχέση µε τον τρόπο που γράφτηκε το κείµενο. Ειδικότερα, για τη δηµιουργία αυτής της δέκατης έκδοσης υπήρξαν πολλοί άλλοι συγγραφείς που δάνεισαν την πείρα τους στα αντίστοιχα πεδία όπου ειδικεύονται. Θα τους αναγνωρίσετε ως συγγραφείς γνωστών και ιδιαίτερα σεβαστών κειµένων στην εκτενή συλλογή της Addison-Wesley µε τα εγχειρίδια της επιστήµης των υπολογιστών. Είναι οι εξής: Ed Angel (γραφικά υπολογιστή), John Carpinelli (αρχιτεκτονική υπολογι-στών), Chris Fox (τεχνολογία λογισµικού), Jim Kurose (δικτύωση και ∆ιαδί-κτυο), Gary Nutt (λειτουργικά συστήµατα), Greg Riccardi (συστήµατα βάσεων δεδοµένων), και Patrick Henry Winston (τεχνητή νοηµοσύνη). Αν και η έκταση της βοήθειας που προσέφερε κάθε συγγραφέας διέφερε, κάθε συνεισφορά συνέ-βαλε σηµαντικά στην ποιότητα του τελικού χειρογράφου. Ήταν µεγάλη µου τι-µή και είµαι σε όλους τους βαθιά ευγνώµων. Μετά από αυτή την αναγνώριση, θα πρέπει να πω και το εξής. Το τελικό περιεχόµενο και η παιδαγωγική φιλοσο-φία του κειµένου δεν αντικατοπτρίζει απαραιτήτως τις απόψεις όσων συνέβαλαν µε τις ιδέες τους. Ειδικότερα, αναλαµβάνω την πλήρη ευθύνη για σφάλµατα και απόψεις (τόσο δεδηλωµένες όσο και υπονοούµενες) που ίσως συναντήσετε στις ακόλουθες σελίδες.

Page 9: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα

ΟΡΓΑΝΩΣΗ

9

Οργάνωση Το βιβλίο ακολουθεί µια συνθετική διάταξη των θεµάτων, η οποία εξελίσσεται από το συγκεκριµένο στο αφηρηµένο. Με άλλα λόγια, ακολουθεί µια σειρά της οποίας το αποτέλεσµα είναι µια σωστή παιδαγωγική παρουσίαση όπου κάθε θέ-µα οδηγεί στο επόµενο. Ξεκινάει µε τις βασικές έννοιες της κωδικοποίησης πληροφοριών, της αποθήκευσης δεδοµένων, και της αρχιτεκτονικής των υπολο-γιστών (Κεφάλαια 1 και 2), συνεχίζει µε τη µελέτη των λειτουργικών συστηµά-των (Κεφάλαιο 3) και των δικτύων υπολογιστών (Κεφάλαιο 4), εξερευνά τα ζη-τήµατα των αλγορίθµων, των γλωσσών προγραµµατισµού, και της διαδικασίας ανάπτυξης λογισµικού (Κεφάλαια 5 έως 7), ασχολείται µε τεχνικές για τη βελ-τίωση της δυνατότητας πρόσβασης σε πληροφορίες (Κεφάλαια 8 και 9), εξετά-ζει ορισµένες σηµαντικές εφαρµογές της τεχνολογίας υπολογιστών µέσω των τοµέων των γραφικών (Κεφάλαιο 10) και της τεχνητής νοηµοσύνης (Κεφάλαιο 11), και κλείνει µε µια εισαγωγή στην αφηρηµένη θεωρία υπολογισµών (Κεφά-λαιο 12).

Αν και το κείµενο ακολουθεί αυτή τη φυσική διαδοχή, τα µεµονωµένα κε-φάλαια και ενότητες έχουν εξαιρετικά υψηλό βαθµό ανεξαρτησίας, και µπορούν να διαβαστούν ως ξεχωριστές µονάδες ή να αναδιαταχθούν ώστε να σχηµατί-σουν εναλλακτικές ακολουθίες µελέτης. Πράγµατι, το βιβλίο χρησιµοποιείται συχνά σε µαθήµατα τα οποία καλύπτουν την ύλη µε διάφορες σειρές. Μία από αυτές τις εναλλακτικές σειρές ξεκινάει µε το υλικό των Κεφαλαίων 5 και 6 (Αλ-γόριθµοι και Γλώσσες Προγραµµατισµού) και επιστρέφει στα προηγούµενα κε-φάλαια κατ' επιλογή. Από την άλλη, γνωρίζω ένα µάθηµα που ξεκινάει µε την ύλη της υπολογισιµότητας του Κεφαλαίου 12. Σε άλλες περιπτώσεις, το βιβλίο χρησιµοποιείται σε προχωρηµένα µαθήµατα όπου έχει απλώς το ρόλο ενός κε-ντρικού σκελετού από τον οποίο οι φοιτητές διακλαδίζονται σε προγράµµατα διαφορετικών τοµέων. Μαθήµατα για λιγότερο τεχνικά ακροατήρια θα µπορού-σαν να επικεντρωθούν στα Κεφάλαια 4 (∆ικτύωση και ∆ιαδίκτυο), 9 (Συστήµα-τα βάσεων δεδοµένων), 10 (Γραφικά υπολογιστή), και 11 (Τεχνητή νοηµοσύ-νη).

Στην αρχική σελίδα κάθε κεφαλαίου έχω χρησιµοποιήσει αστερίσκους για να επισηµάνω ορισµένες ενότητες ως προαιρετικές. Αυτές οι ενότητες καλύ-πτουν θέµατα πιο ειδικού ενδιαφέροντος ή ίσως εξερευνούν παραδοσιακά θέµα-τα σε µεγαλύτερο βάθος. Πρόθεσή µου είναι απλώς να παράσχω προτάσεις για εναλλακτικές διαδροµές µέσα στο βιβλίο. Υπάρχουν, φυσικά, άλλοι συντοµότε-ροι δρόµοι. Συγκεκριµένα, αν αναζητάτε µια γρήγορη ανάγνωση, προτείνω την ακόλουθη σειρά:

Page 10: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα

ΠΡΟΛΟΓΟΣ

10

10

Ενότητα Θέµα 1.1–1.4 Βασικές έννοιες κωδικοποίησης και αποθήκευσης δεδοµένων 2.1–2.3 Αρχιτεκτονική µηχανών και γλώσσα µηχανής 3.1–3.3 Λειτουργικά συστήµατα 4.1–4.3 ∆ικτύωση και ∆ιαδίκτυο 5.1–5.4 Αλγόριθµοι και σχεδιασµός τους 6.1–6.4 Γλώσσες προγραµµατισµού 7.1–7.2 Τεχνολογία λογισµικού 8.1–8.3 Αφαίρεση δεδοµένων 9.1–9.2 Συστήµατα βάσεων δεδοµένων 10.1–10.2 Γραφικά υπολογιστή 11.1–11.3 Τεχνητή νοηµοσύνη 12.1–12.2 Θεωρία υπολογισµών

Στο κείµενο υπάρχουν συνυφασµένα διάφορα ζητήµατα. Ένα από αυτά είναι ότι η επιστήµη των υπολογιστών συνιστά δυναµικό τοµέα. Το βιβλίο παρουσιάζει συνεχώς θέµατα από µια ιστορική οπτική γωνία, περιγράφει τις τελευταίες εξε-λίξεις, και υποδεικνύει κατευθύνσεις της τρέχουσας έρευνας. Άλλο ένα θέµα εί-ναι ο ρόλος της αφαίρεσης και ο τρόπος µε τον οποίο χρησιµοποιούνται τα α-φηρηµένα εργαλεία για τον έλεγχο της πολυπλοκότητας. Το θέµα αυτό παρου-σιάζεται στο Κεφάλαιο 0 και κατόπιν επαναλαµβάνεται στο πλαίσιο της αρχιτε-κτονικής των λειτουργικών συστηµάτων, της δικτύωσης, της ανάπτυξης αλγο-ρίθµων, του σχεδιασµού γλωσσών προγραµµατισµών, της τεχνολογίας λογισµι-κού, της οργάνωσης δεδοµένων, και των γραφικών υπολογιστή.

Προς τους καθηγητές Το παρόν βιβλίο περιέχει παραπάνω ύλη από αυτή που θα µπορούσε κανονικά να καλυφθεί σε ένα εξάµηνο, έτσι µη διστάσετε να προσπεράσετε θέµατα που δεν ταιριάζουν µε τους στόχους του µαθήµατός σας, ή να αναδιατάξετε τη σειρά όπως σας βολεύει. Θα διαπιστώσετε ότι, παρόλο που το κείµενο ακολουθεί µια λογική διαδοχή, τα θέµατα καλύπτονται µε πολύ ανεξάρτητο τρόπο ο οποίος σάς επιτρέπει να επιλέξετε αυτό που θέλετε. Έγραψα το βιβλίο µε σκοπό να χρησιµοποιηθεί ως πηγή πόρων για ένα µάθηµα, όχι ως ορισµός του. Εγώ προ-σωπικά προτιµώ να καλύπτω κάποια θέµατα µε τη µορφή εργασιών ανάγνωσης και να ενθαρρύνω τους σπουδαστές να διαβάσουν το υλικό που δεν περιλαµβά-νεται στο µάθηµά µου. Νοµίζω ότι υποτιµάµε τους σπουδαστές αν πιστεύουµε ότι τα πάντα πρέπει να εξηγούνται στην τάξη. Οι σπουδαστές θα πρέπει να βοη-θηθούν ώστε να µάθουν πώς να µελετούν µόνοι τους.

Αισθάνοµαι υποχρεωµένος να πω µερικά πράγµατα για τη συνθετική οργά-νωση που ακολουθεί το βιβλίο, από τις συγκεκριµένες προς τις αφηρηµένες έν-νοιες. Πιστεύω ότι ως ακαδηµαϊκοί συχνά θεωρούµε πως οι σπουδαστές θα ε-κτιµήσουν την οπτική γωνία µας για ένα θέµα — την οποία συχνά έχουµε ανα-πτύξει µετά από πολλά χρόνια εργασίας σε κάποιο πεδίο. Ως εκπαιδευτικοί, έχω

Page 11: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα

ΠΡΟΣ ΤΟΥΣ ΚΑΘΗΓΗΤΕΣ

11

τη γνώµη ότι είναι καλύτερα να παρουσιάζουµε την ύλη από την οπτική γωνία του σπουδαστή. Αυτός είναι ο λόγος που το βιβλίο ξεκινάει µε την αναπαρά-σταση και την αποθήκευση δεδοµένων, την αρχιτεκτονική της µηχανής, τα λει-τουργικά συστήµατα, και τη δικτύωση. Πρόκειται για θέµατα τα οποία αφορούν τους σπουδαστές — είναι πολύ πιθανό να έχουν ακούσει όρους όπως JPEG και MP3, να έχουν γράψει δεδοµένα σε CD και DVD, να έχουν αγοράσει εξαρτήµα-τα υπολογιστών, να έχουν αλληλεπιδράσει µε ένα λειτουργικό σύστηµα, και να έχουν χρησιµοποιήσει το ∆ιαδίκτυο. Ξεκινώντας το µάθηµα µε αυτά τα θέµατα, έχω δει τους σπουδαστές µου να ανακαλύπτουν απαντήσεις για πολλά από ερω-τήµατα που τους απασχολούσαν για χρόνια, και επίσης να µαθαίνουν να βλέ-πουν το µάθηµα περισσότερο ως πρακτικό παρά ως θεωρητικό. Ξεκινώντας από αυτό το σηµείο εκκίνησης, µπορούµε κατόπιν να προχωρήσουµε στα περισσό-τερο αφηρηµένα θέµατα των αλγορίθµων, των αλγοριθµικών δοµών, των γλωσ-σών προγραµµατισµού, των µεθοδολογιών ανάπτυξης λογισµικού, της υπολογι-σιµότητας, και της πολυπλοκότητας, τα οποία οι περισσότεροι από εµάς θεω-ρούµε ως τα βασικά ζητήµατα της επιστήµης µας. Όπως είπα προηγουµένως, τα θέµατα παρουσιάζονται µε τρόπο ο οποίος δεν σας αναγκάζει να ακολουθήσετε αυτή τη συνθετική ακολουθία, αλλά θα σας πρότεινα να κάνατε έστω µια δοκι-µή.

Όλοι γνωρίζουµε ότι οι σπουδαστές µαθαίνουν πολύ περισσότερα πράγµατα από αυτά που τους µαθαίνουµε άµεσα, και τα µαθήµατα που παίρνουν εµµέσως αφοµοιώνονται συχνά καλύτερα από εκείνα που διδάσκονται µε άµεσο τρόπο. Αυτό είναι σηµαντικό κατά τη “διδασκαλία” της επίλυσης προβληµάτων. Οι σπουδαστές δεν µαθαίνουν να λύνουν προβλήµατα µελετώντας τις µεθοδολογί-ες επίλυσης προβληµάτων. Μαθαίνουν να λύνουν προβλήµατα λύνοντας προ-βλήµατα — και όχι µόνο τα προσεκτικά διατυπωµένα “προβλήµατα των εκπαι-δευτικών βιβλίων”. Έτσι έχω συµπεριλάβει στο βιβλίο έναν µεγάλο αριθµό προβληµάτων, ορισµένα από τα οποία είναι σκοπίµως ασαφή — µε άλλα λόγια, δεν έχουν απαραίτητα µια µοναδική σωστή προσέγγιση ή µια µοναδική σωστή απάντηση. Σας προτείνω να τα χρησιµοποιήσετε και να τα επεκτείνετε.

Άλλο ένα θέµα που τοποθετώ σε αυτή την κατηγορία της “έµµεσης εκπαί-δευσης” είναι ο επαγγελµατισµός, η ηθική, και η κοινωνική υπευθυνότητα. ∆εν πιστεύω ότι το υλικό αυτό πρέπει να παρουσιάζεται ως αποµονωµένο αντικείµε-νο, το οποίο απλώς προστέθηκε βιαστικά στο µάθηµα. Αντίθετα, πρέπει να απο-τελεί αναπόσπαστο κοµµάτι της κάλυψης, το οποίο θα κάνει την εµφάνισή του όταν χρειάζεται. Αυτή την προσέγγιση έχω υιοθετήσει στο παρόν βιβλίο. Θα δείτε ότι στις Ενότητες 3.5, 4.5, 7.8, 9.7, και 11.7 παρουσιάζονται θέµατα όπως η ασφάλεια, το προσωπικό απόρρητο, η υπαιτιότητα, και η κοινωνική συνείδη-ση, στο πλαίσιο των λειτουργικών συστηµάτων, της δικτύωσης, των συστηµά-των βάσεων δεδοµένων, της τεχνολογίας λογισµικού, και της τεχνητής νοηµο-σύνης. Επιπλέον, η Ενότητα 0.6 παρουσιάζει αυτό το θέµα συνοψίζοντας ορι-σµένες από τις πιο σηµαντικές θεωρίες που προσπαθούν να τοποθετήσουν τη λήψη ηθικών αποφάσεων σε µια σταθερή από φιλοσοφική άποψη βάση. Επίσης,

Page 12: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα

ΠΡΟΛΟΓΟΣ

12

12

θα δείτε ότι κάθε κεφάλαιο περιέχει ένα σύνολο ερωτήσεων µε τίτλο Κοινωνικά θέµατα, οι οποίες δίνουν ερεθίσµατα στους σπουδαστές να σκεφθούν για τη σχέση µεταξύ της ύλης του βιβλίου και της κοινωνίας στην οποία ζουν.

Σας ευχαριστώ που σκέφτεστε να χρησιµοποιήσετε το βιβλίο µου για το µά-θηµά σας. Ανεξάρτητα από το αν θα αποφασίσετε ότι είναι κατάλληλο για την περίπτωσή σας ή όχι, ελπίζω να το θεωρήσετε ως µια συµβολή στην εκπαιδευ-τική βιβλιογραφία της επιστήµης των υπολογιστών.

Παιδαγωγικά χαρακτηριστικά Το βιβλίο αυτό αποτελεί προϊόν πολλών ετών διδασκαλίας. Για το λόγο αυτόν είναι πλούσιο σε παιδαγωγικά βοηθήµατα. Κάτι πολύ σηµαντικό είναι η πληθώ-ρα προβληµάτων για τη βελτίωση της συµµετοχής του σπουδαστή (πάνω από 1.000 σε αυτή τη δέκατη έκδοση). Είναι κατηγοριοποιηµένα σε Ερωτήσεις/Α-σκήσεις, Προβλήµατα επανάληψης κεφαλαίου, και Κοινωνικά θέµατα. Οι Ερωτή-σεις/Ασκήσεις εµφανίζονται στο τέλος κάθε ενότητας (εκτός από το εισαγωγικό κεφάλαιο). Αποτελούν µια ανασκόπηση της ύλης που µόλις διδάχθηκε, επεκτεί-νουν την προηγούµενη περιγραφή, ή θίγουν σχετικά θέµατα που θα καλυφθούν αργότερα. Τις απαντήσεις αυτών των ασκήσεων θα τις βρείτε στο Παράρτηµα ΣΤ.

Τα Προβλήµατα επανάληψης κεφαλαίου εµφανίζονται στο τέλος κάθε κεφα-λαίου (εκτός του εισαγωγικού κεφαλαίου). Είναι σχεδιασµένα ως προβλήµατα “για το σπίτι”, αφού καλύπτουν την ύλη ολόκληρου του κεφαλαίου και οι λύ-σεις τους δεν περιλαµβάνονται στο βιβλίο.

Στο τέλος κάθε κεφαλαίου βρίσκονται επίσης οι ερωτήσεις της κατηγορίας των Κοινωνικών θεµάτων. Είναι σχεδιασµένες για σκέψη και συζήτηση. Πολλές από αυτές τις ερωτήσεις µπορούν να χρησιµοποιηθούν για την ανάθεση ερευνη-τικών εργασιών που θα ολοκληρώνονται µε σύντοµες γραπτές ή προφορικές αναφορές.

Κάθε κεφαλαίο ολοκληρώνεται επίσης µε µια λίστα που έχει τίτλο Πρόσθετη ανάγνωση, η οποία περιέχει αναφορές σε άλλο υλικό που συνδέεται µε το αντι-κείµενο του συγκεκριµένου κεφαλαίου. Οι ιστότοποι που αναφέρονται σε αυτόν τον πρόλογο, στο βιβλίο, και στα ένθετα πλαίσια, αποτελούν επίσης καλές θέ-σεις για αναζήτηση σχετικού υλικού.

Συµπληρωµατικοί πόροι Στον ιστότοπο του βιβλίου (www.aw.com/brookshear) υπάρχει διαθέσιµη µια µεγάλη ποικιλία συµπληρωµατικού υλικού1. Οι ακόλουθοι πόροι αφορούν τόσο τους σπουδαστές όσο και τους καθηγητές:

1 Σ.τ.Μ. Το υλικό αυτό είναι στην αγγλική γλώσσα.

Page 13: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα

ΠΡΟΣ ΤΟΥΣ ΣΠΟΥ∆ΑΣΤΕΣ

13

• ∆ραστηριότητες για κάθε κεφάλαιο οι οποίες επεκτείνουν θέµατα που αναφέρονται στο κείµενο και παρέχουν ευκαιρίες για περαιτέρω εξερεύ-νηση σχετικών ζητηµάτων

• Τεστ για κάθε κεφάλαιο τα οποία βοηθούν τους αναγνώστες να ξανασκε-φτούν την ύλη που καλύπτεται στο κείµενο

• Εγχειρίδια που διδάσκουν τις βασικές αρχές της Java και της C++ σε µια παιδαγωγική ακολουθία συµβατή µε το κείµενο

Επιπλέον, τα επόµενα συµπληρώµατα είναι διαθέσιµα για πιστοποιηµένους εκπαιδευτικούς στο Κέντρο Πόρων Εκπαιδευτικών (Instructor’s Resource Cen-ter) της Addison-Wesley. Παρακαλώ επισκεφτείτε τη διεύθυνση www.aw.com/ irc ή επικοινωνήστε µε τον τοπικό αντιπρόσωπο της Addison-Wesley για πλη-ροφορίες σχετικά µε το πώς µπορείτε να τα προσπελάσετε:

• Οδηγός Εκπαιδευτή µε τις απαντήσεις στα προβλήµατα επανάληψης κε-φαλαίου

• ∆ιαφάνειες διαλέξεων PowerPoint • Τράπεζα τεστ (test bank) Επίσης, θα µπορούσατε να ρίξετε µια µατιά στον προσωπικό µου ιστότοπο,

στη διεύθυνση www.mscs.mu. edu/~glennb. Το στυλ είναι πολύ ανεπίσηµο (και γεµάτο µε τις ιδιοτροπίες και την αίσθηση του χιούµορ µου), αλλά υπάρχουν κάποιες πληροφορίες που ίσως βρείτε χρήσιµες.

Προς τους σπουδαστές Είµαι λιγάκι αντικοµφορµιστής (µερικοί φίλοι µου θα λέγανε κάτι παραπάνω από λιγάκι), έτσι όταν έγραφα αυτό το βιβλίο δεν ακολουθούσα πάντοτε τις συµβουλές που µου έδιναν. Ειδικότερα, πολλοί υποστήριζαν ότι ένα µέρος της ύλης ήταν πολύ προχωρηµένο για αρχάριους σπουδαστές. Ωστόσο πιστεύω ότι, αν ένα θέµα είναι σχετικό, συνεχίζει να είναι σχετικό ακόµα και αν η ακαδηµαϊ-κή κοινότητα το θεωρεί “προχωρηµένο”. Αξίζετε ένα βιβλίο που να παρουσιάζει µια ολοκληρωµένη εικόνα της επιστήµης των υπολογιστών — όχι µια “στεγνή” έκδοση που να περιέχει τεχνητά απλοποιηµένες παρουσιάσεις εκείνων µόνο των θεµάτων που θεωρούνται κατάλληλα για τους νέους σπουδαστές. Έτσι, δεν α-πέκλεισα κάποια θέµατα. Αντίθετα, έδωσα καλύτερες επεξηγήσεις. Προσπάθη-σα να προσφέρω αρκετό βάθος που να δίνει µια ειλικρινή εικόνα του τι είναι τε-λικά η επιστήµη των υπολογιστών. Όπως συµβαίνει καµιά φορά και µε τα κα-ρυκεύµατα σε µια συνταγή, µπορείτε να επιλέξετε να προσπεράσετε κάποια από τα θέµατα που θα ακολουθήσουν, ωστόσο βρίσκονται εκεί για να τα δοκιµάσε-τε, αν θέλετε — και σας προτείνω να το κάνετε.

Θα πρέπει επίσης να τονίσω ότι, σε οποιοδήποτε µάθηµα έχει να κάνει µε την τεχνολογία, οι λεπτοµέρειες που µαθαίνετε σήµερα ίσως να µην είναι οι λε-πτοµέρειες που θα χρειαστείτε αύριο. Το πεδίο είναι δυναµικό — και αυτό απο-τελεί µέρος του ενδιαφέροντος. Το βιβλίο θα σας δώσει µια τρέχουσα εικόνα

Page 14: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα

ΠΡΟΛΟΓΟΣ

14

14

του αντικειµένου, καθώς και µια ιστορική προοπτική του. Αυτό το υπόβαθρο θα σας προετοιµάσει ώστε να “αναπτυχθείτε” µαζί µε την τεχνολογία. Σας προτεί-νω να αρχίσετε να αναπτύσσεστε τώρα, εξερευνώντας πέρα από το κείµενο του βιβλίου. Μάθετε να µαθαίνετε.

Σας ευχαριστώ για την εµπιστοσύνη που µου δείξατε µε την απόφασή σας να διαβάσετε το βιβλίο µου. Ως συγγραφέας, είχα υποχρέωση να δηµιουργήσω ένα βιβλίο που να αξίζει το χρόνο που θα του αφιερώσετε. Ελπίζω να διαπιστώσετε ότι τελικά αυτή η υποχρέωση έχει τηρηθεί.

Ευχαριστίες Καταρχήν θα ήθελα να ευχαριστήσω όλους εσάς που υποστήριξαν αυτό το βι-βλίο διαβάζοντάς το και χρησιµοποιώντας προηγούµενες εκδόσεις του. Ήταν τιµή µου.

Με κάθε νέα έκδοση, η λίστα των ατόµων που έχουν συµβάλλει στο βιβλίο, όπως επιµελητές και σύµβουλοι, µεγαλώνει. Έχω ήδη αναφέρει τις ιδιαίτερες προσπάθειες των Ed Angel, John Carpinelli, Chris Fox, Jim Kurose, Gary Nutt, Greg Riccardi, και Patrick Henry Winston στη δηµιουργία αυτής της δέκατης έκδοσης. Μαζί µε τα ονόµατά τους θα πρέπει να συµπεριλάβω εκείνο του Michael Hirsch, επιµελητή και φίλου µου, ο οποίος κατάφερε να πείσει τους ανωτέρω συγγραφείς να προσφέρουν το χρόνο τους στο έργο αυτό. Σ’ ευχαρι-στώ, Michael.

Άλλοι που έχουν συνεισφέρει σε αυτή και σε προηγούµενες εκδόσεις είναι οι J. M. Adams, C. M. Allen, D. C. S. Allison, R. Ashmore, B. Auernheimer, P. Bankston, M. Barnard, P. Bender, K. Bowyer, P. W. Brashear, C. M. Brown, B. Calloni, M. Clancy, R. T. Close, D. H. Cooley, L. D. Cornell, M. J. Crowley, F. Deek, M. Dickerson, M. J. Duncan, S. Fox, N. E. Gibbs, J. D. Harris, D. Hascom, L. Heath, P. B. Henderson, L. Hunt, M. Hutchenreuther, L. A. Jehn, K. K. Kolberg, K. Korb, G. Krenz, J. Liu, T. J. Long, C. May, J. J. McConnell, W. McCown, S. J. Merrill, K. Messersmith, J. C. Moyer, M. Murphy, J. P. Myers, Jr., D. S. Noonan, S. Olariu, G. Rice, N. Rickert, C. Riedesel, J. B. Rogers, G. Saito, W. Savitch, R. Schlafly, J. C. Schlimmer, N. S. Scott, S. Sells, Z. Shen, G. Sheppard, J. C. Simms, M. C. Slattery, J. Slimick, J. A. Slomka, D. Smith, J. Solderitsch, R. Steigerwald, L. Steinberg, C. A. Struble, C. L. Struble, W. J. Taffe, J. Talburt, P. Tonellato, P. Tromovitch, E. D. Winter, E. Wright, M. Ziegler, και ένας ανώνυµος συντελεστής. Σε όλους αυτούς τους ανθρώπους δί-νω τις ειλικρινείς µου ευχαριστίες.

Ιδιαίτερες ευχαριστίες αξίζουν στην Diane Christie του Πανεπιστηµίου του Wisconsin-Stout, η οποία εργάστηκε ακούραστα στην επανασυγγραφή των εγ-χειριδίων της Java και της C++ που είναι διαθέσιµα στον ιστότοπο της Addison-Wesley (αναφέρεται στην ενότητα µε τους συµπληρωµατικούς πόρους αυτού του προλόγου). Άλλο ένα ευχαριστώ οφείλω στον Roger Eastman, ο οποίος ε-νηµέρωσε την υποστηρικτική ύλη στον ιστότοπο του βιβλίου. Εκτιµώ αφάντα-στα τις προσπάθειές του.

Page 15: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα

ΕΥΧΑΡΙΣΤΙΕΣ

15

Θα ήθελα επίσης να ευχαριστήσω το προσωπικό της Addison-Wesley που συνέβαλλε σε αυτό το έργο. Είναι µια καταπληκτική οµάδα για συνεργασία — αλλά και καλοί φίλοι. Αν σκέφτεστε να γράψετε κάποιο ακαδηµαϊκό βιβλίο, θα πρέπει να σκεφτείτε σοβαρά να το εκδώσετε µε την Addison-Wesley.

Συνεχίζω να είµαι ευγνώµων στη σύζυγό µου Earlene και την κόρη µου Cheryl, οι οποίες αποτέλεσαν τεράστιες πηγές ενθάρρυνσης όλα αυτά τα χρόνια. Η Cheryl, βέβαια, µεγάλωσε και έφυγε από το σπίτι εδώ και αρκετά χρόνια. Αλ-λά η Earlene είναι ακόµα εδώ. Είµαι τυχερός άνθρωπος. Το πρωί της 11ης ∆ε-κεµβρίου του 1998 επέζησα από µια καρδιακή προσβολή, επειδή εκείνη µε πήγε εγκαίρως στο νοσοκοµείο. (Σε όλους εσάς που ανήκετε σε νεότερες γενιές, θα πρέπει να εξηγήσω ότι το να επιζήσεις από µια καρδιακή προσβολή είναι σαν να πήρες παράταση για τη σχολική σου εργασία.)

Τέλος, θέλω να ευχαριστήσω τους γονείς µου, στους οποίους είναι αφιερω-µένο αυτό το βιβλίο. Θα κλείσω µε τη γνώµη που εξέφρασαν για το βιβλίο κά-ποιοι αναγνώστες, οι οποίοι επιθυµούν να παραµείνουν ανώνυµοι: “Το βιβλίο του γιου µας είναι πολύ καλό. Θα πρέπει να το διαβάσει ο καθένας”.

J. G. B.

Page 16: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα
Page 17: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα

ΚΕΦΑΛΑΙΟ Γλώσσες προγραµµατισµού Στο κεφάλαιο αυτό εξερευνούµε τις γλώσσες προγραµµατισµού. Στόχος µας δεν είναι να µάθουµε µια συγκεκριµένη γλώσσα, άλλα να αποκτήσουµε γενικές γνώσεις επάνω στο συγκεκριµένο θέµα. Με αυτόν τον τρόπο θα µπορούµε να εκτιµήσουµε τα κοινά σηµεία αλλά και τις διαφορές µεταξύ των γλωσσών προγραµµατισµού και των σχετικών τους µεθοδολογιών.

6.1 Ιστορική εξέλιξη 6.2 Παραδοσιακές έννοιες προγραµµατισµού 6.3 ∆ιαδικασιακές µονάδες 6.4 Υλοποίηση γλώσσας 6.5 Αντικειµενοστρεφής προγραµµατισµός *6.6 Προγραµµατισµός ταυτόχρονων δραστηριοτήτων *6.7 ∆ηλωτικός προγραµµατισµός * Οι αστερίσκοι υποδεικνύουν προτάσεις για προαιρετικές ενότητες

Page 18: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα

ΚΕΦΑΛΑΙΟ 6 ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

342

Η ανάπτυξη πολύπλοκων συστηµάτων λογισµικού, όπως λειτουργικών συ-στηµάτων, λογισµικού δικτύων, και της µεγάλης ποικιλίας του λογισµικού ε-φαρµογών που είναι σήµερα διαθέσιµες, θα ήταν αδύνατη αν οι άνθρωποι ήταν υποχρεωµένοι να εκφράζουν τους σχετικούς αλγορίθµους απευθείας σε γλώσσα µηχανής. Ο χειρισµός των πολύπλοκων λεπτοµερειών που σχετίζονται µε αυτές τις γλώσσες θα αποτελούσε το λιγότερο µια άσχηµη εµπειρία κατά την προσπά-θεια οργάνωσης σύνθετων συστηµάτων. Για να αντιµετωπιστεί αυτό το πρό-βληµα, αναπτύχθηκαν γλώσσες προγραµµατισµού παρόµοιες µε τον ψευδοκώ-δικά µας, στις οποίες οι αλγόριθµοι εκφράζονται σε µια µορφή η οποία και κα-τανοητή είναι στους ανθρώπους και εύκολα µετατρέπεται σε εντολές της γλώσ-σας µηχανής. Στόχος µας σε αυτό το κεφάλαιο είναι να εξερευνήσουµε το πεδίο της επιστήµης των υπολογιστών που εξετάζει τη σχεδίαση και την υλοποίηση αυτών των γλωσσών.

6.1 Ιστορική εξέλιξη Θα ξεκινήσουµε τη µελέτη µας παρακολουθώντας την ιστορική εξέλιξη των γλωσσών προγραµµατισµού.

Πρώτες γενιές Όπως µάθαµε στο Κεφάλαιο 2, τα προγράµµατα των σύγχρονων υπολογιστών αποτελούνται από ακολουθίες εντολών οι οποίες είναι κωδικοποιηµένες ως α-ριθµητικά ψηφία. Τα συστήµατα κωδικοποίησης αυτού του είδους είναι γνωστά ως γλώσσες µηχανής. ∆υστυχώς, η συγγραφή προγραµµάτων σε γλώσσα µηχα-νής είναι µια κουραστική διαδικασία η οποία συχνά οδηγεί σε σφάλµατα τα ο-ποία πρέπει να εντοπιστούν και να διορθωθούν (µια διαδικασία γνωστή ως απο-σφαλµάτωση — debugging) για να ολοκληρωθεί η εργασία.

Τη δεκαετία του 1940, οι ερευνητές απλοποίησαν την προγραµµατιστική δι-αδικασία µε την ανάπτυξη συστηµάτων συµβολισµού στα οποία οι εντολές µπορούσαν να αναπαρασταθούν σε µνηµονική και όχι σε αριθµητική µορφή. Για παράδειγµα, η εντολή

Μετακίνησε τα περιεχόµενα του καταχωρητή 5 στον καταχωρητή 6 θα εκφραζόταν ως

4056 στη γλώσσα µηχανής που παρουσιάσαµε στο Κεφάλαιο 2, ενώ σε ένα µνηµονι-κό σύστηµα θα µπορούσε να παρουσιαστεί ως

MOV R5, R6 Για να δούµε ένα πιο εκτεταµένο παράδειγµα, η ρουτίνα γλώσσας µηχανής

156C 166D 5056

Page 19: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα

6.1 ΙΣΤΟΡΙΚΗ ΕΞΕΛΙΞΗ

343

306E C000

που προσθέτει τα περιεχόµενα των κελιών µνήµης 6C και 6D και αποθηκεύει το αποτέλεσµα στη θέση 6E (Σχήµα 2.7 του Κεφαλαίου 2), θα µπορούσε να εκ-φραστεί ως

LD R5,Price LD R6,ShippingCharge ADDI R0,R5 R6 ST R0,TotalCost HLT

µε τη χρήση µνηµονικών ονοµάτων. (Εδώ χρησιµοποιούµε τους κωδικούς LD, ADDI, ST, και HLT για να αναπαραστήσουµε τις εντολές load, add, store, και halt. Ακόµα, έχουµε χρησιµοποιήσει τα ονόµατα Price, ShippingCharge, και TotalCost για να αναφερθούµε στα κελιά µνήµης των θέσεων 6C, 6D, και 6E, αντίστοιχα. Τέτοια περιγραφικά ονόµατα συχνά ονοµάζονται αναγνωριστικά — identifiers.) Παρατηρήστε ότι η µνηµονική µορφή, αν και ακόµα ελλιπής, αναπαριστά καλύτερα τη σηµασία της ρουτίνας από ό,τι η αριθµητική µορφή.

Από τη στιγµή που καθιερώθηκε ένα τέτοιο µνηµονικό σύστηµα, αναπτύ-χθηκαν προγράµµατα, οι λεγόµενοι συµβολοµεταφραστές (assemblers1), οι ο-ποίοι µετέτρεπαν τις µνηµονικές εκφράσεις σε εντολές γλώσσας µηχανής. Έτσι, αντί να είναι υποχρεωµένοι να αναπτύσσουν προγράµµατα απευθείας σε γλώσ-σα µηχανής, οι άνθρωποι µπορούσαν να γράψουν ένα πρόγραµµα σε µνηµονική µορφή και µετά να το µετατρέψουν στη γλώσσα µηχανής µε τη βοήθεια ενός συµβολοµεταφραστή.

Ένα µνηµονικό σύστηµα για την αναπαράσταση προγραµµάτων ονοµάζεται γενικά γλώσσα assembly. Όταν πρωτοδηµιουργήθηκαν οι γλώσσες assembly, αντιπροσώπευαν ένα γιγάντιο βήµα προς την αναζήτηση καλύτερων τεχνικών προγραµµατισµού. Για την ακρίβεια, οι γλώσσες assembly ήταν τόσο επανα-στατικές που έγιναν γνωστές ως γλώσσες δεύτερης γενιάς, µε την πρώτη γενιά να αποτελείται από τις γλώσσες µηχανές.

Παρόλο που οι γλώσσες assembly έχουν πολλά πλεονεκτήµατα σε σχέση µε τις αντίστοιχές τους γλώσσες µηχανής, δεν είναι σε θέση να προσφέρουν το α-πόλυτο προγραµµατιστικό περιβάλλον. Εξάλλου, τα αρχέτυπα που χρησιµο-ποιούν είναι στην ουσία τα ίδια µε αυτά των αντίστοιχων γλωσσών µηχανής. Η διαφορά βρίσκεται απλώς στο συντακτικό που χρησιµοποιούν για την αναπαρά-στασή τους. Έτσι, ένα πρόγραµµα που γράφεται σε γλώσσα assembly εξαρτάται εγγενώς από τη µηχανή — δηλαδή, οι εντολές µέσα στο πρόγραµµα εκφράζο-νται σε σχέση µε τα χαρακτηριστικά µιας συγκεκριµένης µηχανής. Κατά συνέ-πεια, ένα πρόγραµµα που έχει γραφτεί σε γλώσσα assembly δεν µπορεί να µε-ταφερθεί εύκολα σε κάποιον άλλον υπολογιστή µε διαφορετικό σχεδιασµό, ε-

1 Σ.τ.Μ. Κυριολεκτικά ο όρος “assembler” σηµαίνει “συναρµολογητής”.

Page 20: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα

ΚΕΦΑΛΑΙΟ 6 ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

344

πειδή πρέπει να ξαναγραφτεί ώστε να συµβαδίζει µε τη διευθέτηση των κατα-χωρητών και το σύνολο εντολών του νέου υπολογιστή.

Άλλο ένα µειονέκτηµα των γλωσσών assembly είναι ότι ο προγραµµατιστής, παρόλο που δεν χρειάζεται να γράφει εντολές σε αριθµητική µορφή, είναι ακόµα υποχρεωµένος να προσαρµόζει τη σκέψη του στα µικρά αυξητικά βήµατα της γλώσσας µηχανής. Η κατάσταση είναι ανάλογη µε το σχεδιασµό ενός σπιτιού µε σανίδες, καρφιά, τούβλα, κ.λπ. Είναι βέβαια αλήθεια ότι η πραγµατική κατασκευή ενός σπιτιού τελικά θα απαιτήσει µια περιγραφή µε βάση αυτά τα στοιχειώδη συ-στατικά, αλλά η διαδικασία του σχεδιασµού είναι πιο εύκολη αν σκεφτούµε µε βάση µεγαλύτερες µονάδες, όπως δωµάτια, παράθυρα, πόρτες, κ.ο.κ.

Με λίγα λόγια, τα στοιχειώδη αρχέτυπα µε βάση τα οποία πρέπει να κατα-σκευαστεί τελικά ένα προϊόν δεν χρειάζεται να είναι απαραίτητα ίδια µε τα αρ-χέτυπα που θα χρησιµοποιηθούν κατά το σχεδιασµό του προϊόντος. Η διαδικα-σία του σχεδιασµού ταιριάζει καλύτερα µε τη χρήση αρχέτυπων υψηλού επιπέ-δου, το καθένα από τα οποία αναπαριστά µια έννοια που σχετίζεται µε µια ση-µαντική λειτουργία του προϊόντος. Από τη στιγµή που ο σχεδιασµός ολοκλη-ρωθεί, τα αρχέτυπα αυτά µπορούν να µεταφραστούν στις έννοιες χαµηλότερου επιπέδου που σχετίζονται µε τις λεπτοµέρειες της υλοποίησης.

Με βάση αυτή τη φιλοσοφία, οι επιστήµονες των υπολογιστών ξεκίνησαν την ανάπτυξη γλωσσών προγραµµατισµού οι οποίες διευκόλυναν περισσότερο την ανάπτυξη λογισµικού από ό,τι οι χαµηλοτέρου επιπέδου γλώσσες assembly. Το αποτέλεσµα ήταν η εµφάνιση µιας τρίτης γενιάς γλωσσών προγραµµατι-σµού, η οποία διέφερε από τις προηγούµενες γενιές στο ότι τα αρχέτυπά της ή-ταν υψηλότερου επιπέδου (εξέφραζαν εντολές σε µεγαλύτερα αυξητικά βήµατα) και ανεξάρτητα µηχανής (δεν εξαρτιόνταν από τα χαρακτηριστικά µιας συγκε-κριµένης µηχανής). Τα πιο γνωστά πρώτα παραδείγµατα ήταν η γλώσσα FORT-RAN (FORmula TRANslator, δηλαδή “Μεταφραστής τύπων”), η οποία αναπτύ-χθηκε για επιστηµονικές εφαρµογές, και η COBOL (COmmon Business-Orien-ted Language, δηλαδή “Κοινή γλώσσα για εµπορικές εφαρµογές”), που αναπτύ-χθηκε από το Ναυτικό των Η.Π.Α. για εµπορικές εφαρµογές.

Γενικά, η προσέγγιση των γλωσσών προγραµµατισµού τρίτης γενιάς είναι να προσδιορίζουν ένα σύνολο από αρχέτυπα υψηλού επιπέδου (στην ουσία µε τον ίδιο τρόπο που εµείς αναπτύξαµε τον ψευδοκώδικά µας στο Κεφάλαιο 5) µε τα οποία γίνεται η ανάπτυξη του λογισµικού. Κάθε ένα από αυτά τα αρχέτυπα σχε-διάζεται έτσι ώστε να µπορεί να υλοποιηθεί ως ακολουθία των αρχέτυπων χα-µηλού επιπέδου της γλώσσας µηχανής. Για παράδειγµα, η εντολή

ανάθεσε στο ΣυνολικόΚόστο την τιµή Αξία + ΤαχυδροµικάΤέλη εκφράζει µια δραστηριότητα υψηλού επιπέδου χωρίς να αναφέρεται στο πώς θα εκτελέσει αυτή την εργασία µια συγκεκριµένη µηχανή — ωστόσο υλοποιείται από µια ακολουθία εντολών µηχανής. Έτσι, η δοµή ψευδοκώδικα

αναγνωριστικό ← παράσταση αποτελεί ένα πιθανό αρχέτυπο υψηλού επιπέδου.

Page 21: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα

6.1 ΙΣΤΟΡΙΚΗ ΕΞΕΛΙΞΗ

345

Αφού προσδιοριστεί το σύνολο των αρχέτυπων υψηλού επιπέδου, τα αρχέ-τυπα αυτά µεταφράζονται σε προγράµµατα γλώσσας µηχανής µέσω µιας εφαρ-µογής που ονοµάζεται µεταφραστής (translator). Οι µεταφραστές αυτοί είναι παρόµοιοι µε τους συµβολοµεταφραστές δεύτερης γενιάς, µε τη διαφορά ότι συχνά πρέπει να οµαδοποιούν πολλές εντολές µηχανής σε µικρές ακολουθίες ώστε να προσοµοιώνουν τη δραστηριότητα που ζητάει ένα µόνο αρχέτυπο υψη-λού επιπέδου. Έτσι, αυτά τα µεταφραστικά προγράµµατα συχνά αναφέρονται µε την αγγλική λέξη “compilers2” (µεταγλωττιστές).

Μια δηµοφιλής εναλλακτική λύση στους µεταφραστές είναι οι διερµηνευτές (interpreters), οι οποίοι εµφανίστηκαν ως ένα ακόµη µέσο για την υλοποίηση γλωσσών τρίτης γενιάς. Τα προγράµµατα αυτά είναι παρόµοια µε τους µετα-φραστές, µε τη διαφορά ότι εκτελούν τις εντολές καθώς τις µεταφράζουν αντί να καταγράφουν τη µεταφρασµένη έκδοση για µελλοντική χρήση. ∆ηλαδή, αντί ένας διερµηνευτής να δηµιουργεί ένα αντίγραφο σε γλώσσα µηχανής το οποίο µπορεί να εκτελεστεί αργότερα, εκτελεί ένα πρόγραµµα από τη µορφή υψηλού επιπέδου του.

Θα κάνουµε µια παρένθεση για να αναφέρουµε ότι η καθιέρωση των γλωσ-σών προγραµµατισµού τρίτης γενιάς δεν ήταν τόσο εύκολη όσο ίσως νοµίζετε. Η ιδέα της συγγραφής προγραµµάτων σε µια µορφή παρόµοια µε τη φυσική γλώσσα ήταν τόσο επαναστατική που στην αρχή πολεµήθηκε από πολλά υψη-λόβαθµα άτοµα. Πράγµατι, η Grace Hopper, η οποία θεωρείται ως το πρόσωπο που κατασκεύασε τον πρώτο µεταγλωττιστή, συχνά ανέφερε ένα περιστατικό όπου προσπαθούσε να επιδείξει ένα µεταφραστή για µια γλώσσα τρίτης γενιάς η οποία χρησιµοποιούσε γερµανικούς όρους αντί για αγγλικούς. Η ιδέα ήταν ότι µια γλώσσα προγραµµατισµού µπορούσε να κατασκευαστεί µε βάση ένα µικρό σύνολο αρχέτυπων, τα οποία είχαν τη δυνατότητα να εκφραστούν σε διάφορες φυσικές γλώσσες µε µια απλή τροποποίηση του µεταφραστή. ∆υστυχώς, η Hopper βρέθηκε προ εκπλήξεως όταν διαπίστωσε ότι µεγάλο µέρος του κοινού σοκαρίστηκε από το γεγονός ότι, σε µια εποχή τόσο κοντά στον Β’ Παγκόσµιο Πόλεµο, εκείνη προσπαθούσε να διδάξει έναν υπολογιστή να “καταλαβαίνει” Γερµανικά. Σήµερα γνωρίζουµε ότι η κατανόηση µιας φυσικής γλώσσας απέχει πάρα-πάρα πολύ από την απόκριση σε λίγα αυστηρώς ορισµένα αρχέτυπα. Πράγµατι, οι φυσικές γλώσσες (όπως, τα Ελληνικά, τα Αγγλικά, και τα Γερµα-νικά) διαφέρουν από τις τυποποιηµένες γλώσσες (όπως είναι οι γλώσσες προ-γραµµατισµού) στο ότι οι τελευταίες ορίζονται από αυστηρούς γραµµατικούς κανόνες (Ενότητα 6.4) ενώ οι πρώτες έχουν εξελιχθεί µε την πάροδο του χρόνου χωρίς αυστηρή γραµµατική ανάλυση.

2 Σ.τ.Μ. Αν και στα ελληνικά ο όρος “compiler” αποδίδεται ως “µεταγλωττιστής”, η κυριολεκτική του έν-

νοια είναι “οµαδοποιητής”.

Page 22: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα

ΚΕΦΑΛΑΙΟ 6 ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

346

∆ιασυστηµικό λογισµικό Ένα τυπικό πρόγραµµα εφαρµογών πρέπει να βασίζεται στο λειτουργικό σύστηµα για την εκτέλεση πολλών από τις εργασίες του. Ίσως να απαιτήσει τις υπηρεσίες του διαχειριστή παραθύρων για να ε-πικοινωνήσει µε το χρήστη του υπολογιστή, ή να χρησιµοποιήσει το διαχειριστή αρχείων για να ανα-κτήσει δεδοµένα από κάποιο µέσο αποθήκευσης. ∆υστυχώς, κάθε λειτουργικό σύστηµα έχει τον δικό του τρόπο να δέχεται αιτήσεις για τέτοιες υπηρεσίες. Έτσι, αν ένα πρόγραµµα προορίζεται για µετα-φορά και εκτέλεση διαµέσου δικτύων και διαδικτύων σε µηχανές µε διαφορετικό σχεδιασµό και δια-φορετικά λειτουργικά συστήµατα, τότε πρέπει να είναι ανεξάρτητο λειτουργικού συστήµατος και α-νεξάρτητο µηχανής. Ο όρος “διασυστηµικό” (cross-platform) χρησιµοποιείται για τον προσδιορισµό αυτού του πρόσθετου επιπέδου ανεξαρτησίας. ∆ηλαδή, το διασυστηµικό λογισµικό είναι λογισµικό που δεν εξαρτάται από το σχεδιασµό του λειτουργικού συστήµατος και το σχεδιασµό του υλικού της µηχανής, και γι’ αυτόν το λόγο µπορεί να εκτελεστεί µέσω δικτύου.

Πιο πέρα από την ανεξαρτησία µηχανής Με την ανάπτυξη των γλωσσών τρίτης γενιάς, ο στόχος της ανεξαρτησίας από τη µηχανή επιτεύχθηκε κατά ένα πολύ µεγάλο µέρος. Εφόσον οι εντολές µιας γλώσσας τρίτης γενιάς δεν αναφέρονται στα χαρακτηριστικά κάποιας συγκεκρι-µένης µηχανής, µπορούν να µεταγλωττίζονται το ίδιο εύκολα σε κάθε είδους µηχανή. Ένα πρόγραµµα που έχει γραφτεί σε µια γλώσσα τρίτης γενιάς, θεωρη-τικά µπορεί να χρησιµοποιηθεί σε κάθε µηχανή απλώς και µόνο µε τη βοήθεια του κατάλληλου µεταγλωττιστή.

Στην πραγµατικότητα, όµως, τα πράγµατα δεν είναι και τόσο απλά. Μερικές φορές, κατά τη σχεδίαση ενός µεταγλωττιστή λαµβάνονται υπόψη συγκεκριµέ-να χαρακτηριστικά της υποκείµενης µηχανής, θέτοντας έτσι περιορισµούς στη γλώσσα που µεταφράζεται. Για παράδειγµα, οι διαφορετικοί τρόποι µε τους ο-ποίους οι µηχανές χειρίζονται λειτουργίες Ε/Ε έχουν κάνει πολλές φορές την “ί-δια” γλώσσα προγραµµατισµού να έχει διαφορετικά χαρακτηριστικά, ή διαλέ-κτους, ανάλογα µε τη µηχανή. Για να µπορέσει συνεπώς ένα πρόγραµµα να µε-ταφερθεί από τη µία µηχανή στην άλλη, συχνά είναι απαραίτητο να γίνουν µι-κρές τουλάχιστον τροποποιήσεις.

Αυτό το πρόβληµα της “µεταφερσιµότητας” ενισχύεται από την έλλειψη συµφωνίας πάνω σε κάποια θέµατα, όπως το ποιος είναι ο σωστός ορισµός µιας συγκεκριµένης γλώσσας. Για να βοηθήσουν προς αυτή την κατεύθυνση, το Α-µερικανικό Ίδρυµα Εθνικών Προτύπων και ο ∆ιεθνής Οργανισµός Τυποποίησης έχουν υιοθετήσει και δηµοσιεύσει πρότυπα για πολλές από τις δηµοφιλείς γλώσσες προγραµµατισµού. Σε άλλες περιπτώσεις έχουν αναπτυχθεί ανεπίσηµα πρότυπα, εξαιτίας της δηµοτικότητας µιας συγκεκριµένης διαλέκτου κάποιας γλώσσας και την επιθυµία των άλλων δηµιουργών µεταγλωττιστών να κατα-σκευάσουν συµβατά προϊόντα. Ωστόσο, ακόµα και στην περίπτωση των αυστη-ρά τυποποιηµένων γλωσσών, οι κατασκευαστές µεταγλωττιστών συχνά παρέ-χουν λειτουργίες, οι οποίες ονοµάζονται προεκτάσεις γλώσσας (language extensions), που δεν αποτελούν µέρος της τυπικής έκδοσης της γλώσσας. Αν

Page 23: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα

6.1 ΙΣΤΟΡΙΚΗ ΕΞΕΛΙΞΗ

347

ένας προγραµµατιστής εκµεταλλευτεί αυτές τις λειτουργίες, το πρόγραµµα που θα δηµιουργήσει δεν θα είναι συµβατό µε περιβάλλοντα στα οποία χρησιµο-ποιείται µεταγλωττιστής από διαφορετικό κατασκευαστή.

Σε όλη την ιστορία των γλωσσών προγραµµατισµού, το γεγονός ότι οι γλώσσες τρίτης γενιάς δεν παρέχουν πλήρη ανεξαρτησία από τη µηχανή δεν έ-χει και τόση σηµασία, για δύο λόγους. Πρώτον, βρίσκονται αρκετά κοντά στο στόχο αυτό, µε αποτέλεσµα το λογισµικό να µπορεί να µεταφερθεί από τη µία µηχανή στην άλλη µε σχετική ευκολία. ∆εύτερον, η απαίτηση για ανεξαρτησία από τη µηχανή αποδείχθηκε µόνον η αρχή για πιο σηµαντικούς στόχους. Πράγ-µατι, η συνειδητοποίηση του ότι οι µηχανές µπορούσαν να αποκριθούν σε εντο-λές υψηλού επιπέδου του τύπου

ανάθεσε στο ΣυνολικόΚόστο την τιµή Αξία + ΤαχυδροµικάΤέλη έκανε τους επιστήµονες των υπολογιστών να οραµατίζονται προγραµµατιστικά περιβάλλοντα τα οποία θα επέτρεπαν στους ανθρώπους να επικοινωνούν µε τις µηχανές µε πιο αφηρηµένο τρόπο, αντί να τις υποχρεώνουν να µεταφράζουν αυ-τές τις έννοιες σε ειδική µορφή. Ακόµα, οι επιστήµονες των υπολογιστών ήθε-λαν µηχανές οι οποίες θα µπορούσαν να εκτελούν ένα µεγάλο µέρος της διαδι-κασίας επινόησης των αλγορίθµων, και δεν θα περιορίζονταν µόνο στην εκτέλε-ση των αλγορίθµων. Το αποτέλεσµα είναι ένα συνεχώς αναπτυσσόµενο φάσµα από γλώσσες προγραµµατισµού οι οποίες θέτουν σε δοκιµασία τον σαφή τρόπο ταξινόµησης σε γενιές.

Προγραµµατιστικά µοντέλα Η προσέγγιση των γενιών στην ταξινόµηση των γλωσσών προγραµµατισµού βασίζεται σε µια γραµµική κλίµακα (Σχήµα 6.1), όπου η θέση µιας γλώσσας προσδιορίζεται από το βαθµό στον οποίο ο χρήστης έχει αποδεσµευτεί από τις λεπτοµέρειες της µηχανής και µπορεί να σκέφτεται σε όρους που σχετίζονται µε το πρόβληµα προς επίλυση. Στην πραγµατικότητα, η ανάπτυξη των γλωσσών προγραµµατισµού δεν εξελίχθηκε µε αυτόν τον τρόπο, αλλά προχώρησε από δι-αφορετικές διαδροµές καθώς εµφανίζονταν και ακολουθούνταν εναλλακτικές προσεγγίσεις στην προγραµµατιστική διαδικασία (τα λεγόµενα προγραµµατι-στικά µοντέλα — programming paradigms). Έτσι, η ιστορική ανάπτυξη των γλωσσών προγραµµατισµού αναπαρίσταται καλύτερα ως ένα διάγραµµα πολ-λών διαδροµών όπως αυτό του Σχήµατος 6.2, στο οποίο διαφορετικές διαδροµές που προέρχονται από διαφορετικά µοντέλα κάνουν την εµφάνισή τους και εξε-λίσσονται ανεξάρτητα η µία από την άλλη. Πιο συγκεκριµένα, το σχήµα παρου-σιάζει τέσσερις διαδροµές που αναπαριστούν το συναρτησιακό, το αντικειµενο-στρεφές, το προστακτικό, και το δηλωτικό µοντέλο, ενώ οι διάφορες γλώσσες που σχετίζονται µε κάθε µοντέλο είναι τοποθετηµένες µε τρόπο ο οποίος να προσδιορίζει την εµφάνισή τους σε σχέση µε τις άλλες γλώσσες. (Αυτό δεν ση-µαίνει απαραίτητα ότι µια γλώσσα προήλθε από κάποια προηγούµενη.)

Page 24: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα

ΚΕΦΑΛΑΙΟ 6 ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

348

Σχήµα 6.1 Γενιές των γλωσσών προγραµµατισµού

Θα πρέπει να σηµειώσουµε ότι, παρόλο που τα µοντέλα τα οποία αναφέρο-νται στο Σχήµα 6.2 ονοµάζονται προγραµµατιστικά µοντέλα, διαθέτουν προε-κτάσεις πέρα από την προγραµµατιστική διαδικασία. Αναπαριστούν θεµελιω-δώς διαφορετικές προσεγγίσεις στην κατασκευή λύσεων σε προβλήµατα, και συνεπώς επηρεάζουν ολόκληρη τη διαδικασία ανάπτυξης λογισµικού. Με αυτή την έννοια, ο όρος προγραµµατιστικό µοντέλο είναι λανθασµένος. Ένας πιο ρεα-λιστικός όρος θα ήταν µοντέλο ανάπτυξης λογισµικού.

Το προστακτικό µοντέλο (imperative paradigm), το οποίο είναι γνωστό και ως διαδικασιακό µοντέλο (procedural paradigm), αναπαριστά την παραδοσια-κή προσέγγιση στην προγραµµατιστική διαδικασία. Το προστακτικό µοντέλο είναι αυτό στο οποίο βασίστηκε ο ψευδοκώδικάς µας του Κεφαλαίου 5, καθώς και η γλώσσα µηχανής που περιγράφηκε στο Κεφάλαιο 2. Όπως υποδηλώνει το όνοµά του, το προστακτικό µοντέλο προσδιορίζει την προγραµµατιστική διαδι-κασία ως την ανάπτυξη µιας ακολουθίας εντολών, οι οποίες, όταν εκτελεστούν, χειρίζονται τα δεδοµένα ώστε να παράγουν το ζητούµενο αποτέλεσµα. Έτσι, για να προσεγγίσουµε την προγραµµατιστική διαδικασία µε το προστακτικό µοντέ-λο, πρέπει πρώτα να βρούµε τον αλγόριθµο για την επίλυση ενός συγκεκριµέ-νου προβλήµατος, και µετά να εκφράσουµε αυτόν τον αλγόριθµο ως µια ακο-λουθία εντολών.

Σχήµα 6.2 Η εξέλιξη των προγραµµατιστικών µοντέλων

Page 25: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα

6.1 ΙΣΤΟΡΙΚΗ ΕΞΕΛΙΞΗ

349

Αντίθετα µε το προστακτικό µοντέλο, το δηλωτικό µοντέλο (declarative paradigm) ζητάει από τον προγραµµατιστή να περιγράψει το ίδιο το πρόβληµα προς επίλυση και όχι έναν αλγόριθµο ο οποίος θα πρέπει να ακολουθηθεί. Πιο συγκεκριµένα, ένα σύστηµα δηλωτικού προγραµµατισµού εφαρµόζει έναν προ-καθορισµένο αλγόριθµο επίλυσης προβληµάτων γενικής χρήσης για να λύσει τα προβλήµατα που του παρουσιάζονται. Σε ένα τέτοιο περιβάλλον, η δουλειά του προγραµµατιστή είναι η ανάπτυξη µιας λεπτοµερούς δήλωσης του προβλήµατος και όχι η περιγραφή ενός αλγορίθµου για τη λύση του.

Μια µεγάλη δυσκολία στην ανάπτυξη προγραµµατιστικών συστηµάτων τα οποία βασίζονται στο δηλωτικό µοντέλο είναι η ανάγκη για κάποιον υποκείµενο αλγόριθµο επίλυσης προβληµάτων. Για το λόγο αυτόν, οι πρώτες δηλωτικές γλώσσες προγραµµατισµού ήταν περισσότερο ειδικής φύσης, σχεδιασµένες να χρησιµοποιούνται σε συγκεκριµένες εφαρµογές. Για παράδειγµα, εδώ και πολλά χρόνια η δηλωτική προσέγγιση χρησιµοποιείται στην προσοµοίωση συστηµά-των (πολιτικών, οικονοµικών, περιβαλλοντολογικών, κ.λπ.) µε σκοπό τον έλεγ-χο υποθέσεων ή την πραγµατοποίηση εκτιµήσεων. Σε αυτές τις περιπτώσεις, ο υποκείµενος αλγόριθµος είναι στην ουσία η διαδικασία της προσοµοίωσης της παρόδου του χρόνου µε τον επαναλαµβανόµενο επανυπολογισµό των τιµών των παραµέτρων (ακαθάριστο εθνικό προϊόν, εµπορικό έλλειµµα, κ.ο.κ.) έχοντας ως βάση τις προηγούµενες υπολογισµένες τιµές. Έτσι, η υλοποίηση µιας δηλωτικής γλώσσας για τέτοιες προσοµοιώσεις απαιτεί καταρχήν την κατασκευή ενός αλ-γορίθµου ο οποίος θα εκτελεί αυτή την επαναλαµβανόµενη διαδικασία. Κατό-πιν, το µόνο που έχει να κάνει ο προγραµµατιστής που χρησιµοποιεί το σύστηµα είναι να περιγράψει την κατάσταση που θα προσοµοιωθεί. Με αυτόν τον τρόπο, ένας µετεωρολόγος δεν χρειάζεται να αναπτύξει κάποιον αλγόριθµο που να προ-βλέπει τον καιρό, αλλά απλώς να περιγράψει την τρέχουσα καιρική κατάσταση, επιτρέποντας στον υποκείµενο αλγόριθµο προσοµοίωσης να παράγει καιρικές προβλέψεις για το κοντινό µέλλον.

Το δηλωτικό µοντέλο γνώρισε τεράστια πρόοδο όταν διαπιστώθηκε ότι ο τοµέας της τυπικής λογικής στα µαθηµατικά παρέχει έναν απλό αλγόριθµο επί-λυσης προβληµάτων κατάλληλο για δηλωτικά προγραµµατιστικά συστήµατα γενικής χρήσης. Το αποτέλεσµα είναι η συνεχώς αυξανόµενη προσοχή στο δη-λωτικό µοντέλο και η εµφάνιση του λογικού προγραµµατισµού, ενός θέµατος το οποίο περιγράφουµε στην Ενότητα 6.7.

Ένα άλλο µοντέλο προγραµµατισµού είναι το συναρτησιακό µοντέλο (functional paradigm). Το µοντέλο αυτό αντιµετωπίζει τα προγράµµατα ως ο-ντότητες οι οποίες δέχονται εισόδους και παράγουν εξόδους. Οι µαθηµατικοί αναφέρονται σε αυτές τις οντότητες µε τον όρο συναρτήσεις, και για το λόγο αυτόν η συγκεκριµένη προσέγγιση ονοµάστηκε συναρτησιακό µοντέλο. Βάσει αυτού του µοντέλου, ένα πρόγραµµα κατασκευάζεται µε τη σύνδεση µικρότε-ρων προκαθορισµένων προγραµµατιστικών µονάδων (προκαθορισµένων συ-ναρτήσεων) έτσι ώστε οι έξοδοι κάθε µονάδας να χρησιµοποιούνται ως είσοδοι σε µια άλλη µονάδα, κατά τρόπο που να παρέχει την επιθυµητή συνολική σχέση

Page 26: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα

ΚΕΦΑΛΑΙΟ 6 ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

350

εισόδου προς έξοδο. Με λίγα λόγια, η προγραµµατιστική διαδικασία µε βάση το συναρτησιακό µοντέλο είναι η κατασκευή συναρτήσεων µε τη µορφή ένθετων “συµπλεγµάτων” από απλούστερες συναρτήσεις.

Ως ένα παράδειγµα, το Σχήµα 6.3 παρουσιάζει τον τρόπο µε τον οποίο µπο-ρείτε να κατασκευάσετε µια συνάρτηση για τον υπολογισµό του υπολοίπου του µπλοκ επιταγών σας από δύο απλούστερες συναρτήσεις. Η µία από αυτές, µε όνοµα Find_sum, δέχεται ως είσοδο κάποιες τιµές και παράγει ως έξοδο το ά-θροισµά τους. Η άλλη, µε όνοµα Find_diff, δέχεται δύο τιµές εισόδου και υπο-λογίζει τη διαφορά τους. Η δοµή που παρουσιάζεται στο Σχήµα 6.3 µπορεί να εκφραστεί στη γλώσσα προγραµµατισµού LISP (µια πολύ σηµαντική συναρτη-σιακή γλώσσα) µε την παράσταση

(Find_diff (Find_sum Old_balance Credits) (Find_sum Debits)) Η ένθετη δοµή αυτής της παράστασης (όπως υποδεικνύεται από τις παρενθέ-σεις) αντικατοπτρίζει το γεγονός ότι οι είσοδοι της συνάρτησης Find_diff δη-µιουργούνται από δύο εφαρµογές της Find_sum. Η πρώτη εφαρµογή της Find_sum (Εύρεση αθροίσµατος) παράγει ως αποτέλεσµα το άθροισµα όλων των πιστώσεων (Credits) στη µεταβλητή Old_balance (Παλιό άθροισµα). Η δεύτερη εφαρµογή της Find_sum υπολογίζει το σύνολο όλων των χρεώσεων (Debits). Στη συνέχεια, η συνάρτηση Find_diff (Εύρεση διαφοράς) χρησιµοποιεί αυτά τα α-ποτελέσµατα για να δώσει το νέο υπόλοιπο του µπλοκ επιταγών.

Σχήµα 6.3 Μια συνάρτηση για τον υπολογισµό του υπολοίπου µπλοκ επιταγών η οποία έχει κατασκευαστεί από απλούστερες συναρτήσεις

Page 27: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα

6.1 ΙΣΤΟΡΙΚΗ ΕΞΕΛΙΞΗ

351

Για να καταλάβετε καλύτερα τη διαφορά µεταξύ του συναρτησιακού και του προστακτικού µοντέλου, θα συγκρίνουµε το συναρτησιακό πρόγραµµα για το υπόλοιπο του µπλοκ επιταγών µε το ακόλουθο πρόγραµµα σε ψευδοκώδικα που δηµιουργήθηκε µε βάση το προστακτικό µοντέλο:

Total_credits ← γενικό άθροισµα Credits Temp_balance ← Old_balance + Total_credits Total_debits ← γενικό άθροισµα Debits Balance ← Temp_balance – Total_debits

Παρατηρήστε ότι αυτό το προστακτικό πρόγραµµα αποτελείται από πολλές ε-ντολές, καθεµία από τις οποίες ζητάει να εκτελεστεί ένας υπολογισµός και να αποθηκευτεί το αποτέλεσµά του για µελλοντική χρήση. Αντίθετα, το συναρτη-σιακό πρόγραµµα αποτελείται από µία µόνο εντολή, στην οποία το αποτέλεσµα κάθε υπολογισµού διοχετεύεται άµεσα στον επόµενο. Κατά µια έννοια, το προ-στακτικό πρόγραµµα είναι ανάλογο µε µια οµάδα εργοστασίων, καθένα από τα οποία µετατρέπει τις πρώτες ύλες του σε προϊόντα που αποθηκεύονται σε απο-θήκες εµπορευµάτων. Από αυτές τις αποθήκες, τα προϊόντα στέλνονται αργότε-ρα σε άλλα εργοστάσια ανάλογα µε τις ανάγκες. Ωστόσο, το συναρτησιακό πρόγραµµα είναι ανάλογο µε µια οµάδα εργοστασίων τα οποία συντονίζονται έτσι ώστε καθένα να παράγει µόνο εκείνα τα προϊόντα που παραγγέλλονται από άλλα εργοστάσια, και κατόπιν να στέλνει αµέσως αυτά τα προϊόντα στους προ-ορισµούς τους χωρίς ενδιάµεση αποθήκευση. Αυτή η αποδοτικότητα αποτελεί ένα από τα πλεονεκτήµατα που προτάσσουν οι υπέρµαχοι του συναρτησιακού µοντέλου.

Ένα ακόµα προγραµµατιστικό µοντέλο (το σηµαντικότερο στη σύγχρονη ανάπτυξη λογισµικού) είναι το αντικειµενοστρεφές µοντέλο (object-oriented paradigm), το οποίο σχετίζεται µε µια προγραµµατιστική διαδικασία που ονο-µάζεται αντικειµενοστρεφής προγραµµατισµός (object-oriented programming, OOP). Το µοντέλο αυτό αντιµετωπίζει ένα σύστηµα λογισµικού ως συλλογή από µονάδες, τα λεγόµενα αντικείµενα (objects), καθένα από τα οποία είναι σε θέση να εκτελεί τις ενέργειες που σχετίζονται άµεσα µε τον εαυτό του, καθώς και να ζητάει την εκτέλεση ενεργειών από άλλα αντικείµενα. Όλα µαζί, αυτά τα αντικείµενα αλληλεπιδρούν για να λύσουν το συγκεκριµένο πρόβληµα.

Ως ένα παράδειγµα της αντικειµενοστρεφούς προσέγγισης σε δράση, σκε-φθείτε την εργασία της ανάπτυξης µιας γραφικής διασύνδεσης χρήστη. Σε ένα αντικειµενοστρεφές περιβάλλον, τα εικονίδια που εµφανίζονται στην οθόνη θα υλοποιούνταν ως αντικείµενα. Κάθε ένα από αυτά τα αντικείµενα θα περιείχε µια συλλογή από διαδικασίες (στην αντικειµενοστρεφή διάλεκτο λέγονται µέ-θοδοι) οι οποίες περιγράφουν τον τρόπο που το συγκεκριµένο αντικείµενο απο-κρίνεται στα διάφορα συµβάντα, όπως η επιλογή του µε πάτηµα του πλήκτρου του ποντικιού ή η µετακίνησή του στην οθόνη µε το ποντίκι. Έτσι, ολόκληρο το σύστηµα θα κατασκευαζόταν ως ένα σύνολο αντικειµένων, καθένα από τα ο-ποία γνωρίζει πώς να αποκρίνεται στα συµβάντα που σχετίζονται µε αυτό.

Page 28: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα

ΚΕΦΑΛΑΙΟ 6 ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

352

Για να συγκρίνετε το αντικειµενοστρεφές µοντέλο µε το προστακτικό µοντέ-λο, φανταστείτε ένα πρόγραµµα που σχετίζεται µε µια λίστα ονοµάτων. Στο πα-ραδοσιακό προστακτικό µοντέλο, η λίστα αυτή θα ήταν απλώς ένα σύνολο δε-δοµένων. Για να προσπελάσει τη λίστα κάποια προγραµµατιστική µονάδα, θα έπρεπε να διαθέτει τους αλγορίθµους που εκτελούν τους απαιτούµενους υπολο-γισµούς. Στο αντικειµενοστρεφές µοντέλο, τώρα, η λίστα θα είχε κατασκευα-στεί ως ένα αντικείµενο το οποίο αποτελείται από την ίδια τη λίστα µαζί µε ένα σύνολο διαδικασιών για το χειρισµό της. (Στο σύνολο αυτό µπορεί να περιλαµ-βάνονται διαδικασίες για την εισαγωγή µιας νέας καταχώρισης στη λίστα, τη δι-αγραφή µιας καταχώρισης από τη λίστα, τον έλεγχο για το αν η λίστα είναι ά-δεια, και για την ταξινόµηση της λίστας.) Συνεπώς, µια άλλη προγραµµατιστική µονάδα η οποία χρειάζεται να χειριστεί τη λίστα δεν θα περιέχει αλγορίθµους για την εκτέλεση αυτών των εργασιών. Αντίθετα, θα χρησιµοποιεί τις διαδικα-σίες που παρέχει το αντικείµενο. Κατά µια έννοια, αντί η προγραµµατιστική µο-νάδα να ταξινοµήσει τη λίστα όπως στο προστακτικό µοντέλο, της ζητάει να τα-ξινοµηθεί µόνη της.

Αν και το αντικειµενοστρεφές µοντέλο θα περιγραφεί λεπτοµερέστερα στην Ενότητα 6.5, η σηµασία που έχει σήµερα για το χώρο της ανάπτυξης λογισµικού µάς υποχρεώνει να συµπεριλάβουµε σε αυτή την εισαγωγή την έννοια της κλά-σης. Θυµηθείτε ότι ένα αντικείµενο µπορεί να αποτελείται από δεδοµένα (όπως µια λίστα ονοµάτων) µαζί µε µια συλλογή µεθόδων οι οποίες εκτελούν δραστη-ριότητες (όπως η εισαγωγή νέων ονοµάτων στη λίστα). Αυτές οι λειτουργίες πρέπει να περιγραφούν από εντολές στο πρόγραµµα. Μια τέτοια περιγραφή των ιδιοτήτων ενός αντικειµένου ονοµάζεται κλάση (class). Από τη στιγµή που θα κατασκευαστεί µια κλάση, µπορεί να εφαρµοστεί οποιαδήποτε στιγµή χρειαστεί ένα αντικείµενο µε τα συγκεκριµένα χαρακτηριστικά. Συνεπώς, πολλά αντικεί-µενα µπορούν να χρησιµοποιήσουν ως βάση (δηλαδή, να κατασκευαστούν από) την ίδια κλάση. Όπως ακριβώς δύο δίδυµα αδέλφια, αυτά τα αντικείµενα θα α-ποτελούν ανεξάρτητες οντότητες αλλά θα διαθέτουν τα ίδια χαρακτηριστικά, αφού θα έχουν κατασκευαστεί από το ίδιο πρότυπο (την ίδια κλάση). (Ένα αντι-κείµενο που βασίζεται σε µια συγκεκριµένη κλάση λέγεται ότι αποτελεί στιγ-µιότυπο — instance — της κλάσης αυτής.)

Επειδή τα αντικείµενα αποτελούν σαφώς καθορισµένες µονάδες µε περιγρα-φές οι οποίες έχουν αποµονωθεί σε επαναχρησιµοποιήσιµες κλάσεις, το αντι-κειµενοστρεφές µοντέλο έχει αποκτήσει µεγάλη δηµοτικότητα. Πράγµατι, οι οπαδοί του αντικειµενοστρεφούς προγραµµατισµού υποστηρίζουν ότι το συγκε-κριµένο µοντέλο παρέχει ένα φυσικό περιβάλλον στην προσέγγιση της “δοµικής µονάδας” κατά την ανάπτυξη λογισµικού. Οραµατίζονται βιβλιοθήκες λογισµι-κού µε έτοιµες κλάσεις από τις οποίες θα µπορούν να κατασκευάζονται νέα συ-στήµατα, µε τον ίδιο τρόπο που πολλά συµβατικά προϊόντα κατασκευάζονται από έτοιµα εξαρτήµατα. Όπως θα µάθουµε στο Κεφάλαιο 7, η κατασκευή και η επέκταση τέτοιων βιβλιοθηκών αποτελεί µια διαδικασία που βρίσκεται σε εξέ-λιξη.

Page 29: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα

6.2 ΠΑΡΑ∆ΟΣΙΑΚΕΣ ΕΝΝΟΙΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

353

Κλείνοντας, θα πρέπει να σηµειώσουµε ότι οι διαδικασίες στο εσωτερικό ε-νός αντικειµένου είναι ουσιαστικά µικρές προστακτικές προγραµµατιστικές µο-νάδες. Αυτό σηµαίνει ότι οι περισσότερες γλώσσες προγραµµατισµού που βασί-ζονται στο αντικειµενοστρεφές µοντέλο περιέχουν πολλές από τις λειτουργίες που συναντάµε στις προστακτικές γλώσσες. Για παράδειγµα, η δηµοφιλής αντι-κειµενοστρεφής γλώσσα C++ έχει δηµιουργηθεί µε την προσθήκη αντικειµενο-στρεφών λειτουργιών στην προστακτική γλώσσα C. Ακόµα, καθώς η Java και η C# αποτελούν παράγωγα της C++, έχουν επίσης κληρονοµήσει αυτόν τον προ-στακτικό πυρήνα. Στις Ενότητες 6.2 και 6.3 θα εξερευνήσουµε πολλές από αυ-τές τις προστακτικές λειτουργίες, και παράλληλα θα περιγράψουµε µερικές έν-νοιες µε βάση τις οποίες κατασκευάζεται η µεγάλη πλειονότητα του σύγχρονου αντικειµενοστρεφούς λογισµικού. Μετά, στην Ενότητα 6.5, θα ασχοληθούµε µε λειτουργίες οι οποίες είναι µοναδικές στο αντικειµενοστρεφές µοντέλο.

ΕΡΩΤΗΣΕΙΣ & ΑΣΚΗΣΕΙΣ 1. Με ποια έννοια ένα πρόγραµµα που έχει γραφτεί σε µια γλώσσα προγραµµατισµού

τρίτης γενιάς είναι ανεξάρτητο από τη µηχανή; Με ποια έννοια εξαρτάται ακόµα από τη µηχανή;

2. Ποια είναι η διαφορά µεταξύ ενός συµβολοµεταφραστή και ενός µεταγλωττιστή; 3. Μπορούµε να συνοψίσουµε το προστακτικό προγραµµατιστικό µοντέλο λέγοντας

ότι δίνει έµφαση στην περιγραφή µιας διαδικασίας η οποία οδηγεί στην επίλυση του δεδοµένου προβλήµατος. ∆ώστε µια παρόµοια περίληψη του δηλωτικού, του συναρτησιακού, και του αντικειµενοστρεφούς µοντέλου.

4. Με ποια έννοια οι γλώσσες προγραµµατισµού τρίτης γενιάς είναι υψηλότερου επι-πέδου από τις γλώσσες προγραµµατισµού των προηγούµενων γενιών;

6.2 Παραδοσιακές έννοιες προγραµµατισµού Στην ενότητα αυτή θα ασχοληθούµε µε µερικές από τις έννοιες που συναντάµε τόσο στις προστακτικές όσο και στις αντικειµενοστρεφείς γλώσσες προγραµµα-τισµού. Για το σκοπό αυτόν θα χρησιµοποιήσουµε παραδείγµατα από τις γλώσ-σες Ada, C, C++, C#, FORTRAN, και Java. Στόχος µας δεν είναι να εµπλακού-µε στις λεπτοµέρειες οποιασδήποτε συγκεκριµένης γλώσσας, αλλά απλώς να παρουσιάσουµε τα κοινά χαρακτηριστικά που συναντάµε στις διαδεδοµένες γλώσσες. Η συλλογή των γλωσσών µας εποµένως έχει επιλεγεί ώστε να είναι αντιπροσωπευτική της τρέχουσας κατάστασης. H C είναι προστακτική γλώσσα τρίτης γενιάς. Η C++ είναι αντικειµενοστρεφής γλώσσα η οποία δηµιουργήθηκε ως προέκταση της γλώσσας C. Η Java και η C# είναι αντικειµενοστρεφείς γλώσσες που προέρχονται από τη C++. (Η Java είναι προϊόν της Sun Microsys-tems, ενώ η C# αναπτύχθηκε από τη Microsoft.) Η FORTRAN και η Ada σχε-

Page 30: Περιεχόμενα - Publicτα βάσεων δεδοένων), 10(Γραφικά υπολογιστή), και 11(Τεχνητή νοηµοσύ νη). Στην αρχική σελίδα