Κατηγορίες λαθών

Ξεκίνησε από alkisg, 28 Μαρ 2020, 10:04:54 ΠΜ

« προηγούμενο - επόμενο »

evry

Είναι μόνο δική μου εντύπωση ή το μάθημα έχει γίνει ακόμα χειρότερο από πλευράς ασαφειών και πλέον ασχολούμαστε με ακόμα πιο επουσιώδη θέματα?
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

alkisg

Παράθεση από: alkisg στις 29 Μαρ 2020, 12:04:56 ΜΜ
Το σωστό είναι να υποθέσουμε ότι η ΓΛΩΣΣΑ "έχει όσο μεγάλη ακρίβεια χρειαζόμαστε για την επίλυση του προβλήματος", αλλά αυτό δεν στέκει στο παράδειγμα που δίνεις, αφού προσπαθείς να βρεις τα όρια της ακρίβειας. Δηλαδή η κατάλληλη απάντηση είναι ότι το παράδειγμα είναι λάθος.

Ένα αντίστοιχο "λάθος παράδειγμα" είναι το "να υλοποιηθεί συνάρτηση που να υπολογίζει το πλήθος των δεκαδικών ψηφίων ενός πραγματικού αριθμού".
Και μετά να της περάσουμε ως παράμετρο το 1/3, που θεωρητικά έχει άπειρα δεκαδικά.
Κι αυτό εναντιώνεται στην υπόθεση ότι η ΓΛΩΣΣΑ έχει όσο μεγάλη ακρίβεια χρειάζεται για την επίλυση των προβλημάτων.

akalest0s

#17
Ερώτηση 1η:

Παράθεση από: alkisg στις 28 Μαρ 2020, 10:04:54 ΠΜ
Περαιτέρω, αν ζητήσουμε από το Διερμηνευτή να κάνει έλεγχο τύπου lint, και να ανιχνεύσει τέτοια λάθη πριν την εκτέλεση, ΠΑΛΙ να μην τα αναφέρουμε ως συντακτικά.
Για παράδειγμα, ο Διερμηνευτής κάνει κάποιους ελέγχους lint, π.χ. έχει επιλογή για το αν επιτρέπεται ή όχι η ΓΡΑΨΕ μέσα σε συναρτήσεις. Αυτό λοιπόν ανιχνεύεται πριν την εκτέλεση, άρα κάποιος θα μπορούσε να το πει "συντακτικό λάθος". Δεν παραβιάζεται όμως κάποιος συντακτικός κανόνας, αυτό το λάθος ανιχνεύεται κατά το linting / static code analysis, που είναι διαφορετικό πράγμα. Δεν έχει νόημα ούτε εμείς ούτε οι μαθητές να μπερδευτούμε με αυτό. Βλέποντας όλη τη σύγχιση που έχει δημιουργηθεί, ίσως θα ήταν καλύτερα να μην είχα βάλει καθόλου linting στο Διερμηνευτή.

Αν όμως δεν τα πεις συντακτικά, τι θα τα πεις; Το πιο κοντινό στην εμπειρία των παιδιών είναι τα συντακτικά. Το να βάλεις μια νέα έννοια (λάθος ελέγχου lint), της οποίας δεν έχουν εμπειρία, βοηθάει ή μπερδεύει;


Ερώτηση 2η:

Αν έχω καταλάβει ως τώρα καλά, στέκει αυτό το πινακάκι?

  Τύπος σφάλματος                            Φάση εκδήλωσης σφάλματος
===============================================================
|     - Λογικά                                       - "Χρόνου εκτέλεσης που οδηγούν σε αντικανονικό τερματισμό"
|                                                        - "Χρόνου εκτέλεσης που συνεχίζουν την εκτέλεση αλλά λανθασμένη (άπειρες επαναλήψεις, μη επιθυμητή συμπεριφορά προγράμματος, κλπ)
|     - Συντακτικά                                 - "Μεταγλώττισης, πριν την εκτέλεση"
===============================================================

Τα συντακτικά είναι μεταγλώττισης
Τα λογικά είναι χρόνου εκτέλεσης (οποιαδήποτε από τις δύο περιπτώσεις)
Τα χρόνου εκτέλεσης μπορεί να είναι λογικά μπορεί και όχι (φαντάζομαι για αυτό το νέο βιβλίο προσπάθησε να τα ξεχωρίσει ως 3η κατηγορία λαθών)                   
"Abstraction is not the first stage, but the last stage, in a mathematical development." MK
"I don't want to write about a high level thing, unless I fully understand about a low level thing" DK

alkisg

Παράθεση από: akalest0s στις 08 Απρ 2020, 04:37:30 ΠΜ
Αν όμως δεν τα πεις συντακτικά, τι θα τα πεις; Το πιο κοντινό στην εμπειρία των παιδιών είναι τα συντακτικά. Το να βάλεις μια νέα έννοια (λάθος ελέγχου lint), της οποίας δεν έχουν εμπειρία, βοηθάει ή μπερδεύει;

Ο έλεγχος lint είναι όταν προσπαθούμε να εντοπίσουμε λογικά λάθη πριν την εκτέλεση. Προτείνω να μην τα διδάσκουμε ως ξεχωριστή κατηγορία στους μαθητές αλλά να τα αναφέρουμε όλα ως λογικά λάθη. Την ξεχωριστή κατηγορία την έβαλα μόνο για εμάς τους καθηγητές, που έχουμε δει και τέτοιον έλεγχο lint, και λέμε "μα γιατί το 1/0 δεν είναι συντακτικό λάθος, αφού ο compiler μου το πιάνει;". Οι μαθητές δεν έχουν τέτοια αντεπιχειρήματα οπότε δεν χρειάζεται να τους εξηγήσουμε γιατί. Ένας απλός compiler δεν τα πιάνει και τη ΓΛΩΣΣΑ τη θέλουμε απλή.

Παράθεση από: akalest0s στις 08 Απρ 2020, 04:37:30 ΠΜ
Αν έχω καταλάβει ως τώρα καλά, στέκει αυτό το πινακάκι?

Λείπει η κίτρινη περιοχή του σχήματος, τα λογικά λάθη όπως το μέσος_όρος <- α+β/2 και τα άπειρα loop, που δεν προκαλούν λάθη χρόνου εκτέλεσης.
Τα συντακτικά είναι του compiler και τα βλέπουμε κατά τη μεταγλώττιση.
Τα εκτέλεσης είναι του runtime system και τα βλέπουμε κατά την εκτέλεση.
Τα λογικά είναι του προγραμματιστή και υπάρχουν ανεξάρτητα από τον χρόνο εκτέλεσης. ΑΝ είναι στην πράσινη περιοχή, τότε θα προκαλέσουν ΚΑΙ λάθος χρόνου εκτέλεσης.

Τα λογικά λάθη μπορεί να τα δει κάποιος πιο έμπειρος και να μας πει πριν τρέξουμε το πρόγραμμα "εδώ ΕΧΕΙΣ λογικό λάθος", σε ενεστώτα.
Τον κώδικα που θα εμφανίσει λάθη χρόνου εκτέλεσης μπορεί να τον δει κάποιος πιο έμπειρος και να μας πει πριν τρέξουμε το πρόγραμμα "εδώ ΟΤΑΝ τρέξεις το πρόγραμμα ΘΑ εμφανιστεί λάθος χρόνου εκτέλεσης", σε μέλλοντα.
Δηλαδή δεν πρέπει να προσπαθούμε να συνδέσουμε τα λογικά λάθη με το χρόνο που εμφανίζονται, είναι τα λάθη του προγραμματιστή και υπάρχουν ανεξάρτητα από το χρόνο μεταγλώττισης/εκτέλεσης.

pgrontas

Θυμίζω κάτι που είχα γράψει πριν από λίγο καιρό:
Παράθεση από: pgrontas στις 14 Οκτ 2019, 06:29:21 ΜΜ
Κατά τη γνώμη μου το βιβλίο κάνει εννοιολογικό λάθος όπως ορίζει τις διάφορες κατηγορίες λαθών, καθώς στις περιπτώσεις συντακτικών και λογικών λαθών τα συσχετίζει με την αιτία από την οποία προκύπτουν, ενώ τα λάθη χρόνου εκτέλεσης τα συσχετίζει με την χρονική στιγμή στην οποία συμβαίνουν. Μήλα με πορτοκάλια δηλαδή, όπως λέγαμε και στο δημοτικό.

Επι της ουσίας τώρα συμφωνώ - σχεδόν- με την άποψη του Άλκη:με μια μικρή παραλλαγή που σχετίζεται με το παρακάτω σχόλιο:Ναι όλα είναι λογικά λάθη, άλλων προγραμματιστών όμως.
...
Θα ήταν πιο σωστό τα λάθη να κατηγοριοποιουνται σε συντακτικα, λογικά και συστημικά ( ίσως; ) όπου τα τελευταία προκύπτουν λόγω των απρόβλεπτων αλληλεπίδρασης προγραμμάτων/συστημάτων από διαφορετικούς προγραμματιστές και συμβαίνουν κατά την εκτέλεση (όπως και τα λογικά).

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

Νομίζω ότι μια αποδεκτή εξήγηση γιατί το 1/0 είναι λογικό λάθος, είναι ότι επειδή ειναι ακριβώς το ίδιο λάθος με το 1/α όταν η α έχει την τιμή 0. Δεν μπορούμε λοιπόν το ίδιο λάθος να το ονομάσουμε τη μία έτσι και την άλλη αλλιώς.
Σε καμία περίπτωση πάντως δεν είναι συντακτικό γιατί τηρούνται οι κανόνες σύνταξης του τελεστή /.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

evry

Η παρατήρηση του Παναγιώτη είναι πολύ σωστή. Πρέπει να υπάρχει μόνο ένα κριτήριο κατηγοριοποίησης λαθών, είτε θα έχει να κάνει με την αιτία είτε με τη φάση της ανάπτυξης του προγράμματος στην οποία συμβαίνει, δεν μπορεί να μπλέκουμε και τα δυο.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

lalibi

#21
Πάντως, σύμφωνα με τους ορισμούς του βιβλίου, αλλά και της Wikipedia, τα πράγματα είναι πολύ συγκεκριμένα για τα λογικά λάθη:

ΠαράθεσηΤα λογικά λάθη είναι συνήθως λάθη σχεδιασμού και δεν προκαλούν τη διακοπή της εκτέλεσης του προγράμματος.

https://en.wikipedia.org/wiki/Logic_error
ΠαράθεσηIn computer programming, a logic error is a bug in a program that causes it to operate incorrectly, but not to terminate abnormally (or crash).

Σύμφωνα με τα παραπάνω το Χ/0 δεν είναι λογικό λάθος.

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

alkisg

Από https://en.wikipedia.org/wiki/Logic_error: "not to terminate abnormally (or crash)" αλλά και "this article is a stub". Δηλαδή οι ίδιοι δεν το θεωρούν καλογραμμένο άρθρο.

Τα ακριβώς επόμενα τέσσερα αποτελέσματα του google με τη σειρά που εμφανίζονται:
https://www.bbc.co.uk/bitesize/guides/zcjfyrd/revision/4: "Logic errors do not usually cause a program to crash."
https://techterms.com/definition/logic_error: "may simply produce the wrong output or may cause a program to crash while running."
https://www.techopedia.com/definition/8122/logic-error: "It can also cause the program to crash when running."
http://cambridgegcsecomputing.org/sites/94/upload/userfiles/217p_q_teachersnotes_editedct_3proof.pdf: "may cause a program to crash while running"

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

pgrontas

#23
Παράθεση από: lalibi στις 12 Μαΐου 2020, 10:45:10 ΠΜ
Πάντως, σύμφωνα με τους ορισμούς του βιβλίου, αλλά και της Wikipedia, τα πράγματα είναι πολύ συγκεκριμένα για τα λογικά λάθη:

https://en.wikipedia.org/wiki/Logic_error
Σύμφωνα με τα παραπάνω το Χ/0 δεν είναι λογικό λάθος.

Χωρίς να διαφωνώ απαραίτητα με τις αναλύσεις σας, για τις ανάγκες του μαθήματος, θεωρώ πως στο συγκεκριμένο κομμάτι τα πράγματα είναι σαφή.
Σε ο,τι με αφορά τουλάχιστον οι παρατηρήσεις προέκυψαν από ερωτήσεις μαθητών.
Για παράδειγμα με έχουν ρωτήσει ότι αν η μεταβλητή σε κάποιον παρονοματή έχει ξεμείνει στο 0 το λάθος που θα προκύψει δεν οφείλεται σε λανθασμένη σκέψη του προγραμματιστή; Άρα δεν είναι ίδιας κατηγορίας με τα λογικά λάθη; Εκεί λοιπόν πρέπει να εξηγήσεις ότι διαφέρει ο χρόνος στον οποίο εκδηλώνονται και το αν θα εκδηλωθούν.
Προσωπικά χαίρομαι πάντως γιατί οι συγκεκριμένοι μαθητές ψιλιάζονται ότι ο αντικανονικός τερματισμός είναι ένα λάθος αποτέλεσμα (┴).

Το ενδιαφέρον είναι ότι και το βιβλίο πέφτει στην 'ίδια παγίδα' πχ. στο παράδειγμα 5.17 στην σελίδα 131.
Εκεί η υπέρβαση των ορίων του πίνακα προκύπτει από λάθος σκέψη του προγραμματιστή (την οποία και αναλύει το βιβλίο), όμως αυτό θα εκδηλωθεί ως αντικανονικού τερματισμού.
Η ενότητα λέγεται "Εκσφαλμάτωση λογικών λαθών σε πίνακες".


Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

lalibi

Συμφωνώ και με τους δυό σας, ίσως το ύφος της ανάρτησή μου να μοιάζει επικριτικό, χωρίς να ήταν αυτή η πρόθεσή μου.

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

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

Υ.Γ. Για εμένα, η λύση σε πολλά από τα προβλήματά μας είναι να περάσουμε σε Python (ή JavaScript κ.λπ) γιατί έχω την αίσθηση πως ταλαιπωρούμαστε με μια υποθετική γλώσσα που δεν έχει ούτε επίσημο πλήρες manual ούτε και specs και αναγκαζόμαστε να κάνουμε εικασίες σε θέματα που πιθανότατα ούτε οι συγγραφείς του βιβλίου (υποψιάζομαι) δε μπορούν να απαντήσουν.

alkisg

Όχι καλέ μια χαρά ήταν το ύφος σου, καμία παρεξήγηση.
Θα μπορούσε κάποιος να πει ότι η λέξη "συνήθως" στον ορισμό του βιβλίου για τα λογικά λάθη προεκτείνεται και στο "δεν προκαλούν τη διακοπή του προγράμματος", δηλαδή ότι υπάρχουν και κάποιες φορές που την προκαλούν. Συν αυτό που λέει ο Παναγιώτης παρακάτω· και νομίζω ότι είχα δει ένα ακόμα. Αλλά το συμπληρωματικό υλικό περιπλέκει τα πράγματα. Οπότε ένα καλό ξεκαθάρισμα θεωρώ ότι θα έκανε καλό. Και επίσης θα ήταν καλό να μην μπουν άκυρα Σ/Λ στις Πανελλαδικές επειδή κάπου στο βιβλίο ένα "συνήθως" δεν μπήκε ακριβώς στη σωστή του θέση.

Η Python και η Javascript σίγουρα μπορούν να λύσουν ασάφειες της γλώσσας, αλλά δεν νομίζω ότι θα μπορέσουν να βοηθήσουν σε "θεωρητικούς" ορισμούς όπως οι κατηγορίες λαθών ή τα κριτήρια των αλγορίθμων...

Κατερίνα Μ

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

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

Στο κεφάλαιο 13.... τα λάθη κατά την υλοποίηση αναφέρονται ως τα συντακτικά.

Σε ένα ΣΛ λοιπόν "τα λογικά λάθη οφείλονται σε σφάλματα κατά την υλοποίηση του αλγορίθμου" ή σε μία ερώτηση... Ποια είναι τα λάθη κατά την υλοποίηση... Τι απαντάμε;

alkisg

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

Νομίζω έχει νόημα να προσπαθήσουμε να είμαστε συνεπείς, να μην διδάσκονται αντίθετα πράγματα στη Β/θμια σε σχέση με το Πανεπιστήμιο. Δεν κερδίζουμε κάτι με το να βαφτίζουμε τα λάθη αυτά "συντακτικά" αντί για "σημασιολογικά", δεν "αποκρύπτουμε λεπτομέρειες για να μειώσουμε την ύλη" όπως κάνουν στη Φυσική ή στα Μαθηματικά. Χρησιμοποιούμε λάθος ορολογία χωρίς ουσιαστικό λόγο.

evry

Τώρα που είδα αυτό με τις context-free γραμματικές κοιτάξτε το παρακάτω πρόγραμμα σε R και την εικόνα που επισυνάπτω:

Κώδικας: RSplus
A <- matrix(1:20, nrow=4)
B <- matrix(1:20, nrow=2)
A[1,] <- rep(0)                                     # σε χρόνο εκτέλεσης είναι rep(0, 5)
B[1,] <- rep(0)                                     # σε χρόνο εκτέλεσης είναι rep(0, 10)
 
Ο Α είναι 4x5 ενώ ο Β 2x10
Το δεξί μέλος των δυο τελευταίων εκχωρήσεων είναι η εντολή :
Κώδικας: RSPLUS
rep(0)
  η οποία επιστρέφει ένα διάνυσμα με μηδενικά. π.χ. αν δώσουμε rep(0,10) θα μας επιστρέψει 10 μηδενικά.
Είναι ενδιαφέρον πως η έκφραση στο δεξί μέλος εξαρτάται από την μεταβλητή στο αριστερό!
Καταλαβαίνει πόσα μηδενικά θα βάλει στο διάνυσμα από το μέγεθος του πίνακα αριστερά.
Να μην σχολιάσω τον πολύ ωραίο τρόπο να αναφέρεσαι στις γραμμές ενός πίνακα.


What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr