View on GitHub

dituoi_agp

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

1. Εισαγωγή

1.1 Λόγοι μελέτης εννοιών γλωσσών προγραμματισμού

1.2 Τομείς προγραμματισμού

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

1.3 Κριτήρια αποτίμησης γλωσσών προγραμματισμού

Κριτήρια:

Χαρακτηριστικά

Απλότητα

Πολλαπλότητα χαρακτηριστικών (feature multiplicity): Οι πολλαπλοί τρόποι με τους οποίους μπορεί να επιτευχθεί ένα αποτέλεσμα επηρεάζουν την απλότητα. Για παράδειγμα στον ακόλουθο κώδικα σε Java η μοναδιαία αύξηση της μεταβλητής count επιτυγχάνεται με 4 διαφορετικούς τρόπους.

count = count + 1;
count += 1;
++count;
count++;

Υπερφόρτωση τελεστών: Ερμηνεία ενός τελεστή με περισσότερους από έναν τρόπους. Για παράδειγμα η υπερφόρτωση του τελεστή + για διανύσματα μπορεί να υλοποιηθεί με διαφορετικούς και μη διαισθητικά ορθούς τρόπους.

Η υπερβολική απλότητα μιας γλώσσας μπορεί να υποβαθμίζει την αναγνωσιμότητα των προγραμμάτων που είναι γραμμένα σε αυτή (π.χ. Assembly).

Ορθογωνικότητα

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

Για παράδειγμα σε μια υποθετική γλώσσα με τύπους δεδομένων int, float, char και τους τελεστές τύπων διατάξεων και δεικτών, η έλλειψη ορθογωνικότητας θα σήμαινε ότι δεν θα μπορούσε να οριστεί κάποιος συνδυασμός τύπου δεδομένων και τελεστή τύπων όπως ο δείκτης σε διάταξη.

Μεγαλύτερη ορθογωνικότητα συνεπάγεται λιγότερες εξαιρέσεις σε κανόνες της γλώσσας.

Οι συναρτησιακές γλώσσες (Lisp, Scheme, Haskell, …) προσφέρουν μεγαλύτερη ορθογωνικότητα από προστακτικές γλώσσες (C, C++, Java, Python, …), αλλά υστερούν σε ταχύτητα εκτέλεσης.

Παραδείγματα έλλειψης ορθογωνικότητας στη C
  1. Μολονότι η C διαθέτει 2 είδη δομημένων τύπων δεδομένων, τις διατάξεις και τις εγγραφές (struct), οι εγγραφές μπορούν να επιστρέφονται από συναρτήσεις αλλά όχι οι διατάξεις. Ωστόσο, θα πρέπει να σημειωθεί ότι η C επιτρέπει την επιστροφή ενός δείκτη προς μια διάταξη.

    orthogonality_violation1.c

  2. Ένα μέλος μιας δομής μπορεί να είναι οποιουδήποτε τύπου δεδομένων εκτός από void ή μια δομή του ίδιου τύπου. Ωστόσο ένα μέλος μιας δομής μπορεί να είναι δείκτης προς void ή δείκτης προς δομή του ίδιου τύπου.

    orthogonality_violation2.c

  3. Ένα στοιχείο μιας διάταξης μπορεί να είναι οποιοδήποτε τύπος δεδομένων εκτός από void ή μια συνάρτηση. Ωστόσο, μπορεί να είναι δείκτης προς void ή δείκτης προς συνάρτηση.

    orthogonality_violation3.c

  4. Οι παράμετροι συναρτήσεων περνούν με τιμή εκτός αν είναι διατάξεις οπότε περνούν με αναφορά (επειδή η εμφάνιση του ονόματος μιας διάταξης χωρίς δείκτη ερμηνεύεται ως η διεύθυνση του πρώτου στοιχείου της διάταξης)

    orthogonality_violation4.c

  5. Εξάρτηση από τα συμφραζόμενα για τον τελεστή + στην έκφραση a + b. Αν το a είναι δείκτης προς μια τιμή float που καταλαμβάνει 4 bytes τότε η τιμή του b θα πολλαπλασιαστεί επί 4 πριν προστεθεί στο a.

    orthogonality_violation5.c


Τύποι δεδομένων

Σχεδίαση συντακτικού

Εκφραστικότητα

Έλεγχος τύπων

Χειρισμός εξαιρέσεων

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

Ψευδωνυμία

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

Aliases στη C

Aliases στη C++

Aliases στην Python

1.4 Επιρροές στη σχεδίαση γλωσσών προγραμματισμού

Οι πλέον σημαντικοί παράγοντες που επηρεάζουν τη σχεδίαση των γλωσσών προγραμματισμού είναι η αρχιτεκτονική των Η/Υ και οι μεθοδολογίες σχεδίασης προγραμμάτων.

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

1.4.2 Μεθοδολογίες σχεδίασης προγραμματισμού

1.5 Κατηγορίες γλωσσών προγραμματισμού

Οι βασικές κατηγορίες γλωσσών προγραμματισμού είναι:

1.6 Συμβιβασμοί στη σχεδίαση γλωσσών προγραμματισμού

Κατά το σχεδιασμό γλωσσών υπάρχουν πάρα πολλά αντικρουόμενα κριτήρια. Για παράδειγμα:

1.7 Μέθοδοι υλοποίησης

1.7.1 Μεταγλώττιση

1.7.2 Καθαρή διερμηνεία

1.7.3 Υβριδικά συστήματα υλοποίησης

Συστήματα JIT (Just In Time)

Ένα σύστημα JIT αρχικά μεταφράζει το πρόγραμμα σε ενδιάμεση γλώσσα. Στη συνέχεια, κατά την εκτέλεση μεταγλωττίζει τις μεθόδους της ενδιάμεσης γλώσσας σε κώδικα μηχανής όταν εκτελούνται, έτσι ώστε μελλοντικές εκτελέσεις τους να είναι ταχύτερες. Συστήματα JIT χρησιμοποιούνται στη Java και στις γλώσσες .NET (C#, F#, VB.NET, JScript, C++/CLI)

1.7.4 Προεπεξεργαστές

Ο προεπεξεργαστής είναι ένα πρόγραμμα που επεξεργάζεται ένα πρόγραμμα πριν το πρόγραμμα μεταγλωττιστεί.

Παραδείγματα με τον προεπεξεργαστή της C

Εντολές προεπεξεργαστή: #include, #define, #ifdef, #ifndef, #else, #elif, #endif, #pragma

Αν δοθεί η εντολή:

  $ gcc -E preprocessor1.c

τότε η έξοδος θα είναι:

  ...
  int main() {
    double x, y=2.7, z=13.1;
    x = ((2*y)>(z/1.7) ? (2*y):(z/1.7));
  }

1.8 Προγραμματιστικά περιβάλλοντα

Ένα προγραμματιστικό περιβάλλον είναι μια συλλογή εργαλείων που χρησιμοποιούνται για την ανάπτυξη λογισμικού.

Editors

IDEs