Βασικές Έννοιες Προγραµµατισµός Ι lalis@inf.uth.gr 1
Αλγόριθµος Αλγόριθµο, µε την ευρύτερη έννοια του όρου, ονοµάζουµε την ακολουθία των ενεργειών που πρέπει να πραγµατοποιηθούν για να λυθεί ένα συγκεκριµένο (π.χ. υπολογιστικό) πρόβληµα. Συνηθισµένοι παράµετροι προβληµάτων: σωστός υπολογισµός του αποτελέσµατος καλή απόδοση (ταχύτητα) εξοικονόµηση πόρων (µνήµη, ενέργεια, δίκτυο) Για κάθε πρόβληµα µπορεί να υπάρχουν πολλοί διαφορετικοί αλγόριθµοι, µε διαφορετικές ιδιότητες. Προγραµµατισµός Ι lalis@inf.uth.gr 2
Γλώσσα προγραµµατισµού Ένας αλγόριθµος µπορεί να περιγραφεί σε µια συµβατική καθοµιλουµένη γλώσσα ή/και µε την βοήθεια κάποιας ειδικής γλώσσας προσδιορισµού. Μια γλώσσα προσδιορισµού έχει συγκεκριµένους κανόνες σύνταξης (ποιές προτάσεις επιτρέπονται) και συγκεκριµένη σηµασιολογία (τη σηµασία έχει κάθε επιτρεπτή πρόταση). Μια γλώσσα προγραµµατισµού είναι µια (ειδική) γλώσσα προσδιορισµού, η οποία σχεδιάζεται έτσι ώστε κάθε επιτρεπτή πρόταση της να µπορεί να µετατραπεί σε εντολές που εκτελούνται σε ειδικά σχεδιασµένες µηχανές εκτέλεσης πιο συγκεκριµένα τον επεξεργαστή (CPU) ενός Η/Υ. Προγραµµατισµός Ι lalis@inf.uth.gr 3
Πρόγραµµα Ένα πρόγραµµα δεν είναι τίποτα παραπάνω (αλλά ούτε και λιγότερο) από µια πρόταση που γράφεται στα πλαίσια µιας γλώσσας προγραµµατισµού. Όπως κάθε πρόταση, ένα πρόγραµµα πρέπει να είναι (α) συντακτικά σωστό (β) σηµασιολογικά ορθό. Αντίθετα µε περιγραφές που δίνονται σε κάποια καθοµιλουµένη ή/και µαθηµατική γλώσσα, ένα πρόγραµµα µπορεί να εκτελεστεί σε έναν Η/Υ. Προγραµµατισµός Ι lalis@inf.uth.gr 4
Συντακτικό Το συντακτικό µιας γλώσσας ορίζει το σύνολο των επιτρεπτών προτάσεων (ακολουθία συµβόλων). Κάθε επιτρεπτή πρόταση αντιστοιχεί σε ένα συντακτικά ορθό πρόγραµµα, το οποίο µπορεί να µεταφραστεί επιτυχώς και να εκτελεστεί. Υπάρχουν ειδικές γλώσσες περιγραφής των κανόνων σύνταξης γλωσσών προγραµµατισµού, π.χ.: Extended Backus Naur Form (EBNF) συντακτικά διαγράµµατα Ο µόνος τρόπος να κατανοήσει κανείς (πλήρως) όλες τις επιτρεπτές προτάσεις µιας γλώσσας είναι να συµβουλευτεί αυτές τις περιγραφές. Προγραµµατισµός Ι lalis@inf.uth.gr 5
EBNF Συµβολισµός Σηµασία Α Α Α Β Α ακολουθούµενο από το Β Α Β Α ή Β [Α] «τίποτα» ή Α {Α} «τίποτα» ή Α ή ΑΑή ΑΑΑή... 'Α' το τερµατικό στοιχείο 'Α' Προγραµµατισµός Ι lalis@inf.uth.gr 6
Συντακτικά διαγράµµατα Συµβολισµός Α Α Α Β Α Α Β Σηµασία Α Α και µετά Β Α ή Β «τίποτα» ή Α «τίποτα» ή Α ή ΑΑή ΑΑΑή... Α το τερµατικό στοιχείο 'Α' Προγραµµατισµός Ι lalis@inf.uth.gr 7
Σύνταξη και σηµασία Σύνταξη: κανόνες για τον σχηµατισµό προτάσεων. Σηµασία: το νόηµα (π.χ. σειρά αποτίµησης) που έχουν οι συντακτικά επιτρεπτές προτάσεις. Η σύνταξη µιας γλώσσας δεν µπορεί να ορίσει ταυτόχρονα και την σηµασία της, αλλά υπάρχουν γλώσσες προσδιορισµού σηµασίας (σηµασιολογίας). Υπάρχουν όµως συντακτικά επιτρεπτές προτάσεις που δεν έχουν ορισµένη (µια µοναδική) σηµασία; Σε γλώσσες προγραµµατισµού: πιθανώς, αλλά είναι λάθος(!) να τις χρησιµοποιεί ο προγραµµατιστής. Στην ανθρώπινη γλώσσα: βεβαίως, στην οποία περίπτωση απλά προκαλείται κάποια σύγχιση. Προγραµµατισµός Ι lalis@inf.uth.gr 8
ΕBNF ακέραια-έκφραση = ακέραιος[πράξη ακέραια-έκφραση] ακέραιος = [πρόσηµο]νούµερο{νούµερο} νούµερο = '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' πρόσηµο = '+' '-' πράξη = '+' '-' '*' '/' Syntax diagram ακέραια-έκφραση ακέραιος πράξη ακέραια-έκφραση πρόσηµο ψηφίο ακέραιος ψηφίο + 0 πράξη - * πρόσηµο + - ψηφίο 1 / Προγραµµατισµός Ι lalis@inf.uth.gr 9 9
Παραδείγµατα Συντακτικά ορθές προτάσεις: -2+13 15/5-2 Όµως, σε τι τιµές αντιστοιχούν; -2+13 (-2)+(13) ή (2+13) 15/5-2 (15/5)-2 ή 15/(5-2) Η προηγούµενη σύνταξη δεν ορίζει (ούτε και θα µπορούσεποτέναορίσει) την σειρά αποτίµησης, δηλαδή την σηµασία, των παραπάνω προτάσεων. Προγραµµατισµός Ι lalis@inf.uth.gr 10
Εκτέλεση εντολών Προγραµµατισµός Ι lalis@inf.uth.gr 11
Εκτέλεση εντολών Οι εντολές ενός προγράµµατος εκτελούνται από «αριστερά προς τα δεξιά» και «από πάνω προς τα κάτω», όπως διαβάζουµε ένακείµενο. Μπορεί να γίνουν άλµατα, είτε «προς τα εµπρός» είτε «προς τα πίσω», οπότε κάποιες εντολές µπορεί να παρακαµφθούν ή/και να εκτελεστούν παραπάνω από µια φορά. Τα άλµατα πραγµατοποιούνται µε ειδικές εντολές που ορίζει κάθε γλώσσα προγραµµατισµού: (α) ελέγχου ροής εκτέλεσης προγράµµατος (β) κλήσης υποπρογραµµάτων Προγραµµατισµός Ι lalis@inf.uth.gr 12
Μοντέλο εκτέλεσης προγράµµατος επέλεξε την πρώτη εντολή µνήµη εκτέλεσε την εντολή διάβασµα γράψιµο µεταβλητές προγράµµατος επέλεξε την επόµενη εντολή Προγραµµατισµός Ι lalis@inf.uth.gr 13
Έλεγχος ροής εκτέλεσης Ο προγραµµατιστής µπορεί να επηρεάσει την ροή εκτέλεσης του προγράµµατος µέσω εντολών ελέγχου. Οι εντολές ελέγχου διαβάζουν την κατάσταση του προγράµµατος και ανάλογα µεταφέρουν τον έλεγχο σε ένα διαφορετικό σηµείο του κώδικα. Έστω η εντολή if <έκφραση> goto <n> µε την εξής σηµασιολογία: αν η <έκφραση> είναι αληθής τότε η εκτέλεση µεταφέρεται στην εντολή µε αριθµό <n> στο κείµενο του προγράµµατος. Μπορούµε εύκολα να φτιάξουµε προγράµµατα µε εντολές που εκτελούνται υπό συνθήκη ή/και επανειληµµένα. Προγραµµατισµός Ι lalis@inf.uth.gr 14
παράµετροι πρόγραµµα P(x,y) 1:s <- 0 2:if (x=0) goto 6 3:s <- s + y 4:x <- x -1 5:if (1=1) goto 2 6:print s εκτέλεση P(0,5) s <- 0 if (x=0) goto 6 print s εκτέλεση P(3,5) s <- 0 if (x=0) goto 6 s <- s + y x <- x -1 if (1=1) goto 2 if (x=0) goto 6 s <- s + y x <- x -1 if (1=1) goto 2 if (x=0) goto 6 s <- s + y x <- x -1 if (1=1) goto 2 if (x=0) goto 6 print s Προγραµµατισµός Ι lalis@inf.uth.gr 15
Σχόλιο Το κείµενο (κώδικας) του προγράµµατος είναι δεδοµένο, δεν αλλάζει την ώρα της εκτέλεσης. Παρ όλα αυτά, όταν χρησιµοποιούνται εντολές ελέγχου, η σειράµε την οποία θα εκτελεσθούν οι εντολές στην πραγµατικότητα δεν είναι γνωστή εκ των πρoτέρων. Η σειρά εκτέλεσης εξαρτάται από την (αρχική / τρέχουσα) κατάσταση του προγράµµατος. Μια αρχική κατάσταση ΑΚ1 µπορεί να οδηγήσει σε µια εκτέλεση Ε1, και µια αρχική κατάσταση ΑΚ2 µπορεί να οδηγήσει σε µια διαφορετική εκτέλεση Ε2. Προγραµµατισµός Ι lalis@inf.uth.gr 16
Υποπρογράµµατα Χρησιµοποιούµε τονόρο«υποπρόγραµµα» για να αναφερθούµε σεµια οµάδα εντολών (και δεδοµένων) που είναι συντακτικά ή/και εκτελεστικά ανεξάρτητη (αυτόνοµη) από τον υπόλοιπο κώδικα. Ένα πρόγραµµα µπορεί να αποτελείται από (ή να χρησιµοποιεί) πολλά διαφορετικά υποπρογράµµατα. Η χρήση υποπρογραµµάτων βοηθά σηµαντικά στην (α) δοµηµένη ανάπτυξη, (β) αναγνωσιµότητα και (γ) επαναχρησιµοποίηση του κώδικα. Όταν καλείται ένα υποπρόγραµµα, η εκτέλεση µεταφέρεται στο υποπρόγραµµα, και όταν τερµατιστεί η εκτέλεση του, επιστρέφει στο πρόγραµµα πουπραγµατοποίησε την κλήση. Προγραµµατισµός Ι lalis@inf.uth.gr 17
πρόγραµµα P1 code A call P2 code B πρόγραµµα P2 call P3 code C return πρόγραµµα P3 code D return εκτέλεση P1 code A call P2 call P3 code D return code C return code B Προγραµµατισµός Ι lalis@inf.uth.gr 18
Μνήµη και µεταβλητές Προγραµµατισµός Ι lalis@inf.uth.gr 19
Κωδικοποίηση δεδοµένων στους Η/Υ Καθώς η µνήµη τουη/υ είναιδυαδική, όλα τα δεδοµένα ενός προγράµµατος αποθηκεύονται σαν ακολουθίες από bits, δηλαδή τιµές 0 ή 1. Κωδικοποίηση: η µετατροπή δεδοµένων από ένα σύστηµα σε ένα άλλο (π.χ. δεκαδικό -> δυαδικό). Όσο µεγαλύτερο το πεδίο τιµών που επιθυµούµε να καλύψουµε καιόσοµεγαλύτερη η ακρίβεια µε την οποία επιθυµούµε νακαταγράψουµε τιςτιµές αυτές, τόσο περισσότερα bits/bytes απαιτούνται για την αποθήκευση της ψηφιακής τιµής. Με Ν bits κωδικοποιούµε 2 Ν διαφορετικές τιµές, π.χ. Καλύπτουµε τοπεδίοφυσικών[0...2 Ν -1] ή αντίστοιχα το πεδίο ακεραίων [-2 Ν-1...2 Ν-1-1]. Προγραµµατισµός Ι lalis@inf.uth.gr 20
Μνήµη Η/Υ Η µνήµη των Η/Υ είναι ουσιαστικά µια διάταξη από «κουτιά» κάθε ένα από τα οποία µπορεί να χρησιµοποιηθεί για την αποθήκευση 1 bit (0 / 1). Ένας τυπικός Η/Υ διαθέτει κύρια µνήµη (RAM) εκατοντάδων Megabyte έως και λίγων Gigabyte, και σκληρό δίσκο πολλών δεκάδων Gigabyte. 1 byte = 8 bits 1 KiB = 1024 B = 2 10 B (1 KB = 1000 B = 10 3 B) 1 MiB = 1024 KiB (1 MB = 1000 KB) 1 GiB = 1024 MiB (1 GB = 1000 MB) 1 TiB = 1024 GiB (1 TB = 1000 GB) Προγραµµατισµός Ι lalis@inf.uth.gr 21
Μοντελοποίηση και πρόσβαση µνήµης Η µνήµη τουη/υ µοντελοποιείται (αφαιρετικά) ως µια συστοιχία από Ν (συνεχόµενα) bytes. Η µνήµη προσπελαύνεται, προσδιορίζοντας: (α) την θέση (διεύθυνση) του byte από το οποίο αρχίζει να εφαρµόζεται η πράξη (β) τον αριθµό bytes που αφορά η πράξη Ηπράξη«ανάγνωσης» επιστρέφει τις τιµές των bytes που έχουν αποθηκευτεί στις αντίστοιχες θέσεις. Ηπράξη«γραψίµατος» προσδιορίζει τις τιµές των bytes προς αποθήκευση στις αντίστοιχες θέσεις. Προγραµµατισµός Ι lalis@inf.uth.gr 22
διεύθυνση περιεχόµενα op=read 0 1 0 0 1 1 0 1 0 1 1 1 1 0 1 0 1 0 adr=3 2 1 1 0 1 0 1 1 1 len=1 10101011 µηχανισµός πρόσβασης µνήµης 3 4 5 1 0 1 0 1 0 1 1 0 0 1 1 0 1 0 1 1 1 1 1 1 0 1 0... Ν-1 0 0 0 0 0 1 0 1 Ν 1 1 0 1 1 0 0 1 Προγραµµατισµός Ι lalis@inf.uth.gr 23
διεύθυνση περιεχόµενα adr=1 len=2 00010101 11101010 op=write µηχανισµός πρόσβασης µνήµης Η/Υ 0 1 2 3 4 5 Ν-1 Ν 0 0 1 1 0 1 0 1 0 0 0 1 0 1 0 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 1 0 1 0 1 1 1 1 1 1 0 1 0... 0 0 0 0 0 1 0 1 1 1 0 1 1 0 0 1 Προγραµµατισµός Ι lalis@inf.uth.gr 24
εδοµένα προγράµµατος και µνήµη Για κάθε δεδοµένο που χρησιµοποιεί ένα πρόγραµµα, πρέπει να καθοριστεί (από τον προγραµµατιστή): (α) η θέσηµνήµης για την αποθήκευση του (β) ο αριθµός των bytes που χρειάζονται για την αποθήκευση των τιµών που µπορεί να λάβει (γ) η κωδικοποίηση που χρησιµοποιείται για κάθε τιµή στο δυαδικό σύστηµα (της µνήµης) Είναι ιδιαίτερα δύσκολο άν όχι αδύνατο για τον προγραµµατιστή να θυµάται µια τέτοια αντιστοίχιση, για κάθε δεδοµένο που χρησιµοποιεί το πρόγραµµα, κατά την συγγραφή ή/και ανάγνωση του κώδικα. Χρειάζεται κατάλληλη υποστήριξη από τις γλώσσες προγραµµατισµού... Προγραµµατισµός Ι lalis@inf.uth.gr 25
Τύποι δεδοµένων Για διευκόλυνση του προγραµµατιστή, κάθε γλώσσα ορίζει ένα σύνολο από βασικούς τύπους δεδοµένων. Κάθε βασικός τύπος έχει ένα (α) εκ των προτέρων καθορισµένο µέγεθος (σε bytes) και χαρακτηρίζεται (β) από µια συγκεκριµένη δυαδική κωδικοποίηση και κατα συνέπεια και ένα αντίστοιχο πεδίο τιµών. Ο προγραµµατιστής µπορεί να ορίσει κάθε δεδοµένο του προγράµµατος ως ένα αντικείµενο ενός τύπου, καθορίζοντας έτσι (έµµεσα) τόσο το µέγεθος όσο και την κωδικοποίηση του (την σηµασία των bits). Σηµείωση: η µνήµη του Η/Υ αποθηκεύει τις τιµές των bits/bytes χωρίς να γνωρίζει τον τύπο τους, δηλαδή το πως αυτές ερµηνεύονται από το πρόγραµµα. Προγραµµατισµός Ι lalis@inf.uth.gr 26
Ονοµασία (θέσεων) δεδοµένων Για ευκολία, σε κάθε αντικείµενο δεδοµένων δίνεται (εκτός από τον τύπο του) και ένα µνηµονικό όνοµα. Το όνοµα του δεδοµένου µπορεί να χρησιµοποιείται, αντί της διεύθυνσης του, στις πράξεις ανάγνωσης και αλλαγής τών τιµών του. Σηµείωση: η πρόσβασηστηνµνήµη εξακολουθεί να γίνεται µε βάση την θέση µνήµης και τον αριθµό bytes προς ανάγνωση/αποθήκευση η αντιστοίχιση αυτή γίνεται (αυτόµατα) από την εκάστοτε γλώσσα προγραµµατισµού (µεταφραστή). Προγραµµατισµός Ι lalis@inf.uth.gr 27
Μεταβλητές προγράµµατος Με τον όρο µεταβλητή αναφερόµαστε σε ένα αντικείµενο δεδοµένων του προγράµµατος στο οποίο έχει δοθεί ένα όνοµα και τύπος. Όταν λέµε ότι«διαβάζουµε» µια µεταβλητή, εννοούµε ότι διαβάζουµε τηντιµή πουέχει αποθηκευτεί στην αντίστοιχη θέση της µνήµης. Όταν λέµε ότι«αναθέτουµε» µια τιµή σεµια µεταβλητή, εννοούµε ότι γράφουµε αυτήτην τιµή στην αντίστοιχη θέση της µνήµης. Με τον όρο «δέσµευση» µεταβλητής εννοούµε την δέσµευση αντίστοιχου χώρου στην µνήµη, και µε τον όρο «ζωή» µεταβλητής εννοούµε το διάστηµα κατά το οποίο αυτός ο χώρος παραµένει δεσµευµένος. Προγραµµατισµός Ι lalis@inf.uth.gr 28
int v; θεση/διεύθυνση: 3 τύπος: int διεύθυνση περιεχόµενα τύπος int 0 1 Ν-1 Ν 0 0 1 1 0 1 0 1 0 0 0 1 0 1 0 1 µέγεθος: 2 bytes 2 1 1 1 0 1 0 1 0 ερµηνεία: ακέραιος κωδικοποίηση: 2 s complement 3 0 0 0 0 0 0 0 1 4 0 0 0 0 0 0 0 0 τι τιµή έχει η µεταβλητή v; 5 1 1 1 1 1 0 1 0 διάβασε από την διεύθυνση της v όσα bytes ορίζει ο τύπος της T, και ερµήνεψε τα σύµφωνα µε την σύµβαση κωδικοποίησης του T... 0 0 0 0 0 1 0 1 1 1 0 1 1 0 0 1 αποτέλεσµα Προγραµµατισµός Ι lalis@inf.uth.gr 29
Τελεστές πράξεων και ανάθεσης Κάθε γλώσσα δίνει, µέσω κατάλληλων εκφράσεων, την δυνατότητα χρήσης της τιµής των µεταβλητών για την παραγωγή νέων τιµών (του ιδίου τύπου). Κάθε τύπος δεδοµένων µπορεί να έχει ειδικούς τελεστές πράξεων µε αντίστοιχη σηµασιολογία. Οι τιµές που υπολογίζονται µέσα από εκφράσεις πράξεων µπορεί να χρησιµοποιηθούν «αυτούσιες» ή/και να αποθηκευτούν σε (νέες) µεταβλητές. Ηαποθήκευσηµιας τιµής σε µεταβλητή γίνεται µέσω ειδικής πράξης που ονοµάζεται και ανάθεση. Συνήθως υπάρχει ένας µοναδικός τελεστής ανάθεσης, για όλους τους τύπους των δεδοµένων. Προγραµµατισµός Ι lalis@inf.uth.gr 30
Είσοδος / Έξοδος (input/output) έξοδος είσοδος πρόγραµµα Ένα πρόγραµµα πρέπειναµπορεί να εισάγει/εξάγει δεδοµένα από/προς το «περιβάλλον» του, συνήθως από το πληκτρολόγιο και προς την οθόνη του Η/Υ. Γιααυτότοσκοπόορίζονται/υποστηρίζονται ειδικές εντολές εισόδου/εξόδου (input/output commands). Προγραµµατισµός Ι lalis@inf.uth.gr 31
Μετάφραση Προγραµµατισµός Ι lalis@inf.uth.gr 32
Μετάφραση / µεταγλώτιση (compilation) Οι εντολές µιας γλώσσας προγραµµατισµού σπάνια αντιστοιχούν (επακριβώς) σε εντολές της γλώσσας (µηχανής) που εκτελεί ένας επεξεργαστής Η/Υ. Για να εκτελεστεί ένα πρόγραµµα, πρέπει οι εντολές του να µετατραπούν σε εντολές γλώσσας µηχανής. Αυτό ονοµάζει µεταγλώτιση και γίνεται από ειδικά προγράµµατα, τους µεταγλωτιστές (compilers). Η µεταγλώτιση γίνεται (συνήθως) ως ξεχωριστή διαδικασία, πολύ πριν αρχίσει η εκτέλεση του κώδικα. Υπάρχουν περιπτώσεις όπου η µετάφραση γίνεται ακριβώς πριν την εκτέλεση (just in time compilation). Προγραµµατισµός Ι lalis@inf.uth.gr 33
Px compiler Χ -> Y P y CPU y Προγραµµατισµός Ι lalis@inf.uth.gr 34
Px compiler X -> Z P z compiler Z -> Y P y CPU y Προγραµµατισµός Ι lalis@inf.uth.gr 35
Ερµηνεία (interpretation) Όταν ο κώδικας δεν µεταφράζεται σε γλώσσα µηχανής αλλά εκτελείται, εντολή προς εντολή, µέσα από ένα άλλο πρόγραµµα, τότε αυτό ονοµάζεται ερµηνεία και το πρόγραµµα που την πραγµατοποιεί διερµηνέας (interpreter). Ηερµηνεία οδηγεί συνήθως σε πιο αργή εκτέλεση από την µετάφραση, γιατί (α) δεν γίνεται αποδοτική απεικόνιση των πράξεων σε εντολές επεξεργαστή, και (β) δεν µπορεί να γίνουν βελτιστοποιήσεις. Όµως µε την ερµηνεία ο κώδικας είναι (1) συνήθως πιο µικρός σε µέγεθος και (2) µεταφέρσιµος οπότε µπορεί να εκτελεσθεί σε διαφορετικές πλατφόρµες χωρίς ανάγκη µετάφρασης για κάθε µια από αυτές. Προγραµµατισµός Ι lalis@inf.uth.gr 36
Px compiler X -> Z P z Z interpreter CPU y Προγραµµατισµός Ι lalis@inf.uth.gr 37
Σχόλιο Γιατί δεν γράφουµε τα προγράµµατα µας απ ευθείας στην γλώσσα του επεξεργαστή; 1. Ανεξαρτησία: ο κώδικας υψηλού επιπέδου έχει ισχύ ανεξάρτητα από τους διάφορους επεξεργαστές Η/Υ που υπάρχουν και θα υπάρξουν στο µέλλον. 2. Αφαίρεση: ο κώδικας υψηλού επιπέδου βασίζεται σε πολύπλοκες εκφράσεις (που µπορεί να µην υφίστανται στην γλώσσα ενός επεξεργαστή) που διευκολύνουν σηµαντικά τον προγραµµατισµό. 3. Αναγνωσιµότητα: ο κώδικας υψηλού επιπέδου είναι (συνήθως) πολύ πιο κατανοητός σε έναν άνθρωπο από τον κώδικα σε επίπεδο επεξεργαστή, και άρα είναι πιο εύκολο να επιδιορθωθεί / αλλαχθεί. Προγραµµατισµός Ι lalis@inf.uth.gr 38
Ορθότητα προγραµµάτων Αν στη µετάφραση εντοπιστεί συντακτικό λάθος, αυτή τερµατίζεται (εκτυπώνεται µήνυµα λάθους), διαφορετικά παράγεται κώδικας µηχανής. Το γεγονός ότι ένα πρόγραµµα µεταφράστηκε επιτυχώς δεν εγγυάται ότι η εκτέλεση του θα έχει και το επιθυµητό / αναµενόµενο αποτέλεσµα. Η εκτέλεση ενός (µεταγλωτισµένου) προγράµµατος γίνεται πάντα σωστά, δηλαδή όπως ορίζεται από την σηµασιολογία της γλώσσας προγραµµατισµού. Αυτό δεν σηµαίνει ότι το πρόγραµµα κάνειαυτόπου θέλουµε µπορεί να υπάρχουν σηµασιολογικά ή/και λογικά λάθη. Προγραµµατισµός Ι lalis@inf.uth.gr 39
Υπολογισµός x=1+2+...+n Στην καθοµιλουµένη γλώσσα: Θέσε το x ίσο µε 0. Πρόσθεσε στο x την τιµή 1. Πρόσθεσε στο x την τιµή 2. Πρόσθεσε στο x την τιµή 3.... Πρόσθεσε στο x την τιµή n-1. Πρόσθεσε στο x την τιµή n. Στη γλώσσα προγραµµατισµού C: x = 0; x = x+1; x = x+2 x = x+3;... x = x+n-1; x = x+n; εντοπίζεται από τον µεταφραστή συντακτικό λάθος δεν έχουµε βάλει; εκεί που θα έπρεπε Προγραµµατισµός Ι lalis@inf.uth.gr 40
Υπολογισµός x=1+2+...+n Στην καθοµιλουµένη γλώσσα: Θέσε το x ίσο µε 0. Πρόσθεσε στο x την τιµή 1. Πρόσθεσε στο x την τιµή 2. Πρόσθεσε στο x την τιµή 3.... Πρόσθεσε στο x την τιµή n-1. Πρόσθεσε στο x την τιµή n. Στη γλώσσα προγραµµατισµού C: x = 0; x = x+1; x == x+2; x = x+3;... x = x+n-1; x = x+n; δεν εντοπίζεται από τον µεταφραστή σηµασιολογικό λάθος δεν έχουµε καταλάβει τι κάνει ο τελεστής == Προγραµµατισµός Ι lalis@inf.uth.gr 41
Υπολογισµός x=1+2+...+n Στην καθοµιλουµένη γλώσσα: Θέσε το x ίσο µε 0. Πρόσθεσε στο x την τιµή 1. Πρόσθεσε στο x την τιµή 3. Πρόσθεσε στο x την τιµή 3.... Πρόσθεσε στο x την τιµή n-1. Πρόσθεσε στο x την τιµή n. Στη γλώσσα προγραµµατισµού C: x = 0; x = x+1; x = x+3; x = x+3;... x = x+n-1; x = x+n; δεν εντοπίζεται από τον µεταφραστή λογικό λάθος έχουµε υλοποιήσει λάθος αλγόριθµο Προγραµµατισµός Ι lalis@inf.uth.gr 42
Αποσφαλµάτωση Συντακτικό επίπεδο (εύκολο) ο κώδικας δεν αντιστοιχεί σε επιτρεπτή πρόταση σύµφωνα µε τους κανόνες σύνταξης της γλώσσας Σηµασιολογικό επίπεδο (δύσκολο) ο κώδικας είναι συντακτικά σωστός αλλά εµείς δεν χρησιµοποιούµε σωστά κάποια εντολή (η πρόθεση µας δεν συµπίπτει µε την αντίστοιχη σηµασιολογία) και παράγεται λάθος αποτέλεσµα Λογικό επίπεδο (πιο δύσκολο) ο κώδικας είναι συντακτικά σωστός και όλες οι εντολές χρησιµοποιούνται σωστά, όµως υπάρχει λάθος σε επίπεδο αλγορίθµου (σκέψης) Προγραµµατισµός Ι lalis@inf.uth.gr 43
Αποσφαλµάτωση Λάθη σε σηµασιολογικό επίπεδο προκύπτουν γιατί δεν µπήκαµε ποτέστονκόποναδιαβάσουµε και να καταλάβουµε τηνσηµασιολογία της γλώσσας βασιζόµαστε σε µηχανισµούς (π.χ. µετατροπής τύπων) της γλώσσας που δεν κατέχουµε πλήρως ησηµασιολογία της γλώσσας είναι ελλειπώς ορισµένη και (κακώς) χρησιµοποιούµε εκφράσεις µε απροσδιόριστη / αβέβαιη σηµασία (κατάληξη) από τυχαίο λάθος σε επίπεδο γραψίµατος (ένας χαρακτήρας λιγότερο / περισσότερο, µικρά ή/και κεφαλαία γράµµατα, κλ), που οδηγεί σε µια διαφορετική αλλά (ατυχώς) επιτρεπτή έκφραση Προγραµµατισµός Ι lalis@inf.uth.gr 44