Λογικα Συντακτικα και αντικανονικα λαθη

Ξεκίνησε από Mxyzptlk, 24 Μαΐου 2020, 01:01:57 ΜΜ

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

ΔΗΜΗΤΡΗΣ Χ

Νομιζω πως θα πρεπει να συμπερανουμε, οτι απο τη στιγμη που υπαρχουν ασαφειες και ασυμφωνιες σε καποια σημεια, τα  σημεια αυτα πρεπει να αποφευγονται ως ερωτηματα για προσδιορισμο λαθους.
Επισης κατι ακομα. Οι ονομασιες Ε και Η ειναι δεκτες ως ονοματα ή θα ειναι συντακτικα λαθη; Μην γινει κι εδω καμια στραβη. (2010 εσπερινα σε πινακα τιμων, εχουν βαλει μεταβλητη Ε). Εγω δεν τα θεωρω σωστα. (Οπως και τα ημ, συν που μπορει ευκολα να τα επιλεξει καποιος,πχ για ημερες η συνολο και τονιζω στους μαθητες να προσεχουν).
Καλό ειναι να σημειωθουν ολα αυτα τα σημεια.

petrosp13

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

Έχω την αίσθηση ότι ο ορισμός του συντακτικού λάθους είναι λίγο θολός σε κάποια σημεία
Εξηγώ τι εννοώ
Υπάρχουν προφανή συντακτικά λάθη π.χ ΓΡΑΨΕ_ χ β 'κδφδγκ'

Από εκεί και πέρα όμως υπάρχουν και λάθη που κάποιοι έξυπνοι μεταγλωττιστές θα τα βρουν, κάποιοι δεν θα τα βρουν
Είναι θέμα υλοποίησης του μεταγλωττιστή δηλαδή

Για παράδειγμα, αν θεωρήσουμε ότι το i απαγορεύεται να αλλάζει τιμή εντός επανάληψης και ότι μια διαδικασία αντιγράφει πίσω παραμέτρους πάντα (έστω και τις ίδιες τιμές), το παρακάτω παράδειγμα είναι λάθος:
Για ι ...
    Κάλεσε Διαδ(ι,...)

Πώς να δώσουμε ορισμό στον τύπο ενός τέτοιου λάθους;
Ένας έξυπνος μεταγλωττιστής δεν θα το αφήσει να τρέξει, άρα συντακτικό
Ένας όχι τόσο αναλυτικός, θα το αφήσει να τρέξει και θα προκύψει πρόβλημα στην εκτέλεση γιατί θα το πιάσει κάποιος άλλος κανόνας του

Γι'αυτό θεωρώ ότι οι περιπτώσεις που συζητάμε είναι πολύ εξειδικευμένες και ΔΕΝ θα πρέπει να ζητηθούν θέματα που αφορούν την εκσφαλμάτωση και δεν έχουν απλή, μονοσήμαντη και μη αμφησβητίσιμη απάντηση
Για μαθητές μιλάμε που ασχολούνται κάποιους μήνες με τον προγραμματισμό...
Παπαδόπουλος Πέτρος
Καθηγητής Πληροφορικής

alkisg

@petrosp13: εδώ τα έχει αρκετά ωραία: https://www.guru99.com/compiler-design-phases-of-compiler.html

Εν ολίγοις,

  • Λεκτική ανάλυση: εντοπίζει λάθη με άκυρους χαρακτήρες, ανοικτά εισαγωγικά κλπ
  • Συντακτική ανάλυση: ο κώδικας μεταφράζεται σε μια εσωτερική δεντρική αναπαράσταση· εντοπίζει τα απλά λάθη σαν αυτά που έγραψες
  • Σημασιολογική ανάλυση: κάθε μέρος της δεντρικής αναπαράστασης ελέγχεται για ορθότητα· εδώ μπορούν να εντοπιστούν λάθος αναθέσεις τύπων κλπ
  • Και ακολουθούν ενδιάμεση αναπαράσταση σε μορφή object, code optimization, linking κλπ
Σε κάθε ένα από τα παραπάνω σημεία, αλλά ακόμα και πριν ή παράλληλα με αυτά, μπορεί να τρέχει linter που να δίνει προτάσεις για βελτιώσεις καθώς και πιθανά λάθη. Για παράδειγμα "πιθανώς μη αρχικοποιημένη μεταβλητή".

Τέλος, μερικά σφάλματα δεν γίνεται να ανιχνευτούν σε κανένα από τα παραπάνω στάδια, και μπορούν μόνο κατά την εκτέλεση, π.χ. "διαίρεση με το μηδέν στην πράξη α/β".

Ο official ορισμός του συντακτικού λάθους είναι μόνο για τη μετατροπή στην εσωτερική δεντρική αναπαράσταση.
Δυστυχώς εδώ το έχουμε κάνει να περιλαμβάνει και τον σημασιολογικό, και τον λεκτικό, και τον linter, αλλά και σε μερικές περιπτώσεις και λάθη εκτέλεσης, απλά και μόνο επειδή "εμείς τα βλέπουμε με το μάτι ότι είναι λάθος αφού τα έχει απαγορεύσει το Υπουργείο".

petrosp13

Έχω την αίσθηση ότι υπάρχουν compiler που εμφανίζουν μηνύματα και για μη αρχικοποιημένες μεταβλητές και για πιθανές διαιρέσεις με το μηδέν
Αν κάποιος γνωρίζει κάτι τέτοιο, ας μας πληροφορήσει
Αυτά δεν μοιάζουν για συντακτικά λάθη, αλλά τα εντοπίζει και προειδοποιεί ο μεταγλωττιστής
Παπαδόπουλος Πέτρος
Καθηγητής Πληροφορικής

alkisg

Ισχύει, αυτό εννοούσα παραπάνω... είναι μέρος του σημασιολογικού ή του lint ελέγχου. Ο compiler τα κάνει αυτά. Υπάρχουν π.χ. διαιρέσεις με το μηδέν που θα τις πιάσει πριν την εκτέλεση, και άλλες που δεν πιάνονται γιατί π.χ. το "β" το δίνει ο χρήστης κατά την εκτέλεση.

evry

Υπάρχουν εξελιγμένα προγραμματιστικά περιβάλλοντα (π.χ. Eclipse , R Studio) τα οποία κάνουν compile as you type.
Έτσι βρίσκουν λάθη τα οποία κανονικά θα έβρισκαν κατά τη μεταγλώττιση ενώ εσύ γράφεις.
Επίσης στον διερμηνευτή της ΓΛΩΣΣΑΣ, αν πας να γράψεις 1/0 θα σου χτυπήσει λάθος, είναι συντακτικό?
Μπορούμε τώρα να λέμε ότι ο συντάκτης δεν βρίσκει συντακτικά λάθη? (τεχνικά φυσικά δεν τα βρίσκει ο συντάκτης)
Θέλω να πως ότι το να ορίσουμε το συντακτικό λάθος ως λάθος που εντοπίζεται κατά τη μεταγλώττιση είναι τεράστιο λάθος.
Έχουμε μπερδέψει το αίτιο με το αποτέλεσμα.
Πρέπει να οριστεί ως λάθος που παραβιάζει τη γραμματική της γλώσσας και μέχρι εκεί. Όπως πολύ σωστά είπε ο Άλκης έχουμε τσουβαλιάσει πολλά λάθη ως συντακτικά.
π.χ. τα type errors, δηλαδή η εκχώρηση ακέραιας σε πραγματική δεν είναι συντακτικό λάθος αλλά λάθος που  έχει να κάνει με τη σημασιολογία. Τα έχουμε κάνει όλα μια σούπα και αυτά είναι τα αποτελέσματα. Θυμάμαι (δεν ξέρω αν έχει αλλάξει τώρα) ότι ο έλεγχος τύπων στην υλοποίηση ενός μεταγλωττιστή ήταν ένα άλλο στάδιο πέρα από τον γραμματικό/συντακτικό έλεγχο.
Τα συντακτικά λάθη είναι στις δυο πρώτες φάσεις που ανέφερε ο Άλκης, τη λεκτική και συντακτική ανάλυση.

Παράθεση από: petrosp13 στις 26 Μαΐου 2020, 01:39:17 ΜΜ
Έχω την αίσθηση ότι υπάρχουν compiler που εμφανίζουν μηνύματα και για μη αρχικοποιημένες μεταβλητές και για πιθανές διαιρέσεις με το μηδέν
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

Καρκαμάνης Γεώργιος

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

Τώρα αν δεν δεχόμαστε την άποψη του ίδιου του συγγραφέα (αφού όπως είπα επικοινώνησα μαζί του) αναγκαστικά χρειάζεται διευκρίνηση από το Υπουργείο.
Παράθεση
Στο συγκεκριμένο είχα επικοινωνήσει και με έναν από τους συγγραφείς του βιβλίου, τον κ. Κοίλια, που μου είχε πει τηλεφωνικά το παράδειγμα της Basic με το "βάζω τον αριθμό σε παρένθεση αν δεν θέλω να αλλάξει η τιμή της παραμέτρου". Δηλαδή αυτό είχαν στο μυαλό τους οι συγγραφείς, δεν είναι αυθαιρεσία.

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

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

Παραθέτω ενδεικτικά ορισμένα θέματα πανελληνίων:
----------------------------------------------------

ΠΡΟΓΡΑΜΜΑ Κύριο
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: Α, Β, Γ
ΑΡΧΗ
ΔΙΑΒΑΣΕ Α, Β, Γ
ΚΑΛΕΣΕ Διαδ1(Α, Β, Γ)
ΓΡΑΨΕ Α, Β, Γ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
ΔΙΑΔΙΚΑΣΙΑ Διαδ1(Β, Α, Γ)
ΜΕΤΑΒΛΗΤΕΣ
   ΑΚΕΡΑΙΕΣ: Α, Β, Γ
ΑΡΧΗ
Α <-- Α + 2
Β <-- Β - 3
Γ <-- Α + Β
ΓΡΑΨΕ Α, Β, Γ
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ   (Ημερήσια 2006)
----------------------------------------------------

ΠΡΟΓΡΑΜΜΑ ΘέμαΒ
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: z, w
ΑΡΧΗ
z <-- 1
w <-- 3
OΣΟ z <= 35 ΕΠΑΝΑΛΑΒΕ
   ΚΑΛΕΣΕ Διαδ(z, w)
   ΓΡΑΨΕ z
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
TΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

ΔΙΑΔΙΚΑΣΙΑ Διαδ(w, z)
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: z, w
ΑΡΧΗ
  w <-- w + z
  z <-- z + 2
ΓΡΑΨΕ z
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ  (Ημερήσια 2011)

Αρα αν κατά την κλήση της διαδικασίας  δώσουμε ως παράμετρο μια σταθερή τιμή και τι θα συμβεί κατά την επιστροφή από αυτήν;

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


alkisg

Παράθεση από: Καρκαμάνης Γεώργιος στις 26 Μαΐου 2020, 06:31:28 ΜΜ
Σε θέματα που έχουν δοθεί κατα καιρούς στις πανελλήνιες  φαίνεται ξεκάθαρα πως οι τυπικές παράμετροι επιστρέφουν τις τιμές τους στις αντίστοιχες πραγματικές.

Μα κανένας δεν το αμφισβητεί αυτό, αλλιώς οι διαδικασίες θα ήταν άχρηστες. Όταν περνιέται μεταβλητή, τότε η τιμή επιστρέφεται.
Το ερώτημα είναι, αν επιτρέπεται να περνάμε σταθερές και εκφράσεις στις διαδικασίες => Ναι
Και τότε τι γίνεται με την επιστροφή τιμών; => Απλά δεν επιστρέφονται, όπως και στις συναρτήσεις. Καμία πρωτοτυπία· εκτός αν κάποιος θεωρεί ότι ούτε στις συναρτήσεις επιτρέπονται εκφράσεις.

Τα υποπρογράμματα είναι περισσότερο επηρεασμένα από την Basic, όχι από την Pascal. Ο Κοίλιας είχε μεγάλη εμπειρία στην QuickBasic, είχε εκδόσει βιβλία από το 1991 κλπ, γι' αυτό και πρότεινε και το "κόλπο με τις παρενθέσεις" όταν κάποιος θέλει να περάσει μεταβλητή σε διαδικασία αλλά να μην επιστρέψει πίσω η τιμή (που συνηθίζεται στη Basic).

Δεν έχω δει κάποιο θέμα πανελλαδικών που να είναι αντίθετο στα παραπάνω.

Mxyzptlk

Τι σχεση εχει αν προκειται για αναδρομη;
Πως ειναι δυνατον καποιοι να επιμενουν οτι ξερουν περισσοτερα για τη διδασκαλια του μαθηματος απο τον συγγραφεα του βιβλιου, που ειναι ο δημιουργος του μαθηματος!!!
Τα θεματα εξετασεων που δοθηκαν παραπανω δεν λενε πουθενα οτι απαγορευετε το περασμα σταθερων σε διαδικασια.
Αλλα ακομα και αν το ελεγαν πως ειναι δυνατον ενα θεμα εξετασεων να υπερισχυει του βιβλιου του μαθηματος;

Συμφωνω απολυτα με alkisg και pgrontas
Εξαιρετικο το λινκ που δοθηκε για τους compilers απο το guru99

evry

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

evry

Κοίταγα τα θέματα των επαναληπτικών του 2016 και έπεσα πάνω σε αυτό:

Τι τύπου είναι η μεταβλητή Β αν η παρακάτω έκφραση είναι συντακτικά σωστή;
Κώδικας: ΓΛΩΣΣΑ
Ε <- ((Α mod 5 >2) ΚΑΙ (C <>"Αληθής")) Ή ((D=ψευδής) ΚΑΙ (Β > Α/3)) 

Η Α είναι ακέραια.

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

Λαμπράκης Μανώλης

καλησπέρα σε όλους

πραγματική το Β, αλλά σύμφωνα με τη συζήτηση μας και το ακέραια μάλλον είναι σωστή ??




evry

Δηλαδή αν γράψω
Κώδικας: ΓΛΩΣΣΑ
10 > 2.4

είναι λάθος;

Παράθεση από: Λαμπράκης Μανώλης στις 27 Μαΐου 2020, 03:04:28 ΜΜ
καλησπέρα σε όλους

πραγματική το Β, αλλά σύμφωνα με τη συζήτηση μας και το ακέραια μάλλον είναι σωστή ??

Ακόμα χειρότερα, λέει σε μια άσκηση να ελέγξεις ότι ο μέσος όρος είναι πάνω από 10 και γράφει ο μαθητής
Κώδικας: ΓΛΩΣΣΑ
average = sum/n
ΑΝ average > 10 ΤΟΤΕ
   ΓΡΑΨΕ 'πέρασες'
ΤΕΛΟΣ_ΑΝ

Κόβουμε ή όχι ?
Δεν μπορεί να δεχόμαστε ότι στη θέση μιας πραγματικής δεν μπαίνει ακέραια αλλά να συμφωνούμε με το παραπάνω.
Δηλαδή δεν μπορεί να θεωρούμε ότι η ΓΛΩΣΣΑ κάνει coercion κατά βούληση, ή θα κάνει ή όχι.

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

P.Tsiotakis

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

P.Tsiotakis

Παράθεση από: evry στις 27 Μαΐου 2020, 01:58:25 ΜΜ
Κοίταγα τα θέματα των επαναληπτικών του 2016 και έπεσα πάνω σε αυτό:

Τι τύπου είναι η μεταβλητή Β αν η παρακάτω έκφραση είναι συντακτικά σωστή;
Κώδικας: ΓΛΩΣΣΑ
Ε <- ((Α mod 5 >2) ΚΑΙ (C <>"Αληθής")) Ή ((D=ψευδής) ΚΑΙ (Β > Α/3)) 

Η Α είναι ακέραια.

Δεν ξέρω αν έχει ξανασυζητηθεί. Το αναφέρω γιατί έχει σχέση με τη συζήτηση που κάναμε προηγουμένως με τους τύπους.
Ρωτάει τους τύπους των άλλων μεταβλητών αλλά νομίζω το ενδιαφέρον είναι με τη Β.


Παράθεση από: evry στις 27 Μαΐου 2020, 03:52:11 ΜΜ
Σε κάποιους φαίνεται ακραίο γιατί δεν το έχουν συνηθίσει αλλά εκείνη τη χρονιά αν κάποιος μαθητές έλεγε ότι το Β είναι ακέραιος η απάντηση δεν ήταν δεκτή!


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