HY100 : ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΟΝΤΕΣ Αντώνιος Σαββίδης, Χρήστος Νικολάου
ΧΑΡΑΚΤΗΡΙΣΤΙΚΑ ΓΛΩΣΣΩΝ ΠΡΟΓΡΑΜΜΑΤΣΜΟΥ ΕΝΟΤΗΤΑ ΙII ΧΑΡΑΚΤΗΡΙΣΤΙΚΑ ΓΛΩΣΣΩΝ ΠΡΟΓΡΑΜΜΑΤΣΜΟΥ Διάλεξη 1η HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Περιεχόμενα Εισαγωγή Αλφάβητο Λεξιλόγιο Συντακτικό Σημασιολογία HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Εισαγωγή Οι γλώσσες προγραμματισμού μπορούμε να δείξουμε ότι ακολουθούν τις βασικές έννοιες και αρχές της γλωσσολογίας Αυτό σημαίνει ότι μπορεί να έχουμε διαφορετικές γλώσσες για να «λέμε» ή να «περιγράφουμε» παρόμοια πράγματα όπως τα ακριβή βήματα της εκτέλεσης ενός αλγορίθμου Χρησιμοποιώντας ωστόσο φαινομενικά διαφορετικές γλωσσικές δομές, ώστε να νομίζουμε ότι έχουμε πολύ διαφορετικές γλώσσες Θα μιλήσουμε για την οικογένεια γλωσσών προγραμματισμού στην οποία ανήκει η FLIP, με τις οποίες «προστάζουμε» τον υπολογιστή να κάνει ακριβώς ότι περιγράφουμε για το λόγο αυτό οι γλώσσες αυτές είθισται να είναι γνωστές ως προστακτικές (imperative) γλώσσες προγραμματισμού HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Αλφάβητο Είναι το σύνολο των βασικών συμβόλων τα οποία και επιτρέπονται για τη συγκεκριμένη γλώσσα π.χ. για τη γλώσσα FLIP Λατινικοί χαρακτήρες γραμμάτων, κεφαλαία και μικρά, και ο χαρακτήρας υπογράμμιση (underscore) {a,..,z} {A,…,Z} { _ } Αριθμητικοί χαρακτήρες {0,..,9} Ορισμένοι ειδικοί χαρακτήρες ως ειδικά σύμβολα ή «σημεία στίξης» + * - / % = ( ) . ; [ ] , ‘ " >= <= > < ενώ δεν επιτρέπονται στη FLIP: μη εκτυπώσιμοι χαρακτήρες, ελληνικά γράμματα, σύμβολα όπως τα @ # $ ^! & ^ κλπ HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Λεξιλόγιο (1/2) Σύνολο νόμιμων λέξεων που μπορούν να δημιουργούνται με στοιχεία του αλφάβητου της γλώσσας Πρώτα οι λέξεις κλειδιά (τα παρακάτω είναι της FLIP) ADDRESS ADDRESSEX AND ARGUMENTS BEGIN BOOLEAN CHARACTER CONST_BOOLEAN CONST_CHARACTER CONST_INTEGER CONST_REAL CONST_STRING CONTENTOF CONTENTOFEX DIFFERENT DO ELSE END EQUAL FALSE FALSESTR FINISH FOR FUNCTION GETINPUT GETINPUTEX GRANTPOSITIONS IF INPUT INPUTEX INTEGER LINE NIL NOT OR OUTPUT OUTPUTEX PAGEOF PI POSITION POSITIONOF POSITIONOFEX PROCEDURE PROGRAM_BEGIN PROGRAM_END REAL RECORD RECBEGIN RECEND RELEASEPOSITIONS RESULT ROWOF STOP STRING THEN TRUE TRUESTR USEPOSITION USEREGION WHILE ΤΟ cos curr_date curr_day curr_month curr_year sin sqr sqrt string_get string_isinteger string_isreal string_length string_set tan typeof HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Λεξιλόγιο (2/2) Ονόματα μεταβλητών Σταθερές τιμές τύπου Δεν πρέπει να είναι λέξεις κλειδιά Μπορούν να αρχίζουν με γράμμα ή και υπογράμμιση υπογράμμιση ακολουθούμενο από γράμματα / αριθμούς / υπογράμμιση (χωρίς κενά) π.χ. x y _point my_point myPoint name1 name2 value1x value1y INPUT_MSG Σταθερές τιμές τύπου STRING, π.χ. “hello” “Monday” “give N:” “?” CHARACTER, π.χ. ‘a’ ‘0’ ‘?’ ‘1’ ‘=‘ INTEGER, π.χ. 10 20 –456 +126712 REAL, π.χ. 3.12345 –454.4545 BOOLEAN, π.χ. TRUE FALSE HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Αλφάβητο / λεξιλόγιο Εάν χρησιμοποιούμε στο πρόγραμμα στοιχεία που δεν ανήκουν στο αλφάβητο και το λεξιλόγιο της γλώσσας, έχουμε compile errors, δηλ. λάθη μεταγλώττισης Ο υπηρέτης ή ο εκάστοτε compiler «αρνείται» να μεταγλωττίσει το πρόγραμμά μας, διότι δεν το αναγνωρίζει ως ορθογραφικά σωστό πρόγραμμα και όχι ως λογικά σωστό – αυτό δεν το καταλαβαίνει ένας compiler π.χ. όταν χρησιμοποιήσετε ελληνικά ονόματα για μεταβλητές, π.χ. εμβαδόν ή περίμετρος, ή χαρακτήρες που δεν ανήκουν στο νόμιμο σύνολο (αποδεκτών) συμβόλων, π.χ. $ @ # ή σταθερές σε μορφή που δεν υποστηρίζονται, π.χ. ‘λάθος’ 4,561 HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Γραμματική (1/4) Ορίζει τους κανόνες σωστού συντακτικού ενός προγράμματος, τους οποίους και οφείλει να τους γνωρίζει και σέβεται ο προγραμματιστής – program syntax Π.χ, για τη γλώσσα FLIP Όλες οι απλές εντολές τελειώνουν με το σύμβολο ; Τα blocks ορίζονται ως BEGIN Εντολές END με δυνατότητα οι Εντολές να είναι κενές Ο ορισμός ενός record πάντα τελειώνει με ; Δεν επιτρέπεται ορισμός υποπρογραμμάτων μέσα σε άλλο υποπρόγραμμα Δεν επιτρέπονται εντολές παρά μόνο μέσα σε κάποιο block ή το κυρίως πρόγραμμα κλπ Τυπικό (Accidence). Είναι το σύνολο των κανόνων που ορίζει τις μορφές με τις οποίες μία λέξη είναι αποδεκτή. Για παράδειγμα στην ελληνική γλώσσα οι λέξεις εκτυπωτής, εκτυπωτή, εκτυπωτές είναι δεκτές ενώ η λέξη εκτυπωτ δεν είναι δεκτή. Συντακτικό (Syntax). Είναι το σύνολο των κανόνων που καθορίζει τη νομιμότητα της διάταξης και της σύνδεσης των λέξεων για την δημιουργία των προτάσεων. Σημασιολογία. Είναι το σύνολο των κανόνων που καθορίζει το νόημα των λέξεων και κατά επέκταση των εκφράσεων και προτάσεων που χρησιμοποιούνται σε μία γλώσσα. HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Γραμματική (2/4) Η εντολή εκχώρησης έχει την συντακτική δομή Μεταβλητή = Έκφραση ; Μεταβλητή μπορεί να είναι Αναγνωριστικό όνομα μεταβλητής, π.χ. x y area perimeter Έκφραση στοιχείο ενός πίνακα P[4] P[i] Πεδίο μεταβλητής record, π.χ. start.x end.y Άμεση θέση μνήμης, π.χ. POSITION(10, j) Περιεχόμενο απλής διεύθυνσης, π.χ. CONTENTOF(addr) Περιεχόμενο διεύθυνσης ειδικού τύπου, π.χ. CONTENTOFEX(p) HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Γραμματική (3/4) Η εντολή εκτέλεσης υπό συνθήκη έχει τη μορφή IF Λογική έκφραση ΤΗΕΝ Εντολή IF Λογική έκφραση ΤΗΕΝ Εντολή ELSE Εντολή Με Λογική έκφραση να μπορεί να είναι Σταθερά τιμή boolean Μεταβλητή τύπου boolean Συγκριτική έκφραση με τελεστές > >= < <= EQUAL DIFFERENT Λογική έκφραση με τελεστές AND OR ΝΟΤ Κλήση συνάρτησης με επιστρεφόμενο αποτέλεσμα τύπου boolean Βλέπουμε ότι ορισμένα στοιχεία του συντακτικού εξαρτώνται από τον ορισμό άλλων στοιχείων π.χ. δεν μπορούμε να γνωρίζουμε ακριβώς το συντακτικό της IF παρά μόνο εάν ορίσουμε επιπλέον με ακρίβεια και το συντακτικό της Eντολής HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Γραμματική (4/4) Παραδείγματα x = y * z + 30; IF x > 5 THEN y = x – 5; ELSE y = 5 – x; WHILE N > 0 DO BEGIN OUTPUT(P[N]); N = N-1; END Ο compiler «αρνείται» να μεταγλωττίσει ένα πρόγραμμα όταν αυτό δεν είναι συντακτικά σωστό Δηλ. όταν δεν υπακούει στους κανόνες γραμματικής της αντίστοιχης γλώσσας Π.χ., συντακτικά λανθασμένος κώδικας σε FLIP IF x<45 x = 45 - x; Λείπει το THEN y = ] x [; Άγνωστη συντακτικά έκφραση P(i) = * 10 *; Άγνωστη συντακτικά έκφραση HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Σημασιολογία (1/6) Είναι οι σαφείς κανόνες που ορίζουν κυρίως: τους τύπους δεδομένων και την αντιστοιχία μεταβλητών και εκφράσεων σε μνήμη του προγράμματος τους κανόνες εμβέλειας αναγνωριστικών ονομάτων του προγράμματος τους κανόνες που αφορούν τη νομιμότητα χρήσης καθώς και συμβατότητας μεταξύ εκφράσεων και τύπων του προγράμματος την ακριβή συμπεριφορά των εντολών κατά την εκτέλεση του προγράμματος τον τρόπο υπολογισμού των αριθμητικών και λογικών εκφράσεων τους κανόνες κλήσης και επιστροφής από κλήση των υποπρογραμμάτων HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Σημασιολογία (2/6) Π.χ. IF Έκφραση ΤΗΕΝ Εντολή 1 ELSE Εντολή 2 Εάν η Έκφραση την στιγμή της εκτέλεσης μίας τέτοιας εντολής αποτιμάται στην τιμή TRUE, τότε εκτελείται η Εντολή 1, αλλιώς η Εντολή 2. IF Έκφραση ΤΗΕΝ Εντολή Εάν η Έκφραση την στιγμή της εκτέλεσης μίας τέτοιας εντολής αποτιμάται στην τιμή TRUE, τότε εκτελείται η Εντολή. HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Σημασιολογία (3/6) H σημασιολογία διέπει επίσης και τους κανόνες ελέγχου για τους τύπους δεδομένων σε εκφράσεις Π.χ. στη FLIP επιτρέπεται εκχώρηση σε μία μεταβλητή τύπου INTEGER μόνο εκφράσεων τύπου: INTEGER, REAL και σταθερών CHARACTER Ποιες λοιπόν από τις παρακάτω εκχωρήσεις δεν σημασιολογικά ορθές? INTEGER a, b = 10, c = b, P[10]; a = b + 1; a = b + c + 1 + 0 + 1 + 0 + 1; a = ‘a’; a = “a”; a = PI * a; a = GETINPUT; a = P; a = INTEGER; Πιθανό runtime error HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Σημασιολογία (4/6) Ορίζονται οι ακριβείς κανόνες στην κλήση και χρήση υποπρογραμμάτων (1/3) Πρέπει το καλούμενο υποπρόγραμμα, η τουλάχιστον η επικεφαλίδα του, να προηγείται, σε καθολική εμβέλεια τους σημείου χρήσης Πρέπει οπωσδήποτε να υπάρχει σε κάποιο σημείο του κώδικα σε καθολική εμβέλεια μία και μοναδική υλοποίηση ενός υποπρογράμματος του οποίου δηλώνεται αρχικά η επικεφαλίδα Κατά την κλήση υποπρογράμματος πρέπει κάθε ένα από τα πραγματικά ορίσματα να είναι ιδίου ή συμβατού τύπου με το αντίστοιχο τυπικό όρισμα στο υποπρόγραμμα HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Σημασιολογία (5/6) Ορίζονται οι ακριβείς κανόνες στην κλήση και χρήση υποπρογραμμάτων (1/3) Κατά την κλήση προηγείται πάντα ο υπολογισμός όλων των εκφράσεων που δίνονται ως πραγματικά ορίσματα και έπειτα γίνεται η εκτέλεση του υποπρογράμματος Η κλήση μίας procedure πρέπει να εμφανίζεται ως ανεξάρτητη εντολή και ποτέ μέσα σε άλλου είδους έκφραση Η κλήση μίας function ως έκφραση φέρει τύπο ίδιο με τον τύπο του αποτελέσματος της συνάρτησης και τιμή αυτή που θα επιστρέψει η function με το πέρας της κλήσης Κατά την κλήση, οι οι τύποι των πραγματικών ορισμάτων πρέπει να συμφωνούν με τους τύπους των αντίστοιχων τυπικών ορισμάτων HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Υπολείπεται η FUNCTION max!!! Σημασιολογία (6/6) FUNCTION(INTEGER) max ARGUMENTS (ADDRESSEX(INTEGER) p, INTEGER n); ARRAY(INTEGER, 5) numArray; PROCEDURE PrintMax(ADDRESSEX(INTEGER) p, INTEGER n) BEGIN OUTPUT(max(p,n)); END PROGRAM_BEGIN INTEGER x; x = PrintMax; x = PrintMax(); x = PrintMax(numArray, n); OUTPUT(PrintMax(numArray, n)); PRORGRAM_END PROCEDURE PrintMax (ADDRESSEX(INTEGER) p, INTEGER n); Υπολείπεται η FUNCTION max!!! HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Σχέσεις μεταξύ γλωσσών προγραμματισμού Συνήθως οι προστακτικές γλώσσες προγραμματισμού διαφέρουν μεταξύ τους ως προς τα παρακάτω Αλφάβητο – σημαντικά Λεξιλόγιο – σημαντικά Συντακτικό – αρκετά Σημασιολογία εντολών – λίγο Προφανώς η «απόσταση» ποικίλει ανάλογα με το ποιο ζεύγος γλωσσών διαλέγουμε να συγκρίνουμε ως προς την ομοιότητά τους Αυτό που θα μας αργότερα είναι η σχέση της γλώσσας FLIP με τη γλώσσα C Θα δούμε πόσο εύκολη είναι η μετάβαση από τη μία γλώσσα στην άλλη HY100, 2005 Α. Σαββίδης, Χ. Νικολάου