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

Εισαγωγή

επεξεργασία

Οι γλώσσες προγραμματισμού έχουν κύριο στόχο την προετοιμασία των προγραμμάτων και τη διεύρυνση της χρήσης του υπολογιστή, έτσι ώστε να καλύψει μεγάλο χώρο εφαρμογών. Ονομάστηκαν γλώσσες προγραμματισμού υψηλού επιπέδου(high level languages) σε αντιδιαστολή προς τις γλώσσες μηχανής(machine languages) που κρίθηκαν σαν χαμηλού επιπέδου μέσο επικοινωνίας του ανθρώπου με τη μηχανή. Είναι τεχνητές δομές που φιλοδοξούν να έχουν στην επικοινωνία ανθρώπου-μηχανής ρόλο, ανάλογο με το ρόλο των φυσικών γλωσσών στην επικοινωνία μεταξύ ανθρώπων.

Φυσικές και τεχνητές γλώσσες

επεξεργασία

Μια γλώσσα, φυσική ή τεχνητή, γενικά προσδιορίζεται:

  • Από το αλφάβητό της(alphabet), δηλ. από ένα πεπερασμένο σύνολο στοιχείων που καθένα τους είναι μια φυσική αναπαράσταση μιας από τις ισάριθμες διακριτές καταστάσεις που αντιστοιχούν όλες σε μια γενική αφηρημένη έννοια.
  • Από το λεξιλόγιό της(vocabulary), δηλ. ένα υποσύνολο του συνόλου των πεπερασμένου μήκους ακολουθιών από διατεταγμένα στοιχεία του αλφαβήτου.
  • Από τη γραμματική της(grammar), που περιλαμβάνει το τυπικό(accidence) και το συντακτικό(syntax). Τυπικό, είναι το σύνολο των κανόνων που προσδιορίζουν τη δυνατή εσωτερική δομή του λεξιλογίου δηλ.τη δυνατότητα μιας λέξης να υπάρχει σε ποικιλία μορφών. Συντακτικό, είναι το σύνολο των κανόνων που καθορίζουν τη νομιμότητα(legality) δομών, που αποτελούνται από πεπερασμένου μήκους ακολουθίες διατεταγμένων λέξεων του λεξιλογίου.
  • Από τη σημασιολογία της(semantics): είναι το σύνολο των κανόνων που ερμηνεύουν δηλ. καθορίζουν το νόημα(meaning) μιας συντακτικά σωστής ακολουθίας πεπερασμένου μήκους διατεταγμένων λέξεων του λεξιλογίου.

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

Γλώσσες προγραμματισμού

επεξεργασία

Το αλφάβητο των γλωσσών προγραμματισμού περιορίζεται συνήθως στο σύνολο των χαρακτήρων που είναι διαθέσιμοι στην είσοδο του υπολογιστή(character set).

Σημασιολογία

επεξεργασία

Σειρά χαρακτήρων(character string), είναι μια διατεταγμένη ακολουθία στοιχείων του αλφαβήτου μιας γλώσσας, με έναν πρώτο και έναν τελευταίο όρο, και στην οποία κάθε όρος εκτός από τον τελευταίο έχει έναν μοναδικό επόμενο(successor), ενώ κάθε όρος εκτός από τον πρώτο έχει έναν μοναδικό προηγούμενο(predecessor)

Μήνυμα(message), είναι μια σειρά χαρακτήρων που έχει σχηματιστεί με βάση τους συντακτικούς και σημασιολογικούς κανόνες. Σκοπός του είναι να μεταφέρει πληροφορία.

Κώδικας(code), είναι η αντιστοιχία δύο αλφαβήτων έτσι ώστε αντίστοιχα μηνύματα να μεταφέρουν την ίδια πληροφορία.

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

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

Συνήθως γίνεται διάκριση μεταξύ του νοήματος του προγράμματος και του νοήματος του κώδικα μηχανής που αντιστοιχεί στο πρόγραμμα. Το πρώτο ονομάζεται αφηρημένο νόημα(abstract meaning), ενώ το δεύτερο υλοποίηση του προγράμματος(implementation of the program).

Η μελέτη και η θεωρητική θεμελίωση των γλωσσών προγραμματισμού, είναι αντικείμενο της τυπικής θεωρίας των γλωσσών(Formal Theory of Languages), και γίνεται με τη βοήθεια των εξής θεωρητικών εργαλείων:

  • Γραμματικές ανεξάρτητες περιεχομένου(context-free grammars), για τον προσδιορισμό του συντακτικού μιας γλώσσας.
  • Συντακτικά μεταφραστικά σχήματα(Syntax directed translation schemes) για τον προσδιορισμό της σημασιολογίας.

Η Έννοια του υπολογισμού

επεξεργασία

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

Ο ρόλος των γλωσσών προγραμματισμού

επεξεργασία

Ανεξάρτητα από τη συγκεκριμένη εφαρμογή, η λύση ενός προβλήματος με τη βοήθεια υπολογιστή, ακολουθεί τρία στάδια:

  1. Ακριβής προσδιορισμός του προβλήματος
  2. Ανάπτυξη ενός αντίστοιχου αλγορίθμου, και
  3. Διατύπωση του αλγόριθμου σε μορφή τέτοια, ώστε να μπορεί να υλοποιηθεί σε υπολογιστή (προγραμματισμός).

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

Τα κριτήρια με τα οποία γίνεται η ποιοτική αξιολόγηση των γλωσσών είναι:

  • Η ισχύς της γλώσσας, δηλ. η δυνατότητα που παρέχει η γλώσσα να εκφράζονται και να διατυπώνονται σύνθετες λειτουργίες με συγκεκριμένο και άμεσο τρόπο(με εντολές της γλώσσας).
  • Η εξάρτηση της γλώσσας από τη συγκεκριμένη οργάνωση του υπολογιστικού συστήματος στο οποίο θα εκτελεστεί το πρόγραμμα. Γλώσσες που έχουν σχεδιαστεί για χρήση σε υπολογιστές γενικού σκοπού, δεν πρέπει να επηρεάζονται από τα δομικά χαρακτηριστικά του συστήματος και να επιβαρύνουν έτσι τη μορφή του προγράμματος με στοιχεία που ουσιαστικά δεν το αφορούν.
  • Η απλότητα και η κομψότητα της γλώσσας. Η απαίτηση αυτή οδήγησε στη δημιουργία γλωσσών που προσφέρονται στην ανάπτυξη προγραμμάτων που χαρακτηρίζονται από δομή(structured programming).

Δομικά στοιχεία των γλωσσών προγραμματισμού

επεξεργασία

Μια γλώσσα χαρακτηρίζεται όχι μόνο από τις συγκεκριμένες εντολές και λειτουργίες που μπορεί να εκτελέσει άμεσα, αλλά επίσης και από τους τύπους και γενικά τις δομές δεδομένων(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), δηλ. υπορουτίνες που καλούν τον εαυτό τους.