DedSec Project

pony — συγκεντρωτικός οδηγός — DedSec Project

pony — συγκεντρωτικός οδηγός Pony Βασική ιδέα Η Pony στηρίζεται σε actors και reference capabilities για έλεγχο shared mutable state. Μικρό εκπαιδευτικό απόσπασμα Άσκηση βασισμένη στη…

Pony

Βασική ιδέα

Η Pony στηρίζεται σε actors και reference capabilities για έλεγχο shared mutable state.

Μικρό εκπαιδευτικό απόσπασμα

actor Main
  new create(env: Env) =>
    env.out.print("Hello Pony")

Άσκηση βασισμένη στη συγκεκριμένη συμπεριφορά

Εντόπισε τον actor constructor και εξήγησε γιατί shared references απαιτούν capability rules.

Διάγνωση και όρια

Μια τυπική διόρθωση thread race δεν αντικαθιστά τους κανόνες reference capabilities της Pony.

Κάνε την άσκηση με πραγματικά δοκιμαστικά δεδομένα και με έκδοση Pony που ταιριάζει στον κώδικα. Σημείωσε μία αρχική πρόβλεψη και την πραγματική έξοδο. Για περίπλοκο ή μη διαθέσιμο runtime, παρουσίασε τη στατική ανάλυση ως τέτοια, όχι ως επιτυχημένη εκτέλεση. Δοκίμασε ξεχωριστά την κανονική περίπτωση και μία οριακή τιμή, χωρίς πραγματικά προσωπικά ή παραγωγικά δεδομένα.

Pony — Αναλυτικός οδηγός εξάσκησης

Πραγματικό αρχικό δείγμα

actor Main
  new create(env: Env) =>
    env.out.print("Hello, Ada!")

Περιβάλλον: ponyc in a Pony package directory.. Επιβεβαίωσε ότι έχεις το σωστό compiler, host ή simulator πριν θεωρήσεις την έξοδο αξιόπιστη. Για scripts με πρόσβαση σε προσωπικά αρχεία ή ρυθμίσεις, χρησιμοποίησε προσωρινά και read-only δεδομένα.

Συγκεκριμένος στόχος υλοποίησης

Φτιάξε actor με messages και private state και εξήγησε πώς reference capabilities περιορίζουν shared mutation.

Κρίσιμο λάθος που πρέπει να αναγνωρίζεις

Οι capabilities iso/ref/val έχουν αυστηρούς κανόνες· μη θεωρείς κανονικά shared mutable objects.

Pony — Διαδρομή ουσιαστικής εξάσκησης

Η εκκίνηση ενός actor

Η Pony σχεδιάστηκε γύρω από actors που επικοινωνούν με μηνύματα. Η παρακάτω απλή είσοδος δημιουργεί Main actor και χρησιμοποιεί το περιβάλλον για εκτύπωση. Το new create είναι constructor, ενώ οι συμπεριφορές που αποστέλλονται ασύγχρονα δηλώνονται με be.

actor Main
  new create(env: Env) =>
    env.out.print("hello")

Το πρόγραμμα αναμένεται να εκτυπώσει hello σε συμβατή έκδοση ponyc. Μη θεωρείς ότι η σειρά μηνυμάτων από πολλούς ανεξάρτητους actors έχει μία καθολική σειρά, επειδή ο scheduler εκτελεί τους actors ανταγωνιστικά.

Γιατί έχει σημασία η δυνατότητα αναφοράς

Η Pony δεν αρκείται μόνο σε static types. Τα reference capabilities περιγράφουν ποιος μπορεί να διαβάσει, να μεταβάλει ή να μοιραστεί μια αναφορά. Ένα val μπορεί να μοιραστεί με ασφάλεια ως immutable view, ενώ ένα ref μπορεί να επιτρέπει mutation σε κατάλληλο ownership scope. Ένα iso δηλώνει απομονωμένη αναφορά με ιδιαίτερους κανόνες μεταφοράς. Μη μεταφέρεις απλώς τα ονόματα από το borrow checker της Rust: τα μοντέλα έχουν διαφορετικούς κανόνες.

Αποστολή αντί κοινής μνήμης

Φτιάξε δεύτερο actor Counter με behavior add που δέχεται U64, ενημερώνει εσωτερικό state και στέλνει απάντηση σε actor-recipient. Ο caller δεν δικαιούται να υποθέτει ότι το state άλλαξε ήδη αμέσως μετά την αποστολή του μηνύματος. Για την αξιολόγηση χτίσε πρωτόκολλο απάντησης και όχι time.Sleep.

Πειράματα compiler

Προσπάθησε να μεταφέρεις mutable reference χωρίς τις κατάλληλες capabilities ανάμεσα στους actors. Ο type checker πρέπει να απορρίψει την ανεπίτρεπτη κοινή mutable πρόσβαση. Κατάγραψε το diagnostic και εξήγησε ποια πρόσβαση παραβιάζει το ασφαλές μοντέλο.

Κριτήρια ολοκλήρωσης

Παράδωσε μία εκδοχή με val και μία με iso όπου η μεταφορά αποδεικνύεται νόμιμη από τον compiler. Τεκμηρίωσε Pony compiler version, ακριβή μηνύματα και ποια παραδείγματα πράγματι δοκιμάστηκαν. Αν δεν διαθέτεις ponyc, πες ότι πρόκειται για στατική ανάλυση αντί για περασμένο test.