Δρ. Χρήστος Ηλιούδης
Τι είναι η ; Η διαδικασία του προγραμματισμού είναι μία πολύπλοκη διαδικασία που συχνά οδηγεί σε λάθη (πραγματοποιείται από ανθρώπους!!!). Τα προγραμματιστικά λάθη λέγονται bugs και η διαδικασία εντοπισμού και διόρθωσής τους ονομάζεται (debugging). ΕΛΕΓΧΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΕΝΤΟΠΙΣΜΟΣ ΛΑΘΩΝ ΔΙΟΡΘΩΣΗ ΛΑΘΩΝ ΕΚΣΦΑΛΜΑΤΩΣΗ
Είδη λαθών Συντακτικά λάθη (Syntax errors) Λάθη κατά την εκτέλεση (Runtime errors) Σημαντικά (σημασιολογικά) λάθη (Semantic errors)
Συντακτικά λάθη - 1 Παράγονται κατά τη μετάφραση του πηγαίου κώδικα και συνήθως δείχνουν ότι υπάρχει κάποιο λάθος στη σύνταξη του προγράμματος. Οφείλονται σε παραβίαση των κανόνων της γραμματικής και του συντακτικού της γλώσσας προγραμματισμού. Παραδείγματα λαθών: >>> deef printf() print "hello world" SyntaxError: invalid syntax >>>
Συντακτικά λάθη - 2 Εύκολα στη διόρθωση, αρκεί να εντοπιστούν Συνήθως τα μηνύματα λάθους (error messages) δεν είναι κατατοπιστικά. Τα πιο συνηθισμένα μηνύματα είναι τα: SyntaxError: invalid syntax SyntaxError: invalid token Το μήνυμα δεν μας πληροφορεί για το που ακριβώς βρίσκεται το λάθος.
Συντακτικά λάθη - 3 Μερικοί τρόποι αποφυγής κοινότυπων λαθών: 1. Μη χρησιμοποιείτε μια δεσμευμένη λέξη ως όνομα μεταβλητής. Λάθος: def = 5 2. Ελέγξτε τη συνέπεια των εσοχών (indentation). Λάθος: def printf(): print "hello world 3. Σιγουρευτείτε ότι τα τυχόν strings στον κώδικα έχουν quotation marks που ταιριάζουν. Λάθος: print "hello - single quote: ', - double quote: " 6. Να κλείνετε σωστά τα brackets (, {, [. 7. Μην μπερδεύετε την εκχώρηση = με την ισότητα ==.
Λάθη κατά την εκτέλεση-1 Πολλές φορές ένα πρόγραμμα, απαλλαγμένο από συντακτικά λάθη, μπορεί να εμφανίσει λάθη κατά την εκτέλεσή του. Συνήθως τα λάθη αυτά οφείλονται σε απαιτήσεις του προγράμματος που ο υπολογιστής δεν μπορεί να ικανοποιήσει και ο προγραμματιστής δεν είχε προβλέψει στη διαδικασία ανάλυσης του προβλήματος και κωδικοποίησης του προγράμματος. Παραδείγματα: διαίρεση με το μηδέν, χρήση αρχείου για ανάγνωση όταν δεν υπάρχει, ατέρμονη αναδρομή κλπ. Τα περισσότερα runtime error messages περιλαμβάνουν πληροφορία για το που συνέβη το λάθος και ποιες συναρτήσεις ήταν σε εκτέλεση.
Λάθη κατά την εκτέλεση-2 Το πρόγραμμα δεν κάνει απολύτως τίποτα: το πρόγραμμα μπορεί να περιέχει συναρτήσεις και κλάσεις, αλλά δεν επικαλείται κάτι για να ξεκινήσει η εκτέλεση. Το πρόγραμμα «κρεμάει», σταματάει και φαίνεται να μην κάνει τίποτα: ατέρμονας βρόγχος (infinite loop) ατέρμονη αναδρομή (infinite recursion)
Λάθη κατά την εκτέλεση-3 Ατέρμονας βρόγχος: - Aν νομίζετε ότι ένας συγκεκριμένος βρόγχος είναι ατέρμονας, τότε προσθέστε στο τέλος της επανάληψης εντολές εκτύπωσης που τυπώνουν τις τιμές των μεταβλητών στη συνθήκη και την τιμή της συνθήκης. - Για παράδειγμα: while x > 0 and y < 0 : # do something to x # do something to y print "x: ", x print "y: ", y print "condition: ", (x > 0 and y < 0)
Λάθη κατά την εκτέλεση-4 Ατέρμονη αναδρομή: Τις περισσότερες φορές το πρόγραμμα τρέχει για λίγο και έπειτα παράγει ένα λάθος: Maximum recursion depth exceeded Εάν υποπτεύεστε ότι μία συνάρτηση ή μέθοδος προκαλεί ατέρμονη αναδρομή, τότε ελέγχετε αν υπάρχει μία base case, δηλαδή κάποια συνθήκη που θα αναγκάσει τη συνάρτηση να επιστρέψει χωρίς να παράγει επαναλαμβανόμενη κλήση. Εάν δεν υπάρχει κάποια base case πρέπει να ξανασκεφτείτε τον αλγόριθμο και να προσδιορίσετε κάποια. Εάν υπάρχει κάποια base case και ο αλγόριθμος έχει την ίδια συμπεριφορά προσθέστε στην αρχή της συνάρτησης εντολές εκτύπωσης που τυπώνουν τις τιμές των παραμέτρων. Εάν οι παράμετροι δεν κινούνται προς την base case θα πρέπει να βρείτε την αιτία γι αυτό.
Λάθη κατά την εκτέλεση-5 Exception: Εάν κάτι πηγαίνει στραβά κατά την εκτέλεση, οι περισσοτερες γλώσσες τυπώνουν ένα μήνυμα που περιλαμβάνει το όνομα του exception, τη γραμμή του προγράμματος που εμφανίστηκε καθώς και ένα traceback. Το πρώτο βήμα είναι να εξεταστεί η θέση του προγράμματος που εμφανίστηκε το λάθος.
Λάθη κατά την εκτέλεση-6 Κάποια από τα πιο κοινά λάθη κατά την εκτέλεση (runtime errors): NameError TypeError KeyError AttributeError IndexError
Λάθη κατά την εκτέλεση-7 Προβλήματα με πολλές εντολές εκτύπωσης στο debugging: Μπορεί να καταλήξουν κρυμμένες στην έξοδο. Λύσεις: Απλοποίηση της εξόδου Απλοποίηση του προγράμματος Καθαρίστε το πρόγραμμα: Αφαιρέστε το νεκρό κώδικα Αναδιοργανώστε το πρόγραμμα
Σημασιολογικά Λάθη - 1 Το πρόγραμμα μεταφράζεται και τρέχει αλλά δεν κάνει τα σωστά πράγματα. Τα πιο δύσκολα για να διορθωθούν, καθώς δεν παρέχεται κάποια πληροφορία για αυτά από τον compiler και το runtime σύστημα. Να συνδέσετε το κείμενο του προγράμματος με τη συμπεριφορά που βλέπετε. Χρειάζεστε μια υπόθεση για αυτό που πραγματικά κάνει το πρόγραμμα. Χρήσιμο είναι να μπορείτε να επιβραδύνετε το πρόγραμμα σας. Εισάγετε και αφαιρέστε breakpoint του debugger και περπατήστε το πρόγραμμα εκεί όπου εμφανίζεται το λάθος.
Σημασιολογικά Λάθη - 2 Μεγάλες δύσκολες εκφράσεις που δεν δουλεύουν: Μία λύση είναι να σπάσουμε τη σύνθετη έκφραση σε μία σειρά αναθέσεων σε προσωρινές μεταβλητές.
Σημασιολογικά Λάθη - 3 Για παράδειγμα: self.hands[i].addcard(self.hands[self.findneighbor(i)].popcard()) Μπορεί να γραφτεί: neighbor = self.findneighbor (i) pickedcard = self.hands[neighbor].popcard() self.hands[i].addcard (pickedcard) Ευκολότερο να διορθωθεί καθώς μπορείτε να ελέγξετε τους τύπους των ενδιάμεσων μεταβλητών και τις τιμές τους.
Σημασιολογικά Λάθη - 4 Ένα άλλο πρόβλημα που μπορεί να εμφανιστεί στις μεγάλες εκφράσεις είναι η μη αναμενόμενη σειρά αποτίμησης. Για παράδειγμα, η έκφραση μπορεί να γραφτεί π.χ. στην Python ως: y = x / 2 * math.pi Όμως, επειδή ο πολλαπλασιασμός και η διαίρεση έχουν την ίδια προτεραιότητα, οι πράξεις θα εκτελεστούν από τα αριστερά προς τα δεξιά. Η λύση είναι η πρόσθεση παρενθέσεων: y = x / (2 * math.pi) x 2
Σημασιολογικά Λάθη - 5 Χρειάζομαι βοήθεια: Ακόμα και οι καλύτεροι προγραμματιστές μένουν περιστασιακά κολλημένοι. Μερικές φορές εργάζεστε σε ένα πρόγραμμα τόσο καιρό που δεν μπορείτε να δείτε το λάθος. Προτού να καλέσετε κάποιο άλλο για βοήθεια, σιγουρευτείτε ότι έχετε εξαντλήσει τις τεχνικές που περιγράφονται παρακάτω: Το πρόγραμμά σας πρέπει να είναι όσο το δυνατόν απλούστερο. Πρέπει να δουλεύετε με την μικρότερη είσοδο που προκαλεί το λάθος. Πρέπει να έχετε τις δηλώσεις των εντολών εκτύπωσης στις κατάλληλες θέσεις. Πρέπει να καταλάβετε το πρόβλημα αρκετά καλά έτσι ώστε να το περιγράψετε συνοπτικά σε κάποιον για να σας βοηθήσει άμεσα.
Σημασιολογικά Λάθη - 6 Όταν βρείτε το bug σκεφτείτε τον τρόπο που θα μπορούσατε να το έχετε κάνει γρηγορότερα. Την επόμενη φορά που θα δείτε κάτι παρόμοιο θα είστε σε θέση να το εντοπίσετε γρηγορότερα. Στόχος δεν είναι μόνο να δουλέψει ένα πρόγραμμα. Στόχος είναι να μάθετε πώς να κάνετε ένα πρόγραμμα να δουλέψει.