Γενικό Λύκειο > Ψευδογλώσσα

Τύποι δεδομένων στο pseudoglossa.gr

<< < (2/4) > >>

alkisg:
Ένα άλλο δύσκολο θέμα σχετικά με το συντακτικό έλεγχο στην ψευδογλώσσα.
Στον παρακάτω αλγόριθμο, το β είναι αναγκαστικά ακέραιος επειδή συμμετέχει σε πράξη "div".
Από την εντολή "β ←  α" συνεπάγεται ότι και το α είναι αναγκαστικά ακέραιος.
Άρα η εντολή "α ←  3.4" θα έπρεπε να είναι συντακτικό λάθος. Σωστά;


--- Κώδικας: Ψευδογλώσσα ---Αλγόριθμος ΣυντακτικόΛάθοςα ←  1β ←  αγ ←  β div 2α ←  3.4Εμφάνισε α, ' ', β, ' ', γΤέλος ΣυντακτικόΛάθος

evry:
Και γιατί είναι να μην είναι λάθος η εντολή "γ ←  β div 2"  ?

Το σκεπτικό μου είναι ότι μπορούμε να παίρνουμε σαν ένδειξη για τον τύπο μιας μεταβλητής μόνο τις εκφράσεις στις οποίες λαμβάνει τιμή, άρα (στη ΓΛΩΣΣΑ) είναι στο αριστερό μέρος εκχώρησης.
Δηλαδή αυτές οι εκφράσεις έχουν μεγαλύτερη ισχύ από εκείνες στις οποίες υπολογίζεται η β.
Οι μεν πρώτες προκύπτουν άμεσα, ενώ οι δεύτερες αποτελούν "έμμεση" πληροφορία

Ένα παράδειγμα για συζήτηση.
Η παρακάτω έκφραση είναι σίγουρα λάθος. Το θέμα όμως είναι ποιο είναι το λάθος
β ←  β div 2 + 0.5

Φυσικά αυτό που λέω μπορεί να δημιουργήσει αρκετά παράδοξα, όπως για παράδειγμα να έχεις ένα πρόγραμμα 1000 γραμμών που να δουλεύει μια χαρά και στο τέλος να βάλεις μια "λάθος" εκχώρηση και να γίνει χαμός.

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

alkisg:

--- Παράθεση από: evry στις 05 Ιουλ 2011, 12:50:58 μμ ---Και γιατί είναι να μην είναι λάθος η εντολή "γ ←  β div 2"  ?

--- Τέλος παράθεσης ---

Μου φαίνεται πιο λογικό το λάθος να αναφέρεται στο πρώτο σημείο που εντοπίζεται conflict, σαρώνοντας από πάνω προς τα κάτω, όπως κάνει (συνήθως) ένας διερμηνευτής / μεταγλωττιστής / άνθρωπος.



--- Παράθεση από: evry στις 05 Ιουλ 2011, 12:50:58 μμ ---Η παρακάτω έκφραση είναι σίγουρα λάθος. Το θέμα όμως είναι ποιο είναι το λάθος
β ←  β div 2 + 0.5

--- Τέλος παράθεσης ---

Για τον ίδιο λόγο, εδώ θα "αποτιμούσα" πρώτα τον τύπο δεδομένων του δεξιού μέλους και μετά του αριστερού, άρα σαν λάθος θα έλεγα: η μεταβλητή "β" είναι ακέραια, επομένως δεν μπορεί να της ανατεθεί η πραγματική έκφραση "β div 2 + 0.5".



--- Παράθεση από: evry στις 05 Ιουλ 2011, 12:50:58 μμ ---Πάντως για να μην μακρηγορώ, η άποψή μου είναι ότι στο παράδειγμα που δίνεις θα πρέπει η ψευδογλώσσα να μετατρέπει αμέσως το β σε ακέραιο και να κάνει την πράξη πετώντας ένα warning.

--- Τέλος παράθεσης ---

Άρα να μην το θεωρήσουμε συντακτικό λάθος; Δεν πρέπει να προειδοποιήσουμε τους μαθητές να διορθώσουν το πρόγραμμα, πριν καν αρχίσουν την εκτέλεσή του; Π.χ. ο πολλαπλασιασμός αλά ρωσικά θα έστεκε και χωρίς το ακέραιο μέρος;

evry:
ακριβώς εκεί είναι το πρόβλημα, ότι δεν μιλάμε για πρόγραμμα (ή μιλάμε και είμαι εκτός θέματος :-[)
αλλά για ψευδογλώσσα. Προφανώς σε ΓΛΩΣΣΑ θα ήταν λάθος δεν το συζητάμε, αλλά σε ψευδογλώσσα μου φαίνεται ότι το καλύτερο θα ήταν να το δεχτεί και να πετάξει ένα μήνυμα ότι υπάρχει αυτό το πρόβλημα και πιθανόν να βγει λάθος αποτέλεσμα αν δοθεί αριθμός με δεκαδικό μέρος.


--- Παράθεση από: alkisg στις 05 Ιουλ 2011, 01:09:17 μμ ---Άρα να μην το θεωρήσουμε συντακτικό λάθος; Δεν πρέπει να προειδοποιήσουμε τους μαθητές να διορθώσουν το πρόγραμμα, πριν καν αρχίσουν την εκτέλεσή του; Π.χ. ο πολλαπλασιασμός αλά ρωσικά θα έστεκε και χωρίς το ακέραιο μέρος;

--- Τέλος παράθεσης ---

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

Δεν ξέρω πως λειτουργούν οι περισσότεροι compilers/interpreters. π.χ. η python που μοιάζει λίγο με την ψευδογλώσσα λειτουργεί έτσι? χρησιμοποιεί την έμμεση πληροφορία για να καθορίσει τον τύπο μιας μεταβλητής?  αυτό θα έχει ενδιαφέρον, θα το κοιτάξω

alkisg:
Ναι οκ κατά λάθος είπα "πρόγραμμα" παραπάνω, "αλγόριθμος" εννοούσα, γι' αυτό έδωσα και το παράδειγμα του πολλαπλασιασμού αλά ρωσικά.

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

Να ένα παράδειγμα από python, δίνοντας μερικές εντολές στον interpreter της:

--- Κώδικας: ---$ python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> x="Hi"
>>> x=10
>>> x=x>10
>>> print x
False
>>> x=x+10
>>> print x
10

--- Τέλος κώδικα ---

Υ.Γ. #1: θα θεωρούσαμε το παραπάνω αποδεκτό σε ψευδογλώσσα, έστω και με κάποια warnings κατά την εκτέλεση;
Υ.Γ. #2: σχετικά με το πώς μπορεί ένας διερμηνευτής/μεταγλωττιστής να εξάγει τον τύπο μιας μεταβλητής: http://en.wikipedia.org/wiki/Type_inference

Πλοήγηση

[0] Λίστα μηνυμάτων

[#] Επόμενη σελίδα

[*] Προηγούμενη σελίδα

Μετάβαση στην πλήρη έκδοση