next up previous contents
Next: 1.2 Πρόγραμμα Up: 1. Τι είναι προγραμματισμός Previous: 1. Τι είναι προγραμματισμός   Contents

Subsections

1.1 Ο υπολογιστής

Ο υπολογιστής είναι μια μηχανή που έχει τη δυνατότητα να εκτελεί απλές εντολές. Τι είναι μια απλή εντολή δε χρειάζεται αυτή τη στιγμή να το ορίσουμε ακριβώς. Για παράδειγμα η πρόσθεση δυο αριθμών είναι μια απλή εντολή. Ο υπολογιστής βρίσκεται συνεχώς στο loop (κύκλο που επαναλαμβάνεται) εκτέλεσης εντολών, και εκτελεί εκατοντάδες εκατομμυρίων εντολών ανά δευτερόλεπτο. Υπολογιστής με ταχύτητα 800 MHz εκτελεί περί τα 800 εκατομ. εντολές το δευτερόλεπτο (δεν παίρνουν όλες οι απλές εντολές τον ίδιο χρόνο εκτέλεσης, αλλά δε βλάπτει ιδιαίτερα στην κατανόηση της λειτουργίας της μηχανής το να θεωρήσουμε προς το παρόν ότι αυτό συμβαίνει.)

Σε κάθε κύκλο του ο υπολογιστής (για την ακρίβεια ο μικροεπεξεργαστής που είναι η καρδιά κάθε υπολογιστικού συστήματος) λαμβάνει μια εντολή και την εκτελεί. Μια τέτοια εντολή δεν είναι κατ' ανάγκη αριθμητικής φύσης, και εκεί ακριβώς έγκειται η ισχύς του υπολογιστή. Υπάρχουν, π.χ., εντολές που λένε στο μικροεπεξεργαστή να πάρει ως επόμενη εντολή που θα εκτελέσει την εντολή Α ή την εντολή Β, ανάλογα με το αν η τιμή που υπολόγισε στο αμέσως προηγούμενο βήμα είναι θετική ή αρνητική. Είναι ακριβώς τέτοιες εντολές που δίνουν τη δυνατότητα στον υπολογιστή να εκτελεί περίπλοκα ``προγράμματα'', όπως το επόμενο.

	Διάβασε τις τιμές των φυσικών αριθμών a και b
	x <- 0
      test:
	Αν a >= b τότε {
	 x <- x+1
	 a <- a - b
	 Πήγαινε στο test
	}
	Τύπωσε "Το πηλίκο της διαίρεσης ", a, "δια ", b, "είναι ", x

1.1.1 Γλώσσα μηχανής και γλώσσες υψηλού επιπέδου

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

Σε αυτή ακριβώς τη δυσκολία οφείλεται, κατά κύριο λόγο, η ύπαρξη των γλωσσών προγραμματισμού υψηλού επιπέδου όπως οι Fortran (χρονικά η πρώτη τέτοια γλώσσα), BASIC, C, Pascal, Lisp και δεκάδες άλλες.

Όπως θα δούμε παρακάτω οι γλώσσες αυτές παρέχουν σημαντικές ευκολίες στον προγραμματιστή, οι οποίες δεν υφίστανται στη γλώσσα μηχανής, ή έστω στη γλώσσα assembly που αποτελεί ένα ενδιάμεσο σημείο ανάμεσα στη γλώσσα μηχανής και στις γλώσσες υψηλού επιπέδου (πολύ πλησιέστερα όμως στη γλώσσα μηχανής απ' ότι στις τελευταίες).

Επειδή όμως κάθε υπολογιστής μια γλώσσα μόνο ``καταλαβαίνει'' κάθε πρόγραμμα που έχει γραφεί σε μια γλώσσα προγραμματισμού (C, BASIC, Fortran κλπ, ή ακόμη και σε γλώσσα assembly) πρέπει πρώτα να μεταγλωττιστεί σε γλώσσα μηχανής προτού μπορέσει να εκτελεστεί. Η διαδικασία αυτή της μεταγλώττισης συναντάται σε τρεις, λίγο-πολύ, διαφορετικές μορφές:

  1. Προγράμματα που έχουν γραφεί σε γλώσσα assembly ``περνάνε'' από το λεγόμενο assembler, που δεν είναι τίποτε άλλο από ένα εκτελέσιμο (δηλ. ήδη μεταφρασμένο σε γλώσσα μηχανής) πρόγραμμα που διαβάζει το πρόγραμμα assembly και παράγει ένα λειτουργικά ισοδύναμο εκτελέσιμο πρόγραμμα.
  2. Προγράμματα που έχουν γραφεί σε μια γλώσσα υψηλού επιπέδου περνάνε από το λεγόμενο compiler (γίνονται compiled, όπως λέμε).
  3. Υπάρχει και μια τρίτη μορφή μεταγλώττισης ενός προγράμματος, αυτή στην οποία δεν δημιουργείται κάποιο εκτελέσιμο πρόγραμμα το οποίο στη συνέχεια εκτελείται, αλλά ο κύκλος μεταγλώττιση-εκτέλεση είναι πολύ πιο βραχύς, και συνήθως εκτελείται μια ``εντολή'' της γλώσσας υψηλού επιπέδου αμέσως μόλις μεταγλωττιστεί και προτού μεταγλωττιστεί η ``επόμενη'' εντολή. Προγράμματα που κάνουν αυτού του είδους τη μεταγλώττιση-εκτέλεση λέγονται interpreters και χαρακτηριστικό τους είναι ότι συνήθως δε δημιουργούν κάποια μορφή εκτελέσιμου προγράμματος που μπορεί να εκτελεστεί χωρίς τη βοήθεια του interpreter και μόνο από τη μηχανή.
Το φάσμα βέβαια ανάμεσα στο compilation και στο interpretation είναι γεμάτο από ενδιάμεσες καταστάσεις, με πιο συχνή, τελευταία, τη μετατροπή του προγράμματος από τη γλώσσα υψηλού επιπέδου σε μια γλώσσα χαμηλού επιπέδου (που έχει επικρατήσει να λέγεται bytecode) η οποία όμως είναι ανεξάρτητη μηχανής. Γι' αυτό το πρόγραμμα σε μορφή bytecode μπορεί να εκτελεστεί σε οποιαδήποτε μηχανή, αρκεί βέβαια να υπάρχει σε αυτή τη μηχανή ένα πρόγραμμα που διαβάζει bytecode και το εκτελεί. Τέτοια προγράμματα είναι συνήθως πολύ απλά να γραφούν, γιατί ακριβώς το bytecode είναι μια πολύ απλή γλώσσα που γράφεται και διαβάζεται εύκολα από μηχανή.

Το bytecode interpretation προσφέρει μια ενδιάμεση αποδοτικότητα (προγράμματα που έχουν γίνει fully compiled και έχουν μετατραπεί σε εκτελέσιμο κώδικα σε γλώσσα μηχανής είναι πολύ ταχύτερα από προγράμματα που διαβάζονται και εκτελούνται ταυτόχρονα από interpreters, είναι όμως καταδικασμένα να τρέχουν μόνο στον τύπο μηχανής (η έννοια ``τύπος της μηχανής'' εδώ περιλαμβάνει το είδος του hardware αλλά και το είδος και τις διάφορες παραμέτρους του λειτουργικού συστήματος) για τον οποίο έχουν μεταγλωττιστεί. Αντίθετα, ένα πρόγραμμα που τρέχει μέσα από interpreter τρέχει οπουδήποτε υπάρχει εγκατεστημένος ένας interpreter για τη γλώσσα στην οποία έχει το πρόγραμμα γραφεί. Είναι όμως πολύ πιο αργό. Το bytecode προσφέρει μια μέση οδό ανάμεσα στο portability (μεταφερσιμότητα) και στο efficiency, που είναι μάλιστα ιδιαίτερα σημαντική στην εκτέλεση προγραμμάτων διά μέσου του Internet για τον απλούστατο λόγο ότι θέλει κανείς να κάνει κλικ σε ένα πρόγραμμα που βρίσκεται στο τάδε site και αυτό να τρέχει τοπικά, στη μηχανή του. Εκεί έχει σημασία τα προγράμματα να είναι αποθηκευμένα σε γλώσσα ανεξάρτητη μηχανής, μια και δεν μπορεί κανείς να υποθέσει κάτι για ένα remote site, αλλά είναι επίσης σημαντικό να είναι αποθηκευμένα σε μια μορφή που να γίνεται interpreted αποτελεσματικά. Το bytecode προσφέρει μια καλή μέση οδό.



Mihalis Kolountzakis 2001-10-21