ΝΕΟΣ διαδικτυακός διερμηνευτής της Γλώσσας

Ξεκίνησε από komni, 19 Νοε 2020, 05:33:46 ΜΜ

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

bugman

#15
@komni,
Μπράβο και πάλι! Θα ήθελα να δω τι θα φτιάχνεις δέκα χρόνια αργότερα!  :)
Μόλις δοκίμασα τη Κυκλική Ουρά, όπως ήταν με Σταθερές και διπλά εισαγωγικά. Σφαίρα πήγε! Όλα Καλά!


Να προσθέσω: Ανοίγει άμεσα στο Διερμηνευτή του Αλκη! Είχε ΒΟΜ (και πάλι μπράβο γιατί ανταποκρίθηκες άμεσα).

evry

Πολύ καλή δουλειά, μπράβο!!

Στο github γράφεις The programming language was created by the AEPP book authors and inspired by Pascal and BASI
έχεις ξεχάσει το C στην BASIC.

Δοκίμασα και το παρακάτω πρόγραμμα να δω πως υλοποίησες τη μεταβίβαση παραμέτρων :
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

bugman


dski

Πολλά μπράβο για την πρωτοβουλία και, κυρίως, για τη δουλειά σου!

Μια πρόταση, αν έχεις χρόνο και διάθεση, είναι να εντάξεις στον διερμηνευτή και την Ψευδογλώσσα, κυρίως για τους μαθητές της Β' Λυκείου. Υπάρχει βέβαια το πολύ καλό pseudoglossa.gr όμως βασίζεται σε flash του οποίου η υποστήριξη τελειώνει 31/12/2020 πράγμα που σημαίνει ότι μετά από κάποιο διάστημα το pseudoglossa.gr θα πάψει να είναι λειτουργικό (το ίδιο ισχύει και για το επίσης πολύ καλό και χρήσιμο algo.pk).

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

komni

#19
Παράθεση από: bugman στις 20 Νοε 2020, 01:18:57 ΜΜ
@komni,
Μπράβο και πάλι! Θα ήθελα να δω τι θα φτιάχνεις δέκα χρόνια αργότερα!  :)
Μόλις δοκίμασα τη Κυκλική Ουρά, όπως ήταν με Σταθερές και διπλά εισαγωγικά. Σφαίρα πήγε! Όλα Καλά!


Να προσθέσω: Ανοίγει άμεσα στο Διερμηνευτή του Αλκη! Είχε ΒΟΜ (και πάλι μπράβο γιατί ανταποκρίθηκες άμεσα).
Ευχαριστώ πολύ!


Παράθεση από: evry στις 20 Νοε 2020, 01:44:21 ΜΜ
Πολύ καλή δουλειά, μπράβο!!

Στο github γράφεις The programming language was created by the AEPP book authors and inspired by Pascal and BASI
έχεις ξεχάσει το C στην BASIC.

Δοκίμασα και το παρακάτω πρόγραμμα να δω πως υλοποίησες τη μεταβίβαση παραμέτρων :

Πολύ καλό παράδειγμα! Δεν είχα σκεφτεί να περάσω την ίδια μεταβλητή ως παράμετρο πάνω από μια φορά. Υπάρχει ένα bug εδώ γιατί θα έπρεπε να τυπώνει 496 αντί για 28 αλλά ξέρω ακριβώς τι είναι και θα το διορθώσω το βράδυ μαζί με ένα άλλο bug στο ΕΠΙΛΕΞΕ.


Παράθεση από: dski στις 20 Νοε 2020, 03:52:57 ΜΜ
Πολλά μπράβο για την πρωτοβουλία και, κυρίως, για τη δουλειά σου!

Μια πρόταση, αν έχεις χρόνο και διάθεση, είναι να εντάξεις στον διερμηνευτή και την Ψευδογλώσσα, κυρίως για τους μαθητές της Β' Λυκείου. Υπάρχει βέβαια το πολύ καλό pseudoglossa.gr όμως βασίζεται σε flash του οποίου η υποστήριξη τελειώνει 31/12/2020 πράγμα που σημαίνει ότι μετά από κάποιο διάστημα το pseudoglossa.gr θα πάψει να είναι λειτουργικό (το ίδιο ισχύει και για το επίσης πολύ καλό και χρήσιμο algo.pk).

Οι συντακτικές διαφορές μεταξύ Γλώσσας και Ψευδογλώσσας είναι λίγες οπότε εκτιμώ ότι δεν θα πρέπει να είναι πολύ δύσκολο αφού έχεις ήδη τον διερμηνευτή για τη Γλώσσα.
Ευχαριστώ πολύ - όντως οι διαφορές είναι ελάχιστες. Θα το δω από 'βδομάδα αλλά λογικά θα είναι αρκετά εύκολο.

evry

Όχι δεν θα έπρεπε σωστά το έχεις!  :D :D :D :D
Μην το αλλάξεις!
Παράθεση από: komni στις 20 Νοε 2020, 04:37:00 ΜΜ
Ευχαριστώ πολύ!

Πολύ καλό παράδειγμα! Δεν είχα σκεφτεί να περάσω την ίδια μεταβλητή ως παράμετρο πάνω από μια φορά. Υπάρχει ένα bug εδώ γιατί θα έπρεπε να τυπώνει 496 αντί για 28 αλλά ξέρω ακριβώς τι είναι και θα το διορθώσω το βράδυ μαζί με ένα άλλο bug στο ΕΠΙΛΕΞΕ.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

komni

Παράθεση από: evry στις 20 Νοε 2020, 11:53:39 ΜΜ
Όχι δεν θα έπρεπε σωστά το έχεις!  :D :D :D :D
Μην το αλλάξεις!

Μάλλον δεν έχω καταλάβει κάτι σωστά τότε...

Όταν δίνω την μεταβλητή ως παράμετρο στη διαδικασία είναι pass by reference, σαν τους pointers της C ας πούμε, και η τελευταία εκχώρηση(Χ <- 496) είναι η τελευταία τιμή που εισέρχεται στην θέση μνήμης της μεταβλητής Α οπότε δεν θα έπρεπε να μένει αυτή;

Στην τωρινή έκδοση ο διερμηνευτής απλά loopάρει τις παραμέτρους με τη σειρά που έχουν δηλωθεί και κάνει εκχωρήσεις στο τέλος. Δηλαδή στο παράδειγμα μετά την εκτέλεση της διαδικασίας θα έκανε
Α <- (τιμή του Χ μετά την εκτέλεση της διαδικασίας δηλαδή 496)
Α <- (τιμή του Y μετά την εκτέλεση της διαδικασίας δηλαδή 6)
Α <- (τιμή του Z μετά την εκτέλεση της διαδικασίας δηλαδή 28)

Kαι έτσι βγαίνει αποτέλεσμα 28.

Ποιό από τα δύο είναι το σωστό;

Δεν είχα σκεφτεί να περάσω την ίδια μεταβλητή πάνω από μία φορά όταν το υλοποίησα και τώρα μου βγάζει πιο πολύ λογική το πρώτο.

bugman

#22
Δεν έχουμε by reference στο διερμηνευτή, λέγεται copy in copy out.  Δηλαδή αντιγραφή εισόδου(in) στη τοπική, και στο τέλος αντιγραφή εξόδου (out)

Στον διερμηνευτή του Άλκη δίνει 496. Αυτό συμβαίνει γιατί περνάει τις μεταβλητές με ανάποδη φορά. Έτσι τα X, Y, Z είναι το Α, και η τελευταία τιμή στο Α πάει με το Χ, άρα το Α γίνεται 496 (η φορά αντιγραφής είναι η ανάποδη από τη σειρά που μπήκαν οι μεταβλητές).
Στον δικό σου διερμηνευτή. Φτιάχνεις τις Χ, Υ, Ζ και δίνεις τιμές τα Α,Α,Α. Στο τέλος ο διερμηνευτής σου πάει πάλι την λίστα παραμέτρων από την αρχή (εδώ είναι η διαφορά) και κάνει τις εκχωρήσεις, στο Α το Χ, στο Α το Υ, στο Α το Ζ. Άρα εδώ θα πάρει το Α την τιμή του Ζ, το 28
Αν τις έκανε με την ανάποδη φορά, δηλαδή από το Ζ στο Χ, τότε θα είχε τιμή το Α το 496.

Παρόλα αυτά αν δοκιμάσουμε το παρακάτω πρόγραμμα στον διαδικτυακό διερμηνευτή σου, δηλαδή έχουμε πίνακες, τότε θα λειτουργήσει σωστά! Θα δώσει 496. Πώς γίνεται αυτό;
ΠΡΟΓΡΑΜΜΑ ΤΕΣΤ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: Α[4] 
ΑΡΧΗ
  Α[2] <- 0
  ΚΑΛΕΣΕ ΠΡΟΒΛΗΜΑ(Α, Α, Α) 
  ΓΡΑΨΕ Α[2] 
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

ΔΙΑΔΙΚΑΣΙΑ ΠΡΟΒΛΗΜΑ(Χ, Υ, Ζ) 
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: Χ[4], Υ[4], Ζ[4] 
ΑΡΧΗ
  Υ[2] <- 6
  Ζ[2] <- 28
  ΓΡΑΨΕ Υ[2], Ζ[2]
  Χ[2] <- 496
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ



Στην ουσία εδώ δεν κάνεις αντιγραφή του πίνακα! Δηλαδή στους πίνακες κάνεις μεταφορά δείκτη. Οπότε τα Χ[]. Υ[]. Ζ[] είναι το Α[]. Πάλι κάνεις "αντιγραφή" ως copy out, αλλά γίνεται στο δείκτη, άρα αν υποθέσουμε ότι ο φυσικός δείκτης είναι το 7982734 τότε στο Α δίνει από τα Χ, Υ και Ζ την ίδια τιμή το 7982734.
Να γιατί η επιστροφή είναι 496. Έτυχε γιατί το παράδειγμα του Evry είναι περιορισμένο (biassed), να υποθέτει ότι τρέχει για copy in copy out μέθοδο, και απλά να κοιτάει την σειρά που στο τέλος γίνονται οι αντιγραφές. Αν το τσεκάρει σε διερμηνευτή που παίζει με πραγματική αναφορά (by reference), πχ visual basic 6, τότε θα πάρει το επιθυμητό αποτέλεσμα, για λάθος μέθοδο! Στον προγραμματισμό εύκολα πέφτουμε στο λάθος να "υποθέτουμε" μια λειτουργία (χωρίς να την γνωρίζουμε, ή να την γνωρίζουμε μερικώς), να δίνουμε δεδομένα προς έλεγχο και να παίρνουμε τα "σωστά" και να νομίζουμε πως το τεστ δουλεύει!
Τεστ για τον Ervy, και οποιονδήποτε, να βρει ένα πιο σίγουρο τεστ, ώστε να μην ελέγχει μόνο την φορά, αλλά και την λειτουργία ότι όντως είναι copy in copy out.


ΠΡΟΣΘΗΚΗ 1: Με τη γραμμή ΓΡΑΨΕ Υ[2], Ζ[2] στη διαδικασία φαίνεται άμεσα το by reference (object reference). Δηλαδή στο διερμηνευτή του Άλκη θα πάρουμε 6 και 28, και στον διαδικτυακό τα 28 και 28.

ΠΡΟΣΘΗΚΗ 2: Η typescript, και η κάτω από αυτήν javascript δεν θα περάσουν με αναφορά τίποτα! Θα περάσουν όμως το δείκτη του αντικειμένου! Η επιστροφή δείκτη δεν έχει νόημα! Και αυτό γιατί στην ουσία δεν γίνεται! Ο μόνος τρόπος να πάρεις τον δείκτη πίσω είναι να τον δώσεις ως αποτέλεσμα συνάρτησης, άρα να τον εκχωρήσεις στο επίπεδο της κλήσης, μετά τη κλήση. Ο τρόπος να το ξεπεράσει κανείς αυτό είναι με το Boxing, δηλαδή βάζουμε ένα αντικείμενο άλλο, πχ το W να κρατάει το δείκτη του A, και έτσι η αλλαγή δείκτη στο Α να μπορεί να γίνει! Στην επιστροφή το W (που δεν αλλάζει δείκτη) έχει το νέο Α.

ΠΡΟΣΘΗΚΗ 3: Η C δεν περνάει τίποτα με αναφορά! Πάντα με τιμή. Οπότε όταν θέλουμε να περάσει κάτι σαν να είναι με αναφορά έχει τους δείκτες, που είναι μεταβλητές που κρατάνε το δείκτη προς τη μεταβλητή, και αυτές εν συντομία τους λέμε δείκτες! Σε αντίθεση η C++, έχει πέρασμα με αναφορά, και στις οποίες αναφορές γίνεται μια φορά η  "ένωση" με μια μεταβλητή, δεν μπορεί να γίνει δεύτερη φορά. Στη Μ2000 που έχω γράψει ακολουθώ το ίδιο σύστημα, όλα τα περάσματα είναι με τιμή εκτός από εκείνα που δηλώνονται με αναφορά με χρήση του & και ειδικά στη Μ2000 το & πρέπει να εμφανίζεται και στη συνάρτηση ή τη διαδικασία (τμήμα λέγεται στη Μ2000) στην τυπική παράμετρο, πχ Τμήμα Τμήμα1(&Χ) και στη κλήση πχ Τμήμα1 &Α. Και εδώ μόνο μια φορά μπορεί να δοθεί η ένωση, δηλαδή το σε τι θα αναφέρεται το όνομα που λέμε αναφορά. Η υλοποίησή του είναι απλή: όλες οι μεταβλητές είναι σε ένα πίνακα, έτσι πχ αν το Α είναι στη θέση 10, τότε η αναφορά του Α έστω το Χ θα είναι ένα όνομα που θα δείχνει τη θέση 10. Το ζήτημα είναι το πώς θα περάσουμε με τιμή (αφού μόνο με τιμή περνάμε κάτι) στη κλήση την αναφορά! Αυτό γίνεται με την λεγόμενη ισχνή αναφορά, δηλαδή θα περάσουμε κάτι το οποίο κατά την "σύνδεση" θα βρει από αυτό ο διερμηνευτής ότι το Χ θα πρέπει να δείχνει στο 10 και όχι σε μια νέα θέση στο πίνακα μεταβλητών. Ο τρόπος που σκέφθηκα να το κάνω ήταν απλός, να περάσω ένα αλφαριθμητικό με το "απόλυτο όνομα" του A, έτσι αν το Α ανήκει στο τμήμα Αλφα, το απόλυτο όνομα είναι το Αλφα.Α και στην ανάγνωση για την δημιουργία της αναφοράς ο διερμηνευτής "επιλύει" την ισχνή σε πραγματική αναφορά, βρίσκει ότι το Άλφα.Α είναι στην θέση 10, και φτιάχνει την Χ σημειώνοντας ότι είναι αναφορά, και ότι η θέση του είναι στο 10. Η σημείωση ότι είναι αναφορά γίνεται για να μην "μηδενιστεί" η τιμή του 10 κατά την έξοδο, επειδή οι θέσεις "καθαρίζονται" κανονικά στην έξοδο, και αυτό βοηθάει όταν έχουμε κάτι που πρέπει να εκτελεστεί κατά τον καθαρισμό, πχ ένα αντικείμενο.


bugman

#23
Στα παραδείγματα Α και Β παρακάτω, στο Διερμηνευτή του Άλκη θα πάρουμε τιμές 2 και 1, ενώ στο διαδικτυακό Διερμηνευτή τα 1 και 2. Φαίνεται η αλλαγή φοράς!
Και στις δυο περιπτώσεις, η copy in copy out διαδικασία ΔΕΝ είναι καλή, δεν έχει αποτελέσματα που θα ήθελε κανείς να έχει, να δώσει την ίδια τιμή και στις δυο περιπτώσεις!
Στο παράδειγμα Γ στη Μ2000 το αποτέλεσμα είναι 3 σε κάθε περίπτωση. Εδώ κάνω χρήση της στατικής ρουτίνας (όχι ενός τμήματος). Στις ρουτίνες δημιουργούνται τοπικές μεταβλητές ενώ παραμένει η θέαση των μεταβλητών του τμήματος που περιέχονται (κάτι που δεν γίνεται στις διαδικασίες της ΓΛΩΣΣΑΣ, καθώς και στα Τμήματα της Μ2000)! Μπορούμε προαιρετικά να καλέσουμε τις ρουτίνες με την ΚΑΛΕΣΕ (και έτσι θα μοιάζει περισσότερο με τη ΓΛΩΣΣΑ).

Στο πέρασμα με αναφορά έχουμε το αποτέλεσμα το ίδιο ανεξάρτητα με τη σειρά που θα βάλουμε τις τυπικές παραμέτρους, ή με τη σειρά που θα τις πειράξουμε εντός!

Παράδειγμα Α
ΠΡΟΓΡΑΜΜΑ ΤΕΣΤ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: Α
ΑΡΧΗ
  Α <- 1
  ΚΑΛΕΣΕ ΠΡΟΒΛΗΜΑ(Α, Α, Α) 
  ΓΡΑΨΕ Α
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

ΔΙΑΔΙΚΑΣΙΑ ΠΡΟΒΛΗΜΑ(Χ, Υ, Ζ) 
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: Χ, Υ, Ζ
ΑΡΧΗ
  Χ <- Υ + 1
  Χ <- Ζ + 1
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ


Παράδειγμα Β
ΠΡΟΓΡΑΜΜΑ ΤΕΣΤ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: Α
ΑΡΧΗ
  Α <- 1
  ΚΑΛΕΣΕ ΠΡΟΒΛΗΜΑ(Α, Α, Α) 
  ΓΡΑΨΕ Α
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

ΔΙΑΔΙΚΑΣΙΑ ΠΡΟΒΛΗΜΑ(Χ, Υ, Ζ) 
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: Χ, Υ, Ζ
ΑΡΧΗ
  Ζ <- Χ + 1
  Ζ <- Υ + 1
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ


Παράδειγμα Γ
Α=1
Κ1(&Α, &Α, &Α)
Τύπωσε Α
Α=1
Κ2(&Α, &Α, &Α)
Τύπωσε Α

Ρουτίνα Κ1(&Χ, &Υ, &Ζ)
	Χ=Υ+1
	Χ=Ζ+1
Τέλος Ρουτίνας
Ρουτίνα Κ2(&Χ, &Υ, &Ζ)
	Ζ=Χ+1
	Ζ=Υ+1
Τέλος Ρουτίνας

pfan

Κομνηνέ χίλια μπράβο !!!!

Να πω και εγώ ότι είμαι περήφανη για τον μαθητή μου!!!! (Αν και φέτος μας έφυγε και πήγε σε ιδιωτικό σχολείο...)

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

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

Ας τον βοηθήσουμε να κάνει το testing και βελτιώσεις ...

Χίλια μπράβο και πάλι!!!


Πύρζα Φανή
Καθηγήτρια Πληροφορικής

P.Tsiotakis

Συγχαρητήρια αγαπητέ μου και καλή πρόοδο. Σου εύχομαι όλα σου τα όνειρα να γίνουν πραγματικότητα.
Με υγεία...
ΠΤ

komni

#26
@bugman Οκ οπότε καλά το είχα. Συμφωνώ ότι δεν είναι η καλύτερη επιλογή για μια γλώσσα προγραμματισμού αλλά αυτό λέει το βιβλίο και πρέπει να συμμορφωθούμε. Υπάρχει κάποιος λόγος που ο Διερμηνευτής του Άλκη κάνει το copy in copy out ανάποδα; Λέει κάτι το βιβλίο γι' αυτό; @alkisg

Όσον αφορά το παράδειγμα με τους πίνακες(πολύ έξυπνο!), αυτό είναι bug!
Φαντάζομαι έχει να κάνει σχέση με το γεγονός ότι η Javascript(στην οποία  τρέχει ο διερμηνευτής) περνάει, όπως είπες και εσύ, τους δείκτες των αντικειμένων by reference(και συνεπώς και των πινάκων γιατί στην Javascript όλα είναι αντικείμενα, αν και υπάρχει μια μικρή εξαίρεση για τα primitive types)
Θα το αλλάξω ώστε να αντιγράφονται σωστά οι πίνακες στο κάλεσμα διαδικασίας και απλά να τους αντιγράφει πάλι πίσω στο τέλος.

@pfan
Ευχαριστώ!! 🔝🔝🔝

@P.Tsiotakis
Ευχαριστώ πολύ!

ApoAntonis

Συγχαρητήρια,
πάντα υγιής και ορεξάτος να είσαι Κομνηνέ.

alkisg

@komni, δεν αναφέρει κάτι το βιβλίο, εγώ το θεώρησα φυσικό επειδή συνήθως οι παράμετροι γίνονται push στη στοίβα κατά την κλήση και στη συνέχεια pop κατά την εξαγωγή:
https://users.cs.fiu.edu/~downeyt/cop3402/passing.htm

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

Δες και παλιότερες συζητήσεις π.χ. https://alkisg.mysch.gr/steki/index.php?topic=8141.msg88984#msg88984

bugman

#29
@komni,
Σε μπερδεύει το by reference. Στη javascript έχουμε by value πραγματικό, αλλά στα αντικείμενα, επειδή μπαίνει ο δείκτης τους και όχι η μνήμη πχ 100bytes που αντιστοιχεί στα δεδομένα τους, οι τυχόν αλλαγές θα φανούν σαν by reference, για το λόγο αυτό το λέμε object reference. Αν το αντικείμενο Α πέρναγε με αναφορά πραγματική και το έπαιρνε μια Β τότε αν δίναμε στη Β ένα νέο αντικείμενο (άλλος δείκτης) το Α θα τον είχε, αφού Α και Β θα έδειχναν (λέγεται Indirect addressing, ή έμμεση διευθυνσιοδότηση σε επίπεδο γλώσσας μηχανής) την ίδια μνήμη που "κάθεται" ο δείκτης. Στη πραγματικότητα η Javascript όπως και η Python, θα περάσουν σε νέα μνήμη το αντίγραφο του δείκτη της Α και έτσι αν το Β αλλάξει δείκτη, αυτός ο δείκτης δεν θα γραφτεί και στην μνήμη του Α, και αυτό είναι by value πέρασμα δείκτη αντικειμένου.