Θεωρία Γλωσσών Προγραμματισμού

Από Βικιεπιστήμιο
Πήδηση στην πλοήγηση Πήδηση στην αναζήτηση
                                     ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ
        ΕΙΣΑΓΩΓΗ
Οι γλώσσες προγραμματισμού έχουν κύριο στόχο την προετοιμασία των προγραμμάτων και τη
διεύρυνση της χρήσης του υπολογιστή, έτσι ώστε να καλύψει μεγάλο χώρο εφαρμογών. Ονο-
μάστηκαν γλώσσες προγραμματισμού υψηλού επιπέδου(High level languages) σε αντιδιαστολή 
προς τις γλώσσες μηχανής(machine languages) που κρίθηκαν σαν χαμηλού επιπέδου μέσο επι-
κοινωνίας του ανθρώπου με τη μηχανή. Είναι τεχνητές δομές που φιλοδοξούν να έχουν στην
επικοινωνία ανθρώπου-μηχανής ρόλο, ανάλογο με το ρόλο των φυσικών γλωσσών στην επικοινω-
νία μεταξύ ανθρώπων.

        ΦΥΣΙΚΕΣ ΚΑΙ ΤΕΧΝΗΤΕΣ ΓΛΩΣΣΕΣ
Μια γλώσσα, φυσική ή τεχνητή, γενικά προσδιορίζεται:
(1) Από το αλφάβητό της(alphabet),δηλ. από ένα πεπερασμένο σύνολο στοιχείων που καθένα
τους είναι μια φυσική αναπαράσταση μιας από τις ισάριθμες διακριτές καταστάσεις που
αντιστοιχούν όλες σε μια γενική αφηρημένη έννοια.
(2) Από το λεξιλόγιό της(vocabulary), δηλ. ένα υποσύνολο του συνόλου των πεπερασμένου
μήκους ακολουθιών από διατεταγμένα στοιχεία του αλφαβήτου.
(3) Από τη γραμματική της(grammar), που περιλαμβάνει το τυπικό(accidence) και το συντα-
κτικό(syntax). Τυπικό, είναι το σύνολο των κανόνων που προσδιορίζουν τη δυνατή εσωτερική
δομή του λεξιλογίου δηλ. τη δυνατότητα μιας λέξης να υπάρχει σε ποικιλία μορφών. Συντακτικό,
είναι το σύνολο των κανόνων που καθορίζουν τη νομιμότητα(legality) δομών, που αποτελούνται
από πεπερασμένου μήκους ακολουθίες διατεταγμένων λέξεων του λεξιλογίου.
(4) Από τη σημασιολογία της(semantics): είναι το σύνολο των κανόνων που ερμηνεύουν δηλ.
καθορίζουν το νόημα(meaning) μιας συντακτικά σωστής ακολουθίας πεπερασμένου μήκους διατε-
ταγμένων λέξεων του λεξιλογίου.

Οι γλώσσες προγραμματισμού είναι επιδεκτικές αλλαγής είτε σε επίπεδο διαλέκτου(π.χ. FORTRAN I
και FORTRAN IV), είτε σε επίπεδο επέκτασης ή εξειδίκευσης. Τέτοιες αλλαγές όμως, μόνο με την
ευρεία έννοια μπορούν να χαρακτηριστούν σαν εξέλιξη, και σαφώς οι μηχανισμοί με τους οποίους
υλοποιούνται δεν έχουν τίποτε κοινό με το μηχανισμό που χαρακτηρίζει την εξέλιξη των φυσικών
γλωσσών.


         ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ
Το αλφάβητο των γλωσσών προγραμματισμού περιορίζεται συνήθως στο σύνολο των χαρακτήρων που
είναι διαθέσιμοι στην είσοδο του υπολογιστή(character set).

         ΣΗΜΑΣΙΟΛΟΓΙΑ
Σειρά χαρακτήρων(character string), είναι μια διατεταγμένη ακολουθία στοιχείων του αλφαβήτου
μιας γλώσσας, με έναν πρώτο και έναν τελευταίο όρο, και στην οποία κάθε όρος εκτός από τον 
τελευταίο έχει έναν μοναδικό επόμενο(succesor), ενώ κα΄θε όρος εκτός από τον πρώτο έχει έναν
μοναδικό προηγούμενο(predecessor)
Μήνυμα(message), είναι μια σειρά χαρακτήρων που έχει σχηματιστεί με βάση τους συντακτικούς και
σημασιολογικούς κανόνες. Σκοπός του είναι να μεταφέρει πληροφορία.
Κώδικας(code), είναι η αντιστοιχία δύο αλφαβήτων έτσι ώστε αντίστοιχα μηνύματα να μεταφέρουν
την ίδια πληροφορία.
Κώδικας μηχανής(machine code), είναι οι ακολουθίες στοιχείων ενός συγκεκριμένου αλφαβήτου που
ερμηνεύεται άμεσα από τον υπολογιστή.
Μπορούμε να πούμε ότι σκοπός των γλωσσών προγραμματισμού είναι να παρέχουν το μέσο για τη δια-
τύπωση μηνυμάτων τα οποία, μέσα από μια διαδικασία κωδικοποίησης μετασχηματίζονται σε μηνύματα
σε γλώσσα μηχανής διατηρώντας την αρχική πληροφορία. Έτσι εξασφαλίζεται ότι το νόημα του προ-
γράμματος γίνεται αντιληπτό από τον υπολογιστή.
Το νόημα ενός προγράμματος σε γλώσσα προγραμματισμού υψηλού επιπέδου, είναι η μορφή του προ-
γράμματος σε γλώσσα μηχανής, με την προϋπόθεση ότι ο μεταφραστής(compiler) είναι σωστά σχεδι-
ασμένος.
Συνήθως γίνεται διάκριση μεταξύ του νοήματος του προγράμματος και του νοήματος του κώδικα μη-
χανής που αντιστοιχεί στο πρόγραμμα. Το πρώτο ονομάζεται αφηρημένο νόημα(abstract meaning),
ενώ το δεύτερο υλοποίηση του προγράμματος(implementation of the program).
Η μελέτη και η θεωρητική θεμελίωση των γλωσσών προγραμματισμού, είναι αντικείμενο της τυπικής
θεωρίας των γλωσσών(Formal Theory of Languages), και γίνεται με τη βοήθεια των εξής θεωρητικών
εργαλείων:
(1) Γραμματικές ανεξάρτητες περιεχομένου(context Free grammars), για τον προσδιορισμό του συ-
ντακτικού μιας γλώσσας.
(2) Συντακτικά μεταφραστικά σχήματα(Syntax directed translation schemes) για τον προσδιορισμό
της σημασιολογίας.

        Η ΕΝΝΟΙΑ ΤΟΥ ΥΠΟΛΟΓΙΣΜΟΥ
Οι γλώσσες προγραμματισμού περιγράφουν υπολογιστικές διαδικασίες (computational procedures).
Υπολογισμός είναι η μαθηματική διαδικασία με την οποία δίνονται απαντήσεις σε συγκεκριμένα
ερωτήματα.
Οι υπολογισμοί, συνεπάγονται την ύπαρξη αντίστοιχων αλγορίθμων όπως επίσης και τη διατύπωσή
τους σε γλώσσα προγραμματισμού. Συνεπώς η υλοποίηση του υπολογισμού στη γενική περίπτωση, δεν
είναι απλώς και μόνο αριθμητικές πράξεις, αλλά κάθε είδους χειρισμοί που μπορούν να γίνουν
σε σειρές χαρακτήρων.
Από πλευράς γλώσσας προγραμματισμού, δεν ενδιαφέρει πόσο ακριβής είναι ο αλγόριθμος που επι-
χειρεί να απαντήσει ένα ερώτημα, αλλά πόσο πιστά και με ποιες επιδόσεις η γλώσσα υλοποιεί
τον αλγόριθμο.

      
        Ο ΡΟΛΟΣ ΤΩΝ ΓΛΩΣΣΩΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ
Ανεξάρτητα από τη συγκεκριμένη εφαρμογή, η λύση ενός προβλήματος με τη βοήθεια υπολογιστή,
ακολουθεί τρία στάδια:
(1) Ακριβής προσδιορισμός του προβλήματος
(2) Ανάπτυξη ενός αντίστοιχου αλγορίθμου, και
(3) Διατύπωση του αλγόριθμου σε μορφή τέτοια, ώστε να μπορεί να υλοποιηθεί σε υπολογιστή
(προγραμματισμός).
Οι γλώσσες προγραμματισμού όχι μόνο αποτελούν το μέσο για τη διατύπωση των αλγορίθμων υπό
μορφή προγράμματος εκτελέσιμου σε έναν υπολογιστή, αλλά επίσης παρέχουν και ένα πλαίσιο ε-
ννοιών για μια συστηματική θεώρηση των προς λύση προβλημάτων, και έναν συμβολισμό για τη
διατύπωση σκέψεων που αφορούν τον προσδιορισμό και τον τρόπο λύσης του προβλήματος.
Τα κριτήρια με τα οποία γίνεται η ποιοτική αξιολόγηση των γλωσσών είναι:
(1) Η ισχύς της γλώσσας, δηλ. η δυνατότητα που παρέχει η γλώσσα να εκφράζονται και να δια-
τυπώνονται σύνθετες λειτουργίες με συγκεκριμένο και άμεσο τρόπο(με εντολές της γλώσσας).
(2) Η εξάρτηση της γλώσσας από τη συγκεκριμένη οργάνωση του υπολογιστικού συστήματος στο
οποίο θα εκτελεστεί το πρόγραμμα. Γλώσσες που έχουν σχεδιαστεί για χρήση σε υπολογιστές γε-
νικού σκοπού, δεν πρέπει να επηρρεάζονται από τα δομικά χαρακτηριστικά του συστήματος και
να επιβαρύνουν έτσι τη μορφή του προγράμματος με στοιχεία που ουσιαστικά δεν το αφορούν.
(3) Η απλότητα και η κομψότητα της γλώσσας. Η απαίτηση αυτή οδήγησε στη δημιουργία γλωσσών 
που προσφέρονται στην ανάπτυξη προγραμμάτων που χαρακτηρίζονται από δομή(structured program-
ming).


        ΔΟΜΙΚΑ ΣΤΟΙΧΕΙΑ ΤΩΝ ΓΛΩΣΣΩΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ
Μια γλώσσα χαρακτηρίζεται όχι μόνο από τις συγκεκριμένες εντολές και λειτουργίες που μπορεί
να εκτελέσει άμεσα, αλλά επίσης και από τους τύπους και γενικά τις δομές δεδομένων(data
structures) που είναι σχεδιασμένη να επεξεργάζεται. Υπάρχει πάντα ένας συσχετισμός μεταξύ
των δομών δεδομένων και του τύπου των εντολών μιας γλώσσας.
Οι γλώσσες δομούνται ιεραρχικά ξεκινώντας με τα ΟΝΟΜΑΤΑ(NAMES ή IDENTIFIERS) των ΑΝΤΙΚΕΙΜΕ-
ΝΩΝ(OBJECTS), που αφορούν τη διαδικασία υπολογισμού. Από τα ΟΝΟΜΑΤΑ δημιουργούνται οι ΕΚΦΡΑ-
ΣΕΙΣ(EXPRESSIONS) και από αυτές οι ΕΝΤΟΛΕΣ(PROGRAM STATEMENTS). Οι εντολές σχηματίζουν τα
ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ(SUBPROGRAMS),δηλ. αυτόνομα τμήματα προγράμματος τα οποία ορίζουν δικά τους
ΤΟΠΙΚΑ ΟΝΟΜΑΤΑ(LOCAL NAMES). Τέλος ένα ή περισσότερα υποπρογράμματα σχηματίζουν το ΠΡΟΓΡΑΜ-
ΜΑ(PROGRAM).
Στο επίπεδο των ΟΝΟΜΑΤΩΝ, εξετάζουμε τόσο τους τύπους των δεδομένων(data types), που αναπα-
ριστούν, όσο και το θέμα του τρόπου που κατανέμεται η μνήμη του υπολογιστή στο σύνολο των
ΟΝΟΜΑΤΩΝ που υπάρχουν κατά την έναρξη επίλυσης ενός προγράμματος(static storage allocation)
ή που δημιουργούνται κατά την εκτέλεσή του(dynamic storage allocation). Ο καταμερισμός της
μνήμης γίνεται είτε στο επίπεδο του μεταφραστή(compiler), είτε στο επίπεδο εκτέλεσης του
προγράμματος(execution time). Η στρατηγική όμως που εφαρμόζεται επιβάλλεται από τη γλώσσα
προγραμματισμού.
Στο επίπεδο των ΥΠΟΠΡΟΓΡΑΜΜΑΤΩΝ και ΠΡΟΓΡΑΜΜΑΤΩΝ εξετάζονται τα θέματα της δέσμευσης των
ΟΝΟΜΑΤΩΝ(binding of names) σε ένα υποπρόγραμμα στα πλαίσια ενός προγράμματος. Εξετάζονται
επίσης οι μηχανισμοί του περάσματος παραμέτρων μεταξύ ενός προγράμματος και των υποπρογραμ-
μάτων. Τέλος εξετάζονται οι αναδρομικές υπορουτίνες(recursive subroutines), δηλ. υπορουτίνες
που καλούν τον εαυτό τους.