Διερμηνευτής Ψευδογλώσσας

Ξεκίνησε από sstergou, 20 Μαΐου 2008, 07:11:30 ΜΜ

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

sstergou

Τους τελευταίους μήνες κάνω μια προσπάθεια υλοποίησης της ψευδογλώσσας της ΑΕΠΠ. Μια γρήγορη ερώτηση που έρχεται στο μυαλό όλων είναι:"μα καλά, πως είναι δυνατόν να υλοποιηθεί μια ψευδογλώσσα; Λέγεται έτσι επειδή ακριβώς δεν είναι υλοποιήσιμη.".

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

Αυτή την εκφυλισμένη ψευδογλώσσα προσπαθώ να υλοποιήσω και δεν υποστηρίζω πως αυτό είχαν στο μυαλό τους οι συγγραφείς. Με νοιάζει να υλοποιηθεί με συνέπεια το υποσύνολο της ψευδογλώσσας που χρησιμοποιείται στο 95% των περιπτώσεων.

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

Ένας μεταγλωττιστής/διερμηνευτής για την ψευδογλώσσα μπορεί να είναι εξαιρετικά χρήσιμος για τους παρακάτω λόγους.


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

Μέχρι τώρα έχει υλοποιηθεί ο λεκτικός και συντακτικός αναλυτής(backend) και μένει ο συντάκτης και το περιβάλλον εκτέλεσης (frontend).

Πρόβλημα 1 – Τύποι

Υπάρχουν 3 βασικοί τύποι εκφράσεων αλφαριθμητικές, αριθμητικές, λογικές.
Ο αριθμητικός τύπος διακρίνεται σε ακέραιο και πραγματικό. Η διάκριση αυτή γίνεται μόνο για την εφαρμογή των τελεστών div-mod.

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

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

Οι μεταβλητές που δεν έχουν τύπο αποκτούν τύπο σύμφωνα με τους παρακάτω κανόνες.

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

Από την στιγμή που θα αποδοθεί τύπος σε μια μεταβλητή αυτός δεν θα μπορεί να αλλάξει. Οποιαδήποτε “παράνομη” χρήση τελεστών θα έχει την συνέπεια ενός σφάλματος χρόνου εκτέλεσης.

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

P.Tsiotakis

Είμαι απόλυτα σύμφωνος με την ιδέα Στάθη και μάλιστα την είχα προτείνει και στους 2 αστέρες (Άλκη και Σπύρο), είναι γνωστή η αντιπάθεια που έχω στη ΓΛΩΣΣΑ.

1. Συμφωνώ απόλυτα με την λογική "απόδοσης" τύπου στη μεταβλητή κατά την πρώτη χρήση και το μήνυμα λάθους σε μεταγενέστερη λάθος χρήση.  :)

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

Φυσικά, πρέπει να καλύπτονται και οι λάθος εκχωρήσεις του στυλ  α <- 2 * "ζ".

Εγω θέλω να βοηθήσω. Υπάρχουν σίγουρα ΠΑΡΑ πολλά θέματα που θα ανακύψουν και θέλω να συμμετέχω στη συζήτηση.

sstergou

Χαίρομαι ιδιαίτερα για για την συμμετοχή σου Παναγιώτη.  :)

Παράθεση
Φυσικά, πρέπει να καλύπτονται και οι λάθος εκχωρήσεις του στυλ  α <- 2 * "ζ"

Αυτό σημαίνει ότι μέρος των ελέγχων θα πρέπει να γίνει πριν την εκτέλεση. Ποιοι όμως έλεγχοι θα γίνονται πριν και ποιοι μετά;

Αν ελέγχονται μόνο οι εκφράσεις που έχουν μέσα σταθερές;
Τι γίνεται με το :

Διάβασε α
Διάβασε β

γ <- α + β

γ <- "αα";

Γνώμη μου είναι πως πρέπει να είναι σφάλμα χρόνου εκτέλεσης αλλά θέλω να ακούσω και τη γνώμη άλλων πάνω στο θέμα.

Παράθεση από: Τσιωτάκης Παναγιώτης στις 20 Μαΐου 2008, 07:55:04 ΜΜΥπάρχουν σίγουρα ΠΑΡΑ πολλά θέματα που θα ανακύψουν και θέλω να συμμετέχω στη συζήτηση.

Αυτό είναι το μόνο σίγουρο, σκέψου μόνο την κλήση αλγορίθμου από αλγόριθμο  :o


P.Tsiotakis

Την κλήση αλγορίθμου απο αλγόριθμο, μπορείς να την αφήσεις (ή κ να μην την υλοποιήσεις καν)

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

sstergou

#4
Μάλλον δεν γλιτώνουμε το type checking και κατά την διάρκεια της μεταγλώττισης.

Άρα 2 ειδών λάθη τύπων:

  • ότι λάθος μπορεί να πιαστεί κατά τη διάρκεια της μεταγλώττισης
  • Λάθη χρόνου εκτέλεσης

Ήλπιζα να γλιτώσω το πρώτο αλλά μάλλον είναι κακή ιδέα τελικά.

ΠαράθεσηΤην κλήση αλγορίθμου από αλγόριθμο, μπορείς να την αφήσεις ...

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

sstergou

Μία μεταβλητή μ παίρνει τύπο

1) Όταν συμμετέχει σε μία έκφραση με μια άλλη έκφραση
  α) Όταν ο τελεστής είναι αριθμητικός - παίρνει αριθμητικό τύπο
  β) Όταν ο τελεστής είναι λογικός - παίρνει λογικό τύπο
  γ) Όταν ο τελεστής είναι συγκριτικός :
    γ.1)όταν η έκφραση είναι αριθμητική - παίρνει αριθμητικό τύπο
    γ.2)όταν η έκφραση είναι αλφαριθμητική μεταβλητή - παίρνει αλφαριθμητικό τύπο
    γ.3)όταν η έκφραση είναι μεταβλητή αγνώστου τύπου, οι δύο μεταβλητές "δένονται" και δεν παίρνουν τύπο.

2)Όταν συμμετέχει σε έκφραση δείκτη πίνακα - παίρνει αριθμητικό τύπο

3)Όταν αποτελεί παράμετρο κλήσης συνάρτησης - παίρνει αριθμητικό τύπο

4)Όταν συμμετέχει στην εντολή αντιμετάθεσε
  α) Όταν η άλλη μεταβλητή έχει τύπο παίρνει τον τύπο της άλλης μεταβλητής
  β) Όταν η άλλη μεταβλητή δεν έχει τύπο οι δύο μεταβλητές δένονται

5)Όταν συμμετέχει σε επίλεξε είτε ως επιλογέας είτε ως μέλος έκφρασης περίπτωσης
  α) Αν κάτι από όλα έχει τύπο,παίρνει τον κατάλληλο τύπο (Αυτόν που έχουν οι υπόλοιπες εκφράσεις ή ο επιλογέας)
  β) Αν ο επιλογέας ή και οι εκφράσεις δεν έχουν τύπο και είναι μεταβλητές - τότε αυτές "δένοται" μεταξύ τους.

6)Στη εντολή εκχώρησης
  α) Αν η έκφραση έχει τύπο παίρνει τον τύπο της έκφρασης
  β)Αν η έκφραση είναι μεταβλητή που δεν έχει τύπο τότε οι δύο μεταβλητές "δένονται".

7)Αν είναι στοιχείο πίνακα, τότε παίρνει τον τύπο του πίνακα. Αν ο πίνακας δεν έχει τύπο τότε η μεταβλητή "δένεται" με τον πίνακα.

8 )Αν είναι η μοναδική μεταβλητή σε για είτε ως μεταβλητή είτε ως από είτε ως μέχρι είτε ως βήμα, παίρνει αριθμητικό τύπο.

9)Αν είναι η μοναδική μεταβλητή συνθήκης σε Αν,αλλιώς_αν, όσο, μέχρις_ότου παίρνει λογικό τύπο.

Όταν μία μεταβλητή δένεται με μία άλλη σημαίνει ότι όποια πάρει πρώτη τύπο , δίνει τον τύπο της και στην άλλη.
 

sstergou

Είμαι σε φάση που δοκιμάζω την λεκτική-συντακτική ανάλυση και την εξαγωγή τύπων. Θέλω να δοκιμάσω αρκετά το backend πριν προχωρήσω στο περιβάλλον εκτέλεσης και τον συντάκτη.

Σημασία έχει ο διερμηνευτής να
1) Επιστρέφει το σωστό κώδικα μετά τον πετυχημένο συντακτικό έλεγχο
2) Να εξάγει τον σωστό τύπο σύμφωνα με τους κανόνες που δημοσίευσα
3)Να πιάνει όλα τα λάθη που μπορούν να πιαστούν κατά τη μεταγλώττιση.

Στην διεύθυνση : http://users.sch.gr/sstergou/pseudoglossa/ υπάρχει ένα πολύ λιτό και όχι φιλικό interface για το μεταγλωττιστή. Μπορεί όμως να δοκιμάσει όλα τα παραπάνω.

Αν κάποιος έχει χρόνο και όρεξη, ας ρίξει μια ματιά. Σημασία έχουν όλα τα πιθανά λάθη αλλά και οι σωστές μεταγλωττίσεις. Βάζεις τον κώδικα στο textarea πατάς μεταγλώττιση αν υπάρχει λάθος υποτίθεται αναφέρεται, αλλιώς φαίνονται οι μεταβλητές που έχουν πάρει τύπο (και η έκφραση από την οποία έχουν πάρει) και στη συνέχεια ο κώδικας μορφοποιημένος με tabs, χωρίς σχόλια. Θα είναι μεγάλη βοήθεια οποιαδήποτε δοκιμή και αναφορά λάθους στο : sstergouATgmailDOTcom.

pgrontas

#7
Στάθη θα έχω κάποιον χρόνο από Τετάρτη, οπότε σκέφτομαι να αρχίσω να δοκιμάζω.
Θες να ελέγξεις κάτι συγκεκριμένο ή να αρχίσουμε να βαράμε και ότι βρίσκουμε?
Από μια σύντομη ματιά που είδα τώρα είναι case sensitive. Δεν δέχεται πχ. ΑΛΓΟΡΙΘΜΟΣ με κεφαλαία. Επίσης η εκχώρηση είναι <-?
Θα ξεκινήσω δοκιμές από Τετάρτη.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

sstergou

#8
Παναγιώτη προς το παρόν είναι case sensitive, αργότερα όταν υλοποιηθεί ο συντάκτης θα γίνεται έλεγχος για τις λέξεις κλειδιά και θα αναγνωρίζονται σε όλες τους τις μορφές (π.χ. τελοσ_αΝ).
Προς το παρόν οι λέξεις κλειδιά είναι όπως τις έχει το βιβλίο. Η εκχώρηση είναι το <- αλλά και το σύμβολο unicode ← .

Εγώ ελέγχω συνεχώς για τη σωστή απόδοση τύπων, το χειρισμό πινάκων και τα λάθη που προκύπτουν όταν γίνεται κάτι περίεργο κτλ
π.χ.
Κώδικας: ψευδογλώσσα
Επίλεξε α
  Περίπτωση β,τ
  Περίπτωση γ[1]
  Περίπτωση 4
Τέλος_επιλογών


Ο παραπάνω κώδικας θα πρέπει να δώσει αριθμητικό τύπο σε όλες τις μεταβλητές αλλά και στον πίνακα.

ενώ ο :
Κώδικας: ψευδογλώσσα
α[1] <- 2
α[2] <- "3"


Πρέπει να χτυπήσει λάθος τύπων.

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

Ευχαριστώ εκ των προτέρων.

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

alkisg

#9
Διάβασε α, β
Εμφάνισε α > β

Δουλεύει ανεξαρτήτως τύπων είτε για αριθμητικές είτε για αλφαριθμητικές μεταβλητές, και μάλιστα αν ο χρήστης δώσει 10, 9 ανάλογα με το τι τύπο θα ορίσεις βγάζεις διαφορετικό αποτέλεσμα.
Στάθη μου φαίνεται πιο σοφό για την ψυχική σου υγεία ;) να παρατήσεις τον στατικό έλεγχο τύπων, και να κάνεις μόνο δυναμικό.

Διάβασε α   !Ο χρήστης δίνει 0432. Tο διαβάζεις σαν κείμενο! Όχι σαν αριθμό, γιατί τότε θα χάσεις τα αρχικά μηδενικά.
                !Αν όμως δεν είχε μηδενικά, καλύτερα να τον διαβάσεις σαν αριθμό για να διευκολύνεις τις αρχικές δραστηριότητες.
Εμφάνισε α > 0  !Σε αυτό το σημείο καταλαβαίνεις ότι έπρεπε να είναι αριθμός.

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

α <- "10"
Εμφάνισε α > 0

Το παραπάνω όμως είναι σίγουρα συντακτικό σφάλμα.

Επομένως, κατά την εκτέλεση, αποφασίζεις για τους τύπους:
1. Το τι τύπο θεώρησες ότι είναι, a.type = {empty, number, integer, real, string, boolean}
2. Το πόσο σίγουρος είσαι για τη θεώρηση, a.stricttype = {false, true}
Αν δεν είσαι σίγουρος, επιτρέπεις (μερικές μόνο) δυναμικές αλλαγές τύπων, όπως στο παραπάνω παράδειγμα.
Αν είσαι σίγουρος τότε δεν επιτρέπεις δυναμική αλλαγή τύπου και πετάς συντακτικό σφάλμα κατά την εκτέλεση. :)

Ο τύπος number παραπάνω χρειάζεται για τις περιπτώσεις:
α <- 1    ! α = number, δεν ξέρουμε τι είναι
α <- 1.1 ! α = real
α <- 4 div 2  ! α = integer

και φυσικά δυναμικά μετατρέπεται σε real ή integer όταν θα έχεις παραπάνω πληροφορίες, ώστε να απαγορεύσεις στη συνέχεια περαιτέρω αλλαγή του στον αντίθετο (integer / real) τύπο. Π.χ. αν οι τρεις παραπάνω εντολές υπήρχαν στο ίδιο πρόγραμμα, στην τρίτη έπρεπε να χτυπήσεις συντακτικό σφάλμα.

sstergou

Παράθεση από: alkisg στις 09 Ιουν 2008, 07:31:47 ΠΜ
Διάβασε α, β
Εμφάνισε α > β
Δουλεύει ανεξαρτήτως τύπων είτε για αριθμητικές είτε για αλφαριθμητικές μεταβλητές, και μάλιστα αν ο χρήστης δώσει 10, 9 ανάλογα με το τι τύπο θα ορίσεις βγάζεις διαφορετικό αποτέλεσμα.
Για αυτό και σ'αυτήν την περίπτωση δεν αποδίδεται τύπος στη διάρκεια της μεταγλώττισης αλλά περιμένω να μαντέψω κατά τη διάρκεια της εκτέλεσης.

Παράθεση από: alkisg στις 09 Ιουν 2008, 07:31:47 ΠΜ
Στάθη μου φαίνεται πιο σοφό για την ψυχική σου υγεία ;) να παρατήσεις τον στατικό έλεγχο τύπων, και να κάνεις μόνο δυναμικό.

Αυτό σκεφτόμουνα στην αρχή αλλά προφανώς το
Κώδικας: ψευδογλώσσα
β<- α / "αλφαριθμητικό"

πρέπει να χτυπήσει λάθος μεταγλώττισης. Τώρα η ζημιά έγινε (!)

Βέβαια υπάρχει το εξής πρόβλημα :
Κώδικας: ψευδογλώσσα
α <- 2
Αν α > 3 τότε
  β <- 4
αλλιώς 
  β <-3.14
Τέλος_αν

γ <- α mod β

όπου αν και όλη η πληροφορία είναι εκεί ο τύπος δεν μπορεί να εξακριβωθεί γιατί πρέπει να εκτελεστεί ο κώδικας οπότε ο έλεγχος για το mod είναι λάθος και βασίζεται στην τελευταία τιμή του β (3.14).
Αυτό που θα μπορούσε να γίνει είναι :
Ο real να είναι strict τύπος και να μην επιτρέπεται μετατροπή σε integer οπότε χτυπάει λάθος μεταγλώττισης, αλλά τότε παίρνουμε μέρος της ελευθερίας της ψευδογλώσσας και αυτό δεν μου αρέσει. Ακόμη θα μπορούσε ο μεταγλωττιστής απλά να βγάζει ένα warning χωρίς να σταματάει και να αφήνει το λάθος να πιαστεί κατά τη διάρκεια της εκτέλεσης.

Παράθεση από: alkisg στις 09 Ιουν 2008, 07:31:47 ΠΜ
2. Το πόσο σίγουρος είσαι για τη θεώρηση, a.stricttype = {false, true}
Αν δεν είσαι σίγουρος, επιτρέπεις (μερικές μόνο) δυναμικές αλλαγές τύπων, όπως στο παραπάνω παράδειγμα.
Αν είσαι σίγουρος τότε δεν επιτρέπεις δυναμική αλλαγή τύπου και πετάς συντακτικό σφάλμα κατά την εκτέλεση. :)

Ενδιαφέρουσα προσέγγιση  :)

Παράθεση από: alkisg στις 09 Ιουν 2008, 07:31:47 ΠΜ
Ο τύπος number παραπάνω χρειάζεται για τις περιπτώσεις:
α <- 1    ! α = number, δεν ξέρουμε τι είναι
α <- 1.1 ! α = real
α <- 4 div 2  ! α = integer

και φυσικά δυναμικά μετατρέπεται σε real ή integer όταν θα έχεις παραπάνω πληροφορίες, ώστε να απαγορεύσεις στη συνέχεια περαιτέρω αλλαγή του στον αντίθετο (integer / real) τύπο. Π.χ. αν οι τρεις παραπάνω εντολές υπήρχαν στο ίδιο πρόγραμμα, στην τρίτη έπρεπε να χτυπήσεις συντακτικό σφάλμα.

Ξέρεις τι δε μου αρέσει σε αυτό; :
Κώδικας: ψευδογλώσσα
α<-3.14
εντολές
α <- 2
Γράψε α mod 2

με αυτή την προσέγγιση ο παραπάνω κώδικας πρέπει να χτυπήσει λάθος αν και η τιμή του α είναι έγκυρη... :(
Μήπως να πάμε και εδώ σε σφάλμα χρόνου εκτέλεσης με κάποιο warning ίσως στη μεταγλώττιση;

papet

Είμαι λίγο ζαλισμένος σήμερα αλλά, παρακαλώ ας μου επιτραπεί μια παρέμβαση...

Παράθεση από: alkisg στις 09 Ιουν 2008, 07:31:47 ΠΜ
Ο τύπος number παραπάνω χρειάζεται για τις περιπτώσεις:
α <- 1    ! α = number, δεν ξέρουμε τι είναι
α <- 1.1 ! α = real
α <- 4 div 2  ! α = integer

και φυσικά δυναμικά μετατρέπεται σε real ή integer όταν θα έχεις παραπάνω πληροφορίες, ώστε να απαγορεύσεις στη συνέχεια περαιτέρω αλλαγή του στον αντίθετο (integer / real) τύπο. Π.χ. αν οι τρεις παραπάνω εντολές υπήρχαν στο ίδιο πρόγραμμα, στην τρίτη έπρεπε να χτυπήσεις συντακτικό σφάλμα.

Νομίζω ότι μπορεί να αποφευχθεί η χρήση του τύπου number. Ο αριθμός μπορεί να θεωρείται αρχικά integer (αν δεν καθορίζεται σαφώς ως real από την πρώτη εκχώρηση) και στη συνέχεια να "κλειδώνει" (κι εμένα μου άρεσε η ιδέα με τη stricttype ιδιότητα) με το πρώτο div/mod ή δεκαδικό στον αντίστοιχο τύπο...

(Συγχωρήστε με αν λέω αβάσιμα πράγματα -είχα μια πολύ δύσκολη νύχτα-)
May the Force b with u...
papet

sstergou

Ναι, σε κάποιες περιπτώσεις όπως στη συγκεκριμένη μπορεί να αποφευχθεί.

Σκέψου όμως και το :

Κώδικας: ψευδογλώσσα
β <- 1
Διάβασε α
β <- α + β


Δεν πρέπει το α να πάρει κάποιον τύπο έστω και προσωρινό ώστε να ξέρει ο μεταγλωττιστής σε τι εκφράσεις μπορεί να τον χρησιμοποιήσει;
Και αφού δεν ξέρουμε αν είναι integer ή real , το προτιμότερο είναι ένας γενικότερος τύπος number.

Βασικά αυτό που σκεφτόμουνα είναι οι τύποι integer και real να έχουν αξία μόνο αν η μεταβλητή έχει τιμή. Την τιμή της όμως δεν μπορείς να την ξέρεις πριν την εκτέλεση είτε γιατί πρέπει να διαβαστεί είτε γιατί πρέπει να εκτελέσεις τον κώδικα (δες το παραπάνω παράδειγμα με την Αν). Μου κακοφαίνεται για την φιλοσοφία της ψευδογλώσσας ο αυστηρός ακέραιος ή πραγματικός τύπος που χτυπάει λάθος μεταγλώττισης σε div,mod, ακόμα και αν δεν είναι γνωστή η τιμή της μεταβλητής...

π.χ. ο κώδικας
Κώδικας: ψευδογλώσσα
α[4/4] <- 1

πρέπει να χτυπήσει λάθος μεταγλώττισης?

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

Βέβαια ίσως αυτό αποδειχθεί τελικά ανέφικτο οπότε πάμε σε αυστηρούς τύπους.

alkisg

papet, δίκιο έχεις, ο τύπος number μπορεί να αποφευχθεί αν οι αριθμοί θεωρούνται αρχικά integer με stricttype=false. Τα έγραψα βιαστικά γιατί έφευγα για σχολείο.

Στάθη, το
β <- α / "αλφαριθμητικό"
ΔΕΝ είναι απαραίτητο να χτυπήσει εξ' αρχής λάθος μεταγλώττισης. Μπορεί να το χτυπήσει αργότερα όταν πάει να εκτελέσει τη συγκεκριμένη γραμμή. Έτσι θα είναι και συνεπής με τη θεωρία του βιβλίου, που λέει ότι οι διερμηνευτές μεταφράζουν το πρόγραμμα ανά γραμμή (ας μην επεκταθώ παραπέρα γιατί έχω πολλά να πω για τη θεωρία! :P). Φυσικά έτσι που το έχεις σχεδιάσει το β <- α / / θα χτυπήσει συντακτικό λάθος εξ' αρχής αφού το δεύτερο / δεν είναι έκφραση.

Για παράδειγμα,
Κώδικας: ψευδογλώσσα
Αν 1 = 2 τότε β <- α / "αλφαριθμητικό" 
Εμφάνισε "Η παραπάνω ανάθεση δεν πρόκειται να εκτελεστεί ποτέ, επομένως ένας διερμηνευτής μπορεί κάλλιστα να εκτελέσει τον αλγόριθμο"



Βασικά προτείνω να υπάρχουν οι εξής επιλογές κάπου στο interface:
( ) Να μην επιτρέπονται αλλαγές στον τύπο των μεταβλητών και να σταματάει η εκτέλεση
(*) Να επιτρέπονται αλλαγές στον τύπο των μεταβλητών και να εμφανίζεται warning
( ) Να επιτρέπονται αλλαγές στον τύπο των μεταβλητών και να μην εμφανίζεται warning

και φυσικά όταν λέω αλλαγή τύπου, εννοώ αφού έχει ξεκαθαριστεί ο τύπος της (stricttype = true). Δηλαδή το α <- 1 και μετά α <- 1.2 δεν θεωρείται αλλαγή τύπου.
Γράφω κάποια παραδείγματα παρακάτω. Όταν λέω "να βγάλει warning", αυτό εξαρτάται από την επιλογή του interface, δηλαδή μπορεί είτε να σταματήσει, είτε να εμφανίσει warning, είτε να μην εμφανίσει τίποτα.

Παραδείγματα:
α <- 1.1
α <- 2
ι <- α div 2
Θεωρώ ότι πρέπει να βγάλει warning, το div δεν ορίζεται για πραγματικούς. Αν ήθελε div δεν θα έπρεπε ποτέ να του αναθέσει πραγματική τιμή.

α <- 6.2
β <- α div 2
Επίσης warning αλλά αν ο χρήστης έχει επιλέξει να μη σταματάει η εκτέλεση τότε το β να γίνει 3 και να συνεχίσει.

α <- "Κώστας"
α <- 3
Επίσης προτείνω σκέτο warning και να επιτρέπεται η συνέχιση της εκτέλεσης με τη σχετική επιλογή του interface.
Εφόσον λέμε ότι δεν έχουμε τύπους, δεν έχουμε τύπους, τελεία. Στο χέρι του προγραμματιστή είναι να κάνει ότι θέλει. Δεν είναι περίεργο, αρκετές γλώσσες το επιτρέπουν.

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

Ένα πιο σοβαρό είναι οι πράξεις:
α <- "6.2"
β <- α div 2

ή

α <- "Κώστας"
β <- α div 2

Φυσικά θα βγάλεις warning, θα σταματήσει όμως η εκτέλεση ή όχι; Εδώ μερικές γλώσσες κάνουν το β στην πρώτη περίπτωση 3 και στη δεύτερη 0, άλλες το κάνουν NaN (Not A Number) και άλλες δεν το επιτρέπουν και σταματάνε την εκτέλεση.
Προτείνω σε αυτήν την περίπτωση να σταματάει η εκτέλεση, γιατί δεν μπορώ να φανταστώ μαθητή που να θέλει επίτηδες να κάνει κάτι τέτοιο.

Ιδέες ρίχνω, εσύ διαλέγεις...

sstergou

Μου φαίνεται περίεργο να υλοποιώ μια stictly typed γλώσσα ενώ τόσο καιρό είμαι φανατικός υποστηρικτής των δυναμικών τύπων και πιο συγκεκριμένα των τύπων πάπιας : http://en.wikipedia.org/wiki/Duck_typing

Το κακό είναι ότι δεν υπάρχει η αντίστοιχη στήριξη από το βιβλίο για τέτοια υλοποίηση, το οποίο μιλάει ξεκάθαρα για τύπους. Αν είναι να δώσω ένα χαρακτηρισμό στην ψευδογλώσσα θα της έδινα stictly typed με type inference εκτός βέβαια από τους αριθμούς που εκεί τα πράγματα είναι λίγο χλωμά.

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

Παράθεση από: alkisg στις 09 Ιουν 2008, 02:37:02 ΜΜ
το
β <- α / "αλφαριθμητικό"
ΔΕΝ είναι απαραίτητο να χτυπήσει εξ' αρχής λάθος μεταγλώττισης. Μπορεί να το χτυπήσει αργότερα όταν πάει να εκτελέσει τη συγκεκριμένη γραμμή. Έτσι θα είναι και συνεπής με τη θεωρία του βιβλίου, που λέει ότι οι διερμηνευτές μεταφράζουν το πρόγραμμα ανά γραμμή (ας μην επεκταθώ παραπέρα γιατί έχω πολλά να πω για τη θεωρία!
...


Ναι, αλλά σκέψου και την περίπτωση να έχεις δώσει 20 τιμές για διάβασμα δισδιάστατου και να μην δεις αποτέλεσμα επειδή ξέχασες ένα κόμμα!Σκέτη απελπισία...

Άσε που το συγκεκριμένο σημείο θεωρίας είναι το λιγότερο παρωχημένο ;) Μήπως ο διερμηνευτής της γλώσσας δεν είναι τελικά διερμηνευτής :D

Παράθεση από: alkisg στις 09 Ιουν 2008, 02:37:02 ΜΜ
Βασικά προτείνω να υπάρχουν οι εξής επιλογές κάπου στο interface:
( ) Να μην επιτρέπονται αλλαγές στον τύπο των μεταβλητών και να σταματάει η εκτέλεση
(*) Να επιτρέπονται αλλαγές στον τύπο των μεταβλητών και να εμφανίζεται warning
( ) Να επιτρέπονται αλλαγές στον τύπο των μεταβλητών και να μην εμφανίζεται warning

Το κακό στα 2,3 είναι ότι μπορεί να χαθεί πληροφορία και το ότι έρχεται σε πλήρη αντίθεση με αυτό που θα μάθουν αργότερα....

Ψηφίζω warning πριν την εκτέλεση (μόνο για αριθμούς, για άλλους τύπους λάθος) και σφάλμα χρόνου εκτέλεσης με παύση εκτέλεσης.

Όσοι άλλοι συνάδελφοι έχουν άποψη για αυτό το θέμα, θα εκτιμούσα ιδιαίτερα αν την έγραφαν.