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



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

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

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

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

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

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

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

6. 1 Η έννοια του προγράμματος

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

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

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

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

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

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

ΚΕΦΑΛΑΙΟ VI. Εισαγωγή στον προγραμματισμό

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

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

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

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

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

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

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

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

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

ΚΑΤΑΝΟΗΣΗ ΑΝΑΛΥΣΗ ΕΠΙΛΥΣΗ. Ο προγραμματισμός ασχολείται με το σύνολο των εντολών που δίνονται στον υπολογιστή ώστε να υλοποιείται ο αλγόριθμος.

6. Εισαγωγή στον προγραµµατισµό

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

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

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

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

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

Ενότητα 2 ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

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

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ Κεφάλαιο 6 ο

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

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

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

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

Περιεχόµενα. Ανασκόπηση - Ορισµοί. Ο κύκλος ανάπτυξης προγράµµατος. Γλώσσες Προγραµµατισµού Ασκήσεις

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

Αντικειμενοστρεφής Προγραμματισμός -Python. Κ.Π. Γιαλούρης

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

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Εισαγωγή στην Πληροφορική Προγραμματισμός-Λειτουργικά

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

Π ρ ο γ ρ α μ μ α τ ι σ μ ό ς Β α σ ι κ έ ς έ ν ν ο ι ε ς Ι σ τ ο ρ ι κ ή α ν α δ ρ ο μ ή Η έννοια του προγράμματος Ιστορική αναδρομή

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

Σύνοψη Θεωρίας ΟΡΙΣΜΟΣ ΚΑΙ ΧΑΡΑΚΤΗΡΙΣΤΙΚΑ ΑΛΓΟΡΙΘΜΩΝ

Κεφ. 1: Εισαγωγή στην έννοια του Αλγορίθμου και στον Προγραμματισμό. Η έννοια του προβλήματος

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

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

Τεχνικές σχεδίασης προγραμμάτων, Προγραμματιστικά Περιβάλλοντα

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

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

ΕΙΣΑΓΩΓΗ ΣΤOΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

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

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

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

Κεφάλαιο 7 Προγραμματισμός υπολογιστή

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

Συμβολική γλώσσα Εκπαιδευτικού Υπολογιστή - Λογισμικό Υπολογιστών

Επιλέξτε Σωστό ή Λάθος για καθένα από τα παρακάτω:

.EVAL push bx Xor bx,bh Add si,ax.loop dec cx. 1. Fortran. 2. Cobol. 3. Algol

κ ε φ ά λ α ι ο 7 0 Α. Θ Ε Ω Ρ Ι Α Η έ ν ν ο ι α τ ο υ π ρ ο γ ρ ά µ µ α τ ο ς Ι σ τ ο ρ ι κ ή Α ν α δ ρ ο µ ή π α ρ α τ ή ρ η σ η

Γλώσσες Προγραμματισμού Μεταγλωττιστές

Κεφάλαιο 6 ο. Διαχείριση στοιχείων λογισμικού

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

ΚΕΦΑΛΑΙΟ 6. Περιβάλλοντα Ανάπτυξης Εφαρμογών. ΚΕΦΑΛΑΙΟ 6 Περιβάλλοντα Ανάπτυξης Εφαρμογών. Α Γενικού Λυκείου

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

Αρχές Προγραμματισμού Υπολογιστών

Μεταγλωττιστές Ενότητα 1: Εισαγωγή

ΙΑΓΩΝΙΣΜΑ ΣΤΗΝ ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΘΕΜΑ 1 Α.

Ενότητα 13. Εισαγωγή στην Πληροφορική. Κεφάλαιο 13Α. Αρχεία. Χειµερινό Εξάµηνο ρ. Παναγιώτης Χατζηδούκας (Π..407/80) προγραµµατισµός

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

Προγραμματισμός και Εφαρμογές Υπολογιστών

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

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Εισαγωγή στην επιστήμη των υπολογιστών

Βασίλειος Κοντογιάννης ΠΕ19

Κεφάλαιο 7. ΕΠΑΛ Σύμης Εφαρμογές πληροφορικής Ερωτήσεις επανάληψης

7 ο ΓΕΛ Καλλιθέας Οδηγός Α.Ε.Π.Π. ΚΕΦΑΛΑΙΟ 6 ο

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

Εισαγωγή στον δομημένο προγραμματισμό

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 1 Ο. Εισαγωγή στις έννοιες Πρόβλημα, Αλγόριθμος, Προγραμματισμός, Γλώσσες Προγραμματισμού

Βασικές Αρχές Προγραμματισμού

Εισαγωγή στην επιστήμη των υπολογιστών. Λογισμικό Υπολογιστών Κεφάλαιο 9ο Γλώσσες Προγραμματισμού

Οργάνωση επεξεργαστή (1 ο μέρος) ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική

Προγραµµατισµός Η/Υ. Μέρος2

Κεφάλαιο 6 Εισαγωγή στον Προγραμματισμό. 26-Jun-15 ΑΕΠΠ - Καραμαούνας Π. 1

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

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

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

Μέρος Α. Λογισµικό & Προγράµµατα συστήµατος και εφαρµογών ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ. Το σηµερινό µάθηµα. Λογισµικό συστηµάτων & εφαρµογών

Εργαστήρι Πληροφορικής Αλγόριθµος 92 Σηµειώσεις Τεχνολογικής Κατεύθυνσης Γλώσσες µηχανής Αρχικά για να µπορέσει ο υπολογιστής να εκτελέσει µία οποιαδή

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

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

Ας δούμε λίγο την θεωρία με την οποία ασχοληθήκαμε μέχρι τώρα.

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

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

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

Transcript:

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

6 ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ 6.1 Γλώσσες Προγραμματισμού 6.1.1 Γλώσσες μηχανής (1 η γενιά) Η γλώσσα στην οποία ένας ηλεκτρονικός υπολογιστής καταλαβαίνει εντολές που πρέπει να εκτελέσει λέγεται γλώσσα μηχανής. Για παράδειγμα, στο κεφάλαιο 5 είδαμε ένα πρόγραμμα πρόσθεσης δυο αριθμών που αποτελούνταν από τέσσερις εντολές (LOAD X ADD Y STORE Z STOP). Αυτό ήταν μια απλούστευση που κάναμε στο σημείο εκείνο για να μπορέσουμε να εξηγήσουμε τη λειτουργία της ΚΜΕ. Στην πραγματικότητα, καμία ΚΜΕ δε θα μπορούσε να κατανοήσει το παραπάνω πρόγραμμα, αφού το μόνο που καταλαβαίνει είναι η γλώσσα μηχανής της, η οποία αποτελείται από εντολές κωδικοποιημένες σε μηδέν και ένα. Το σχήμα που ακολουθεί δείχνει πως θα μπορούσε να είναι στην πραγματικότητα το πρόγραμμα αυτό γραμμένο σε γλώσσα μηχανής. Γλώσσα μηχανής Συμβολική γλώσσα Επεξήγηση 0010 0010 0110 0010 0110 0111 0010 1000 1010 1111 1111 0000 LOAD X ADD Y STORE Z STOP o Οι εντολές κωδικοποιούνται σε οκτώ δυαδικά ψηφία (π.χ. η LOAD είναι 0010 0010) o Οι διευθύνσεις μνήμης κωδικοποιούνται σε τέσσερα δυαδικά ψηφία (όπως στο παράδειγμα του Κεφαλαίου 5) Πίνακας 6.1:Πρόγραμμα πρόσθεσης δυο αριθμών σε γλώσσα μηχανής (αριστερά) και συμβολική γλώσσα (στη μέση) Οι πρώτοι προγραμματιστές έπρεπε να γράφουν τα προγράμματα τους σε τέτοιες μεγάλες και δυσνόητες ακολουθίες από μηδέν και ένα. Αυτό φυσικά έκανε το έργο του προγραμματισμού ιδιαίτερα δύσκολο και τη διόρθωση λαθών μια τιτάνια προσπάθεια. Ακόμα, ένα πρόγραμμα ήταν κωδικοποιημένο στο σύνολο εντολών (instruction set) της μηχανής για την οποία γράφονταν και δε μπορούσε να εκτελεστεί σε άλλο υπολογιστή ο οποίος είχε διαφορετικό σύνολο εντολών (για παράδειγμα, η εντολή 0010 0010 μπορεί να σήμαινε ΦΟΡΤΩΣΕ στον υπολογιστή μας αλλά ΕΚΤΕΛΕΣΕ ΔΕΞΙΑ ΟΛΙΣΘΗΣΗ σε ένα άλλο υπολογιστή). Αυτό σήμαινε ότι προγράμματα γραμμένα σε γλώσσα μηχανής δεν είχαν μεταφερσιμότητα, δηλαδή δεν μπορούσαν να μεταφερθούν και να εκτελεστούν σε οποιοδήποτε υπολογιστή. Για τους λόγους αυτούς, ο προγραμματισμός σε γλώσσα μηχανής δεν εξασκείται πια παρά μόνο σε πολύ εξειδικευμένες περιπτώσεις (για παράδειγμα, απευθείας προγραμματισμός ολοκληρωμένων κυκλωμάτων). Αντίθετα, αναπτύχθηκαν και εξελίχθηκαν διάφορα είδη γλωσσών προγραμματισμού που θα δούμε στις επόμενες ενότητες,

ΑΡΧΕΣ ΛΕΙΤΟΥΡΓΙΑΣ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ώστε οι χρήστες να μπορούν να γράφουν εύχρηστα και ευνόητα προγράμματα σε γλώσσα που να μπορούν να την καταλάβουν. 6.1.2 Συμβολικές γλώσσες (2 η γενιά) Επειδή η γλώσσα μηχανής είναι εξαιρετικά δύσκολη τόσο στην κατανόησή της όσο και στη χρήση της, από τα πρώτα χρόνια του προγραμματισμού άρχισαν να γίνονται προσπάθειες για τη δημιουργία μιας συμβολικής γλώσσας, η οποία θα μπορεί να μεταφράζεται εύκολα από τον υπολογιστή σε ακολουθίες από 0 και 1, ενώ παράλληλα θα είναι και κατανοητή στον άνθρωπο. Η γλώσσα αυτή ονομάστηκε συμβολική γλώσσα (assembly). Ο προγραμματισμός σε assembly γίνεται ουσιαστικά απευθείας στο σύνολο εντολών του υπολογιστή, με τη διαφορά ότι χρησιμοποιούνται συμβολικά ονόματα αντί για ακολουθίες ψηφίων. Κάθε συμβολικό όνομα αντιστοιχεί ακριβώς σε μια εντολή γλώσσας μηχανής και έτσι υπάρχει μια-προς-μια αντιστοιχία μεταξύ των εντολών ενός προγράμματος γραμμένου σε assembly και του αντίστοιχου προγράμματος σε γλώσσα μηχανής. Το παράδειγμα προγράμματος που χρησιμοποιήσαμε παραπάνω δείχνει και τη μορφή της assembly. Για παράδειγμα, ο προγραμματιστής, αντί να πρέπει να θυμάται ότι η εντολή πρόσθεσης των περιεχομένων μιας θέσης μνήμης σε αυτά του συσσωρευτή είναι 0010 0110 (δες τον Πίνακα 9.1), χρησιμοποιεί την εντολή ADD που είναι πολύ πιο εύκολη στην απομνημόνευση και χρήση. Το έργο της μετάφρασης ενός προγράμματος από assembly σε γλώσσα μηχανής το αναλαμβάνει ένα ειδικό πρόγραμμα, ο συμβολομεταφραστής (assembler). Η χρήση του assembler έχει ένα σημαντικό πλεονέκτημα: αυξάνει τη μεταφερσιμότητα των προγραμμάτων, καθώς ο προγραμματιστής δε χρειάζεται πια να γνωρίζει τον τρόπο που κωδικοποιούνται οι εντολές γλώσσας μηχανής σε κάθε υπολογιστή. Αντίθετα, χρησιμοποιώντας απλά τον assembler κάθε υπολογιστή, η μετάφραση των συμβολικών εντολών στις σωστές εντολές μηχανής γίνεται αυτόματα. Αυτό βέβαια σημαίνει ότι πρέπει να υπάρχει διαφορετικός assembler για κάθε διαφορετικό τύπο μηχανής. Το παρακάτω σχήμα δείχνει αυτή τη διαδικασία. Όπως φαίνεται από το σχήμα, η χρήση των συμβολικών γλωσσών προγραμματισμού έχει δυο μεγάλα πλεονεκτήματα για τον προγραμματιστή: όχι μόνο δε χρειάζεται αυτός να θυμάται τον τρόπο κωδικοποίησης κάθε εντολής σε γλώσσα μηχανής, αλλά δε χρειάζεται και να ασχολείται με τις διαφορές μεταξύ των μηχανών. Αντίθετα, γράφει μόνο ένα πρόγραμμα το οποίο θα εκτελείται σωστά σε κάθε υπολογιστή, αφού μεταφραστεί στο σωστό σετ εντολών γλώσσας μηχανής από τον κατάλληλο μεταφραστή. LOAD X ADD Y STORE Z STOP Πρόγραμμα (assembly) Ένα κοινό πρόγραμμα σε assembly Διαφορετικοί assembler για κάθε υπολογιστή Assembler 1 Assembler 2 Assembler 3 Υπολογιστής 1 0010 0010 0110 0010 0110 0111 0010 1000 1010 1111 1111 0000 Υπολογιστής 2 1100 0010 0110 1111 1111 0111 0010 1000 1010 0000 0000 0000 Υπολογιστής 3 0110 0110 0110 0011 0110 0111 1011 1111 1010 0000 0000 1111 Σχήμα 6.1: Μετάφραση προγραμμάτων σε γλώσσα μηχανής Διαφορετικά παραγόμενα προγράμματα σε γλώσσα μηχανής Στην περίπτωση του assembler, το πλεονέκτημα αυτό είναι δυστυχώς κυρίως θεωρητικό αφού διαφορετικές αρχιτεκτονικές υπολογιστών υποστηρίζουν διαφορετικά σύνολα εντολών γλώσσας μηχανής. Όμως, αποτελεί το κύριο πλεονέκτημα των γλωσσών προγραμματισμού υψηλού επιπέδου που θα δούμε αμέσως παρακάτω. -144-

Κεφάλαιο 6: ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ 6.1.3 Γλώσσες υψηλού επιπέδου (3 η γενιά) Η συμβολική γλώσσα βελτίωσε σημαντικά το έργο του προγραμματισμού, όμως συνέχιζε να έχει ένα πολύ σημαντικό μειονέκτημα. Επειδή ο προγραμματισμός γίνονταν ακόμα σε επίπεδο εντολών της γλώσσας μηχανής, έστω κι αν αυτές γράφονταν συμβολικά, τα προγράμματα ήταν μεγάλα σε μέγεθος και δυσνόητα καθώς έπρεπε να γραφτούν πολλές εντολές ακόμα και για απλές διαδικασίες. Για παράδειγμα, η απλή πρόσθεση δυο αριθμών απαιτούσε τρεις εντολές (LOAD X ADD Y STORE Z), ενώ θα μπορούσε να γραφτεί πολύ πιο απλά, για παράδειγμα ως Z = X + Y (δηλαδή, θέσε στη θέση μνήμης Ζ το άθροισμα των περιεχομένων των θέσεων X και Y). Έτσι, άρχισαν προσπάθειες δημιουργίας αφαιρετικών γλωσσών προγραμματισμού, δηλαδή γλωσσών που θα έκαναν το έργο συγγραφής προγραμμάτων ακόμα πιο εύκολο για τον προγραμματιστή, παρέχοντας εντολές που θα αντιστοιχούσαν σε ολόκληρες ομάδες εντολών της γλώσσας μηχανής (αντί της μια-προς-μια αντιστοίχισης που υποστηρίζει η assembly). Επειδή οι γλώσσες αυτές είναι πιο φιλικές στον προγραμματιστή, ονομάζονται γλώσσες υψηλού επιπέδου, σε αντίθεση με τη γλώσσα μηχανής και την assembly, που είναι πιο φιλικές στη μηχανή και ονομάζονται γλώσσες χαμηλού επιπέδου. Στα πλεονεκτήματα των γλωσσών προγραμματισμού υψηλού επιπέδου σε σχέση με τις συμβολικές γλώσσες μπορούν να αναφερθούν: Ο φυσικότερος τρόπος προγραμματισμού με χρήση ευκολομνημόνευτων εντολών. Η ευκολία εκμάθησης. Η ευκολία διόρθωσης λαθών (debugging) και συντήρησης των προγραμμάτων. Η ανεξαρτησία από τον τύπο του υπολογιστή (μεταφερσιμότητα των προγραμμάτων). Συνολικά οι γλώσσες υψηλού επιπέδου ελάττωσσαν σημαντικά το χρόνο και το κόστος παραγωγής νέων προγραμμάτων, αφού λιγότεροι προγραμματιστές μπορούν σε μικρότερο χρόνο να αναπτύξουν προγράμματα που χρησιμοποιούνται σε περισσότερους υπολογιστές. Το 1957 η IBM ανάπτυξε την πρώτη γλώσσα υψηλού επιπέδου, η οποία ονομάστηκε FORTRAN (από τις λέξεις formula translation). Η FORTRAN δημιουργήθηκε για την επίλυση μαθηματικών και επιστημονικών προβλημάτων και παρέχει ιδιαίτερα ισχυρές δομές αριθμητικής υψηλής ακρίβειας και χειρισμού πολύπλοκων μαθηματικών συναρτήσεων. Νεότερες εκδόσεις της χρησιμοποιούνται ακόμα και σήμερα σε επιστημονικές εφαρμογές. Το 1960 παρουσιάστηκε η γλώσσα COBOL (common business oriented language), η οποία, όπως υπονοεί και το όνομα της, δημιουργήθηκε για ανάπτυξη εμπορικών εφαρμογών. Οι εφαρμογές αυτές έχουν τελείως διαφορετικές απαιτήσεις από τις επιστημονικές, όπως χειρισμό αρχείων και βάσεων δεδομένων, παραγωγή αναφορών (reports) και άλλα. Η γλώσσα παρείχε σημαντικές διευκολύνσεις για το χειρισμό τέτοιων δεδομένων και για το λόγο αυτό έγινε πολύ δημοφιλής τις δεκαετίες του 1970 και 1980. Σήμερα δε χρησιμοποιείται πια. Μια από τις σημαντικότερες γλώσσες προγραμματισμού, η οποία δε γνώρισε ποτέ εμπορική επιτυχία, αλλά ο σχεδιασμός της επηρέασε ιδιαίτερα την ανάπτυξη μελλοντικών γλωσσών προγραμματισμού, είναι η ALGOL (algorithmic language) που πρωτοπαρουσιάστηκε το 1962 και σήμερα δε χρησιμοποιείται πια. Μια από τις πιο χαρακτηριστικές γλώσσες προγραμματισμού, που χρησιμοποιείται ακόμα και σήμερα, είναι η BASIC (beginner s all-purpose symbolic instruction code), η οποία παρουσιάστηκε το 1964 με σκοπό να αποτελέσει εργαλείο εκπαίδευσης προγραμματιστών. Η γλώσσα Pascal παρουσιάστηκε το 1971 και ο σχεδιασμός της στηρίχθηκε στην ALGOL. Η γλώσσα είναι κατάλληλη τόσο για εκπαίδευση όσο και για τη δημιουργία ισχυρών προγραμμάτων με κύριο χαρακτηριστικό της τη δυνατότητα δημιουργίας ιδιαίτερα δομημένων τμημάτων κώδικα. Χρησιμοποιήθηκε ευρέως ως πρώτη γλώσσα εκμάθησης προγραμματισμού για πολλά χρόνια, μέχρι που ξεπεράστηκε από γλώσσες όπως η C και η Java για το σκοπό αυτό. Μία ακόμη γλώσσα με μεγάλη διάδοση ακόμα και σήμερα, παρόλο που παρουσιάστηκε για πρώτη φορά το 1978, είναι η γλώσσα C. Η C σχεδιάστηκε αρχικά για τον προγραμματισμό λογισμικού συστήματος και χρησιμοποιήθηκε για την ανάπτυξη του λειτουργικού συστήματος Unix. Είναι γλώσσα με ιδιαίτερα ισχυρά χαρακτηριστικά, παρέχοντας ταυτόχρονα τα πλεονεκτήματα του δομημένου προγραμματισμού που είχε και η Pascal, αλλά και πολλές δυνατότητες εντολών χαμηλού επιπέδου, οι οποίες επιτρέπουν άμεση πρόσβαση στο υλικό του υπολογιστή. Η C αργότερα εξελίχτηκε σε διάφορες παραλλαγές, όπως η C++ και η C#, που είναι αντικειμενοστραφείς (objectoriented) γλώσσες (θα εξηγήσουμε τι σημαίνει αυτό στη συνέχεια του κεφαλαίου). Τα τελευταία χρόνια χρησιμοποιείται ιδιαίτερα η Java. Η Java είναι και αυτή μια αντικειμενοστραφής γλώσσα που αρχικά αναπτύχθηκε από την εταιρία Sun Microsystems με σκοπό την ανάπτυξη εφαρμογών που θα εκτελούνται σε κατανεμημένα περιβάλλοντα, για παράδειγμα σε υπολογιστές που είναι συνδεδεμένοι με το Διαδίκτυο. Έχει δανειστεί πολλά χαρακτηριστικά της C και της C++ και ένα από τα βασικά της χαρακτηριστικά είναι ότι επιτρέπει, εκτός από τη συγγραφή ανεξάρτητων εφαρμογών (applications), και τη συγγραφή μικροεφαρμογών (applets) που είναι ενσωματωμένες σε κώδικα HTML και εκτελούνται μέσα από οποιοδήποτε web browser έχει δυνατότητες Java. Τέλος, η Visual Basic είναι άλλη μια αντικειμενοστραφής (object-oriented) γλώσσα που επιτρέπει τη γρήγορη ανάπτυξη εφαρμογών με γραφικό περιβάλλον διεπαφής με το χρήστη. Οι χρήστες μπορούν να δημιουργήσουν απλά -145-

ΑΡΧΕΣ ΛΕΙΤΟΥΡΓΙΑΣ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ προγράμματα διαμορφώνοντας τμήματα (components) σε προσχεδιασμένες φόρμες, απλά ορίζοντας τη λειτουργικότητα των τμημάτων αυτών. Με άλλα λόγια, ένας προγραμματιστής μπορεί να δημιουργήσει ένα πρόγραμμα χωρίς να χρειαστεί να γράψει καθόλου κώδικα (αν και έχει φυσικά αυτή τη δυνατότητα εφόσον επιθυμεί). 6.1.4 Γλώσσες πολύ υψηλού επιπέδου (4 η γενιά) Η προσπάθεια να αναπτυχθούν γλώσσες προγραμματισμού ολοένα και φιλικότερες προς τον προγραμματιστή έχει οδηγήσει τα τελευταία χρόνια στην ανάπτυξη γλωσσών στις οποίες ο προγραμματιστής δε χρειάζεται σε πολλές περιπτώσεις να καθορίσει πως θα εκτελεστεί μια δραστηριότητα, αλλά πρέπει απλώς να ορίσει τι θέλει να γίνει. Για παράδειγμα, δε χρειάζεται να γραφτεί ένα πρόγραμμα που να δίνει στον υπολογιστή εντολές για το πως θα ταξινομηθούν τα περιεχόμενα ενός πίνακα, καθώς αρκεί να δοθεί μια εντολή να γίνει η ταξινόμηση και ο υπολογιστής αναλαμβάνει να την εκτελέσει. Για το λόγο αυτό, οι γλώσσες αυτές ονομάζονται γλώσσες πολύ υψηλού επιπέδου ή γλώσσες τέταρτης γενιάς, καθώς είναι ακόμα φιλικότερες προς τον προγραμματιστή. Μάλιστα, είναι τόσο φιλικές που μπορούν να χρησιμοποιηθούν όχι μόνο από προγραμματιστές αλλά και από απλούς χρήστες. Παράδειγμα τέτοιας γλώσσας αποτελεί η SQL. Η SQL (structured query language) είναι μια γλώσσα υποβολής ερωτημάτων σε βάσεις δεδομένων. Η γλώσσα έχει σχεδιαστεί για να υποστηρίζει τη δημιουργία και διαχείριση σχεσιακών βάσεων δεδομένων (relational databases) και παρέχει εργαλεία για την ανάκτηση και παρουσίαση υποσυνόλων από τα δεδομένα που περιέχονται σε τέτοιες βάσεις. Υποστηρίζεται από όλα σχεδόν τα συστήματα διαχείρισης βάσεων δεδομένων. 6.2 Ταξινόμηση γλωσσών προγραμματισμού Στην προηγούμενη ενότητα είδαμε μια χρονολογική ταξινόμηση των γλωσσών προγραμματισμού σε γλώσσες πρώτης, δεύτερης, τρίτης και τέταρτης γενιάς. Όμως οι γλώσσες προγραμματισμού μπορούν να ταξινομηθούν και με πολλά άλλα κριτήρια. Στην ενότητα αυτή θα δούμε συνοπτικά κάποιες τέτοιες ταξινομήσεις. Η βασικότερη κατηγοριοποίηση των γλωσσών προγραμματισμού μπορεί να γίνει με βάση τη φιλοσοφία προγραμματισμού που πρεσβεύουν. Έχουν αναπτυχθεί διάφορες τέτοιες φιλοσοφίες, κάθε μια εκ των οποίων μπορεί να ταιριάζει καλύτερα σε διαφορετικά είδη προβλημάτων ή/και στον τρόπο που βολεύει την προσέγγιση σε ότι αφορά τη λύση προβλημάτων διαφορετικών προγραμματιστών. Ας δούμε τις κατηγορίες των γλωσσών προγραμματισμού ανάλογα με αυτό το κριτήριο. Η πρώτη κατηγορία είναι οι διαδικασιακές (procedural) γλώσσες. Οι γλώσσες αυτές εκτελούν ακολουθίες βημάτων για την επίλυση κάποιου προβλήματος. Είναι γνωστές και ως προστακτικές γλώσσες γιατί κάθε εντολή τους αποτελεί και μια προσταγή προς τον υπολογιστή να εκτελέσει κάποια συγκεκριμένη ενέργεια. Ένα πρόγραμμα γραμμένο σε μια διαδικασιακή γλώσσα αποτελείται από διαδικασίες, οι οποίες επικοινωνούν μεταξύ τους και κάθε μια εκτελεί μια συγκεκριμένη δραστηριότητα. Ο διαδικασιακός τρόπος προγραμματισμού αποτελεί τον παραδοσιακό τρόπο με τον οποίο γράφονταν προγράμματα στις πρώτες δημοφιλής γλώσσες προγραμματισμού και χρησιμοποιείται κυρίως ακόμα και σήμερα. Χαρακτηριστικά παραδείγματα διαδικασιακών γλωσσών προγραμματισμού είναι οι Fortran, Cobol, Algol, Pascal και C. Τα τελευταία χρόνια έχει αρχίσει να γίνεται ιδιαίτερα δημοφιλής μια ακόμα κατηγορία γλωσσών προγραμματισμού, οι οποίες ονομάζονται αντικειμενοστραφείς γλώσσες (object-oriented languages). Ο αντικειμενοστραφής προγραμματισμός αποτελεί μια φιλοσοφία διαφορετική από αυτή του διαδικασιακού, καθώς στηρίζεται στα δεδομένα και όχι στις διαδικασίες. Στις αντικειμενοστραφείς γλώσσες τα δεδομένα ονομάζονται αντικείμενα (objects) και περιέχουν ενσωματωμένες στον ορισμό τους τις διαδικασίες που μπορούν να εφαρμοστούν σε κάθε αντικείμενο. Τα αντικείμενα επικοινωνούν μεταξύ τους και μπορούν να κληροδοτήσουν τις ιδιότητές τους σε άλλα αντικείμενα. Χαρακτηριστικά παραδείγματα αντικειμενοστραφών γλωσσών είναι η C++, η Visual Basic και η Java. Μια άλλη ακόμα κατηγορία γλωσσών που έχουν γίνει πολύ δημοφιλείς τα τελευταία χρόνια με την ανάπτυξη του Internet είναι οι γλώσσες σήμανσης ή παρουσίασης. Οι γλώσσες αυτές δεν είναι ακριβώς γλώσσες προγραμματισμού, με την έννοια ότι αποσκοπούν στον καθορισμό του τρόπου δόμησης ή εμφάνισης δεδομένων, παρά στην εκτέλεσή μιας διαδικασίας. Ενδεικτικά παραδείγματα γλωσσών σήμανσης αποτελούν οι γλώσσες XML (γλώσσα σήμανσης δεδομένων) και HTML (γλώσσα μορφοποίησης ιστοσελίδων, την οποία θα αναλύσουμε σε βάθος στο Κεφάλαιο 11). Τα υπόλοιπα είδη γλωσσών προγραμματισμού έχουν πιο συγκεκριμένες χρήσεις και για το λόγο αυτό είναι λιγότερο δημοφιλή. Σε αυτά ανήκουν: Οι συναρτησιακές γλώσσες (functional languages), όπου ένα πρόγραμμα έχει ουσιαστικά τη μορφή μιας μαθηματικής συνάρτησης. Χρησιμοποιούνται σε μαθηματικές εφαρμογές και χαρακτηριστικότερο παράδειγμα τους είναι η γλώσσα LISP. -146-

Κεφάλαιο 6: ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Οι λογικές γλώσσες (logic languages), που είναι γνωστές και ως δηλωτικές (declarative), χρησιμοποιούν λογικούς συλλογισμούς για τη δημιουργία προγραμμάτων. Χρησιμοποιούνται σε εφαρμογές τεχνητής νοημοσύνης και έχουν ως χαρακτηριστικό εκπρόσωπο τους τη γλώσσα PROLOG. Γλώσσες ερωταποκρίσεων (query languages), οι οποίες αποτελούνται από ερωτήματα προς τον υπολογιστή που καθορίζουν το επιθυμητό αποτέλεσμα αλλά όχι και το πως αυτό θα παραχθεί (το τελευταίο αποτελεί απόφαση του υπολογιστή). Χαρακτηριστικό παράδειγμα αποτελεί η γλώσσα SQL. Μια άλλη ταξινόμηση των γλωσσών προγραμματισμού μπορεί να γίνει με βάση το είδος των προβλημάτων τα οποία έχει σχεδιαστεί να λύνει κάθε γλώσσα. Με αυτό το κριτήριο διακρίνουμε τις γλώσσες σε γλώσσες γενικής χρήσης, οι οποίες θεωρητικά μπορούν να χρησιμοποιηθούν για την επίλυση οποιουδήποτε προβλήματος και περιλαμβάνουν γλώσσες όπως η Basic, η Pascal, η C και η Java. Από την άλλη μεριά, υπάρχουν οι γλώσσες ειδικής χρήσης που έχουν σχεδιαστεί ειδικά για συγκεκριμένα είδη προβλημάτων. Τέτοιες γλώσσες είναι η FORTRAN (για μαθηματικές εφαρμογές), η COBOL (για εμπορικές εφαρμογές), η HTML (για μορφοποίηση ιστοσελίδων), η SQL (για ερωτήματα σε βάσεις δεδομένων), η MODSIM (γλώσσα προσομοίωσης) και άλλες. 6.3 Μεταφραστές γλωσσών προγραμματισμού Οι μεταφραστές (translators) είναι ειδικά προγράμματα που αναλαμβάνουν τη μετάφραση προγραμμάτων που έχουν γραφτεί σε κάποια γλώσσα προγραμματισμού σε αντίστοιχα προγράμματα σε γλώσσα μηχανής ώστε να μπορέσουν τα τελευταία να εκτελεστούν από τον υπολογιστή. Έχουμε ήδη δει ένα παράδειγμα τέτοιου μεταφραστή και συγκεκριμένα το συμβολομεταφραστή (assembler), ο οποίος παίρνει σαν είσοδο ένα πρόγραμμα γραμμένο σε συμβολική γλώσσα και παράγει ένα εκτελέσιμο πρόγραμμα σε γλώσσα μηχανής. Αντίστοιχοι μεταφραστές πρέπει να υπάρχουν για κάθε γλώσσα προγραμματισμού υψηλού και πολύ υψηλού επιπέδου καθώς, όπως είπαμε, η ΚΜΕ κάθε υπολογιστή μπορεί να δεχτεί στην είσοδο της και να εκτελέσει μόνο προγράμματα σε γλώσσα μηχανής. Έτσι, για κάθε γλώσσα προγραμματισμού υπάρχουν μεταφραστές που μεταφράζουν προγράμματα από τη γλώσσα αυτή σε γλώσσα μηχανής (για παράδειγμα, έχουμε μεταφραστές Pascal, μεταφραστές C, κτλ). Οι μεταφραστές παρέχουν το πολύ σημαντικό, όπως έχουμε δει, πλεονέκτημα της μεταφερσιμότητας των προγραμμάτων, καθώς οι προγραμματιστές δε χρειάζεται να ασχοληθούν με τη μετατροπή των προγραμμάτων τους ώστε αυτά να αναγνωρίζουν το ρεπερτόριο εντολών κάθε διαφορετικού υπολογιστή. Οι μεταφραστές χωρίζονται σε δυο βασικές κατηγορίες. Από τη μια μεριά υπάρχουν οι μεταγλωττιστές (compilers). Αυτοί παίρνουν σαν είσοδο ένα πρόγραμμα σε κάποια γλώσσα υψηλού επιπέδου και παράγουν ένα αντίστοιχο πρόγραμμα σε γλώσσα μηχανής. Το πρόγραμμα εισόδου ονομάζεται πηγαίο πρόγραμμα (source program) και το πρόγραμμα εξόδου ονομάζεται εκτελέσιμο πρόγραμμα (executable program). Το τελευταίο εκτελείται από τον υπολογιστή και είναι τελείως ανεξάρτητο από το αρχικό πηγαίο πρόγραμμα. Η συντριπτική πλειοψηφία των γλωσσών προγραμματισμού χρησιμοποιεί μεταγλωττιστές. Από την άλλη όμως μεριά, υπάρχουν και οι διερμηνευτές (interpreters). Αυτοί, αντί να μεταφράζουν ολόκληρο το πηγαίο πρόγραμμα και να παράγουν ένα αντίστοιχο εκτελέσιμο, μεταφράζουν και αμέσως εκτελούν κάθε μια εντολή του πηγαίου προγράμματος ξεχωριστά και έπειτα προχωρούν στην επόμενη εντολή επαναλαμβάνοντας την ίδια διαδικασία. Έτσι, οι διερμηνευτές δεν παράγουν κάποιο εκτελέσιμο πρόγραμμα σε γλώσσα μηχανής, όπως οι μεταγλωττιστές. Χαρακτηριστικό παράδειγμα γλώσσας προγραμματισμού που διαθέτει διερμηνευτή αντί για μεταγλωττιστή είναι η BASIC. Τα περισσότερα περιβάλλοντα μεταγλωτιστών και διερμηνευτών που υπάρχουν για όλες τις γλώσσες προγραμματισμού διαθέτουν ενσωματωμένο και ένα πρόγραμμα που ονομάζεται συντάκτης (editor) και επτρέπει τη συγγραφή του πηγαίου κώδικα (source code) ενός προγράμματος πριν αυτό στη συνέχεια μεταφραστεί και εκτελεστεί. Ο συντάκτης είναι ουσιαστικά ένας μικρός επεξεργαστής κειμένου με δυνατότητες που διευκολύνουν τη συγγραφή και τον έλεγχο των εντολών των προγραμμάτων. 6.4 Αλγόριθμοι Στη συνέχεια αυτού του κεφαλαίου θα εισάγουμε μερικές βασικές και σημαντικές έννοιες που αφορούν τη συγγραφή προγραμμάτων, ανεξάρτητα από τη γλώσσα προγραμματισμού που χρησιμοποιείται. Καθώς ο προγραμματισμός μπορεί να ακολουθεί διαφορετικές φιλοσοφίες όπως είδαμε νωρίτερα, εμείς θα επικεντρωθούμε μόνο σε ένα είδος προγραμματισμού, το οποίο είναι ιδιαίτερα δημοφιλές και το πλέον κατάλληλο για την εισαγωγή στον προγραμματισμό. Έτσι θα δούμε τις αρχές του διαδικασιακού προγραμματισμού, συζητώντας αρχές που μπορούν να εφαρμοστούν σε κάθε διαδικασιακή γλώσσα. Στο επόμενο κεφάλαιο, θα συγκεκριμενοποιήσουμε τις αρχές αυτές, δείχνοντας πως υλοποιούνται σε μια συγκεκριμένη και πολύ δημοφιλή γλώσσα προγραμματισμού, συγκεκριμένα τη C. -147-

ΑΡΧΕΣ ΛΕΙΤΟΥΡΓΙΑΣ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ 6.4.1 Η έννοια του αλγόριθμου Κάθε γλώσσα προγραμματισμού χρησιμοποιείται για τη συγγραφή προγραμμάτων τα οποία (υποτίθεται ότι πρέπει να) λύνουν ανθρώπινα προβλήματα. Όμως για να μετασχηματιστεί η λύση ενός προβλήματος που έχει σκεφτεί ένας άνθρωπος σε πρόγραμμα που μπορεί να εκτελέσει ένας υπολογιστής πρέπει αυτή η λύση να περιγραφεί με κάποιο τρόπο. Στο σημείο αυτό δεν εννοούμε ότι πρέπει να γραφτεί ένα πρόγραμμα σε κάποια συγκεκριμένη γλώσσα προγραμματισμού: και αυτό θα πρέπει να γίνει, αλλά αργότερα. Σε πρώτη φάση πρέπει, ανεξάρτητα από τη γλώσσα που τελικά θα χρησιμοποιηθεί, ο προγραμματιστής να μεταφράσει τη λύση που έχει στο μυαλό του σε μια σειρά βημάτων που πρέπει να ακολουθηθούν για την επίλυση του προβλήματος. Αυτή ακριβώς είναι και η έννοια του αλγόριθμου: ένας αλγόριθμος (algorithm) είναι μια σειρά από πεπερασμένα βήματα που καθορίζουν ένα τρόπο επίλυσης ενός προβλήματος. Το παρακάτω σχήμα δείχνει τη σχέση μεταξύ προβλημάτων, λύσεων, αλγόριθμων και προγραμμάτων. Πρόγραμμα 1.1 Λύση 1 Αλγόριθμος 1 Πρόγραμμα 1.2 Πρόγραμμα 1 Λύση 2 Αλγόριθμος 2 Πρόγραμμα 2.1 Πρόγραμμα 2.2 Πρόβλημα Πρόγραμμα v.1 Λύση ν Αλγόριθμος ν Πρόγραμμα v.2 Σχήμα 6.2: Προβλήματα, Λύσεις, Αλγόριθμοι και Προγράμματα Όπως δείχνει το σχήμα, κάθε δεδομένο πρόβλημα σχεδόν πάντα έχει περισσότερες της μιας λύσης. Κάθε μια λύση όμως αντιστοιχίζεται με ένα μόνο αλγόριθμο, δηλαδή με μια περιγραφή των βημάτων που πρέπει να ακολουθήσουμε για να επιτύχουμε τη λύση αυτή. Τέλος, κάθε αλγόριθμος μπορεί να γραφτεί με τη μορφή πολλών διαφορετικών προγραμμάτων, για παράδειγμα σε διαφορετικές γλώσσες προγραμματισμού. Ας το δούμε αυτό με ένα (πολύ απλό) παράδειγμα. Έστω ότι το πρόβλημα μας είναι να ταξινομήσουμε μια ομάδα τριών αριθμών σε αύξουσα σειρά, δηλαδή να τους αναδιατάξουμε (αν χρειάζεται) έτσι ώστε να είναι πρώτα ο μικρότερος, μετά ο μεσαίος και τελευταίος ο μεγαλύτερος. Κάποιος θα μπορούσε να σκεφτεί τουλάχιστον δυο τρόπους για να γίνει αυτό. Η πρώτη λύση θα ήταν να συγκρίνουμε συνεχώς τους αριθμούς ανά δυο και να τους αντιμεταθέτουμε αν δεν είναι σε αύξουσα σειρά μέχρι να τελειώσουμε. Μια άλλη λύση θα ήταν να βρίσκουμε κάθε φορά το μικρότερο αριθμό και να τον βάζουμε πρώτο στη σειρά των αριθμών που δεν έχουμε ακόμα δει μέχρι να τελειώσουμε. Δυστυχώς και οι δυο περιγραφές των λύσεων, ενώ είναι πιθανά κατανοητές από ένα άνθρωπο (αν και σε συνθετότερα προβλήματα μπορεί να μην είναι το ίδιο κατανοητές από όλους), είναι πολύ αφηρημένες για τον υπολογιστή. Ας τις μετατρέψουμε λοιπόν σε αλγόριθμους, σειρές από πεπερασμένα βήματα δηλαδή για την υλοποίηση της κάθε λύσης. Ας ονομάσουμε τους τρεις αριθμούς μας αρ1, αρ2, και αρ3 για να αναφερόμαστε σε αυτούς ευκολότερα: Αλγόριθμος για τη Λύση 1. Σύγκρινε τον αρ1 με τον αρ2 και αν δεν είναι σε αύξουσα σειρά αντιμετάθεσε τους. Έπειτα, σύγκρινε τον αρ2 με τον αρ3 και αν δεν είναι σε αύξουσα σειρά αντιμετάθεσε τους. Τέλος, σύγκρινε τον αρ1 με τον αρ2 και αν δεν είναι σε αύξουσα σειρά αντιμετάθεσε τους. Αλγόριθμος για τη Λύση 2. Βρες το μικρότερο από τους {αρ1, αρ2, αρ3} και βάλε τον στη θέση του αρ1, αλλάζοντας του θέση με αυτόν. Έπειτα, βρες το μικρότερο από τους {αρ2, αρ3} και βάλε τον στη θέση του αρ2, αλλάζοντας του θέση με αυτόν. -148- Πρόγραμμα ν

Κεφάλαιο 6: ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΑΛΓΟΡΙΘΜΟΣ Athroisma_Zygwn3; ΔΕΔΟΜΕΝΑ athroisma,orisma:integer; ΑΡΧΗ athroisma:=0; ΓΙΑ orisma:=1 ΕΩΣ 1000000 ΕΠΑΝΕΛΑΒΕ ΕΑΝ orisma mod 2 = 0 athroisma:=athroisma+orisma; ΤΕΛΟΣ-ΕΑΝ; ΓΙΑ-ΤΕΛΟΣ; ΤΥΠΩΣΕ( Το άθροισμα είναι:, athroisma); ΤΕΛΟΣ Παρατηρήστε ότι με τη χρήση του ΓΙΑ δε χρειαζόμαστε ούτε εντολή εκχώρησης αρχικής τιμής στο όρισμα (αυτή γίνεται αυτόματα όταν εκτελείται για πρώτη φορά το ΓΙΑ) ούτε εντολή αύξησης της τιμής του μέσα στο σώμα της επανάληψης (αυτή γίνεται αυτόματα στο τέλος κάθε επανάληψης και πριν τον έλεγχο της συνθήκης τερματισμού). Τέλος, ο δεύτερος αλγόριθμος με χρήση της ΓΙΑ θα ήταν ως εξής: ΑΛΓΟΡΙΘΜΟΣ Athroisma_Zygwn4; ΔΕΔΟΜΕΝΑ athroisma,orisma:integer; ΑΡΧΗ athroisma:=0; ΓΙΑ orisma:=2 ΕΩΣ 1000000 ΜΕ ΒΗΜΑ 2 ΕΠΑΝΕΛΑΒΕ athroisma:=athroisma+orisma; ΓΙΑ-ΤΕΛΟΣ; ΤΥΠΩΣΕ( Το άθροισμα είναι:, athroisma); ΤΕΛΟΣ Παρατηρήστε ότι επειδή θέλουμε σε αυτή την έκδοση του αλγόριθμου να αυξάνουμε την τιμή του μετρητή κατά 2 μετά από κάθε επανάληψη, χρησιμοποιήσαμε μια διαφορετική έκδοση σύνταξης της ΓΙΑ με τον τελεστή ΜΕ ΒΗΜΑ. Αν παραληφθεί ο τελεστής αυτός, η τιμή του μετρητή αυξάνεται αυτόματα κατά 1 σε κάθε επανάληψη. Αντίθετα, με τη χρήση του τελεστή αυτού, μπορούμε να αυξάνουμε την τιμή του μετρητή όσο θέλουμε ή ακόμα και να τη μειώνουμε σε κάθε επανάληψη (για παράδειγμα, ΜΕ ΒΗΜΑ -1). 6.8 Περίληψη Η μόνη γλώσσα προγραμματισμού που είναι άμεσα εκτελέσιμη από ένα υπολογιστή είναι η γλώσσα μηχανής του. Όμως, η γλώσσα μηχανής είναι πολύ χαμηλού επιπέδου και επομένως πολύ δύσκολη στη χρήση. Ακόμα, είναι διαφορετική για κάθε τύπο υπολογιστή, επομένως τα προγράμματα σε γλώσσα μηχανής δεν είναι μεταφέρσιμα. Η συμβολική γλώσσα (assembly) είναι επίσης γλώσσα χαμηλού επιπέδου, αλλά λίγο πιο εύκολη στη χρήση, καθώς αποτελείται από συμβολικά ονόματα εντολών αντί για ακολουθίες δυαδικών ψηφίων. Για την εκτέλεση ενός προγράμματος σε συμβολική γλώσσα απαιτείται πρώτα μετάφραση του σε γλώσσα μηχανής. Η μετάφραση γίνεται από ειδικό πρόγραμμα που ονομάζεται συμβολομεταφραστής (assembler). Οι γλώσσες υψηλού επιπέδου είναι πολύ πιο φιλικές στον προγραμματιστή και επιτρέπουν τη μεταφερσιμότητα των προγραμμάτων. Χαρακτηριστικά παραδείγματα τέτοιων γλωσσών είναι οι Fortran, Cobol, Algol, Basic και Pascal (παλιότερα), καθώς και οι C, Java και Visual Basic (σήμερα). Οι γλώσσες πολύ υψηλού επιπέδου είναι ακόμα πιο φιλικές και απευθύνονται όχι μόνο σε προγραμματιστές αλλά και σε απλούς χρήστες, καθώς επιτρέπουν την ανάπτυξη κάποιων προγραμμάτων ακόμα και χωρίς τη συγγραφή κώδικα. Παράδειγμα αποτελεί η γλώσσα SQL. Ανάλογα με τη φιλοσοφία προγραμματισμού που υποστηρίζουν, οι γλώσσες προγραμματισμού διακρίνονται σε διαδικασιακές, αντικειμενοστραφείς, σήμανσης, συναρτησιακές, λογικές και ερωταποκρίσεων. Ανάλογα με τη χρήση, οι γλώσσες προγραμματισμού ταξινομούνται σε γλώσσες γενικής χρήσης και γλώσσες ειδικής χρήσης. Κάθε πρόγραμμα γραμμένο σε οποιαδήποτε γλώσσα προγραμματισμού υψηλού ή πολύ υψηλού επιπέδου πρέπει να μεταφραστεί σε εντολές γλώσσας μηχανής προτού εκτελεστεί. Η μετάφραση αυτή -159-

ΑΡΧΕΣ ΛΕΙΤΟΥΡΓΙΑΣ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ πραγματοποιείται από τους μεταγλωττιστές ή τους διερμηνευτές. Οι μεταγλωττιστές μετατρέπουν ένα πηγαίο πρόγραμμα σε εκτελέσιμο, ενώ οι διερμηνευτές μεταφράζουν και εκτελούν τις εντολές του πηγαίου προγράμματος μια προς μια. Ένας αλγόριθμος είναι μια σειρά από πεπερασμένα βήματα που καθορίζουν ένα τρόπο επίλυσης ενός προβλήματος. Οι αλγόριθμοι χαρακτηρίζονται από την ορθότητα και την πολυπλοκότητά τους. Ο ψευδοκώδικας επιτρέπει την περιγραφή των αλγόριθμων σε φυσική γλώσσα χωρίς τη χρήση του συντακτικού κάποιας συγκεκριμένης γλώσσας προγραμματισμού. Ο ψευδοκώδικας καθορίζει συγκεκριμένες συμβάσεις και κανόνες σύνταξης για την παράσταση των αλγόριθμων. Το διάγραμμα ροής επιτρέπει την περιγραφή των αλγόριθμων σχηματικά. Χρησιμοποιεί μια σειρά από σύμβολα και κανόνες σύνταξης που έχουν συγκεκριμένη σημασία για την παράσταση των αλγόριθμων. Οποιοδήποτε διαδικασιακό πρόγραμμα μπορεί να γραφτεί με συνδυασμό τριών βασικών δομών: ακολουθία, επιλογή και επανάληψη. Οι δομές επιλογής και επανάληψης μπορεί να είναι φωλιασμένες σε πολλαπλά επίπεδα και σε οποιοδήποτε συνδυασμό τους. 6.9 Ερωτήσεις Ασκήσεις Άσκηση 6.1 Οι δυο αλγόριθμοι που δώσαμε για την ταξινόμηση τριών ακέραιων αριθμών δουλεύουν σωστά στην περίπτωση που οι δυο αριθμοί είναι ίσοι μεταξύ τους; Στην περίπτωση που και οι τρεις είναι ίσοι μεταξύ τους; Άσκηση 6.2 Υλοποιήστε τον αλγόριθμο πρόσθεσης των ζυγών αριθμών από το 1 έως το 1.000.000 με χρήση της επανάληψης ΕΠΑΝΕΛΑΒΕ-ΜΕΧΡΙ. Άσκηση 6.3 Σχεδιάστε τα διαγράμματα ροής που περιγράφουν τους τέσσερις αλγόριθμους πρόσθεσης των ζυγών αριθμών από το 1 έως το 1.000.000 που υπάρχουν στο κεφάλαιο. Άσκηση 6.4 Σχεδιάστε αλγόριθμο σε ψευδοκώδικα και σε διάγραμμα ροής που να υπολογίζει το μέσο όρο τριών ακεραίων αριθμών που δίνει ο χρήστης. Άσκηση 6.5 Σχεδιάστε αλγόριθμο σε ψευδοκώδικα και σε διάγραμμα ροής που να υπολογίζει το μέσο όρο ακεραίων αριθμών που δίνει ο χρήστης. Ο χρήστης πρέπει να ερωτάται να δώσει αριθμούς και η ανάγνωση των αριθμών να τελειώσει όταν ο χρήστης δώσει τον αριθμό μηδέν (δηλαδή δεν ξέρουμε εκ των προτέρων πόσους αριθμούς θα δώσει ο χρήστης). Προσοχή στην περίπτωση που ο χρήστης δε δώσει κανένα αριθμό (πληκτρολογήσει δηλαδή από την αρχή μηδέν). -160-