Σύστημα modules
Οργανώστε τον κώδικα σε modules με ρητά imports και έλεγχο namespace.
Σύστημα Modules
Η Sounio οργανώνει τον κώδικα σε modules. Ένα αρχείο μπορεί να δηλωθεί ως module με μια ρητή δήλωση module, ή να παραμείνει στο επίπεδο namespace αν δεν υπάρχει δήλωση.
Δήλωση module
// file: ir/profile.sio
module ir::profile
fn sprof_parse(data: &str) -> SprofProfile {
// ...
}
fn sprof_lookup(profile: &SprofProfile, name: &str) -> i64 {
// ...
}
Η δήλωση module ir::profile τοποθετεί όλους τους ορισμούς αυτού του αρχείου κάτω από το namespace ir::profile.
Εισαγωγή από modules
Χρησιμοποιήστε use για να φέρετε ονόματα στο πεδίο ορατότητας:
// Wildcard import — brings all public names into scope
use ir::profile::*
// The functions are now available directly
let profile = sprof_parse(data)
let count = sprof_lookup(profile, "main")
Υποστηρίζονται επίσης επιλεκτικές εισαγωγές:
use ir::profile::{sprof_parse, sprof_lookup}
Σημαντικό: Τα wildcard imports (use module::*) είναι προς το παρόν πιο αξιόπιστα από τις επιλεκτικές εισαγωγές για modules που έχουν εσωτερικές βοηθητικές συναρτήσεις. Ορισμένοι εσωτερικοί helpers μπορεί να αποτύχουν να επιλυθούν με επιλεκτικές εισαγωγές — προτιμήστε wildcard σε περίπτωση αμφιβολίας.
Αρχεία επίπεδου namespace
Τα αρχεία χωρίς δήλωση module βρίσκονται στο επίπεδο namespace. Οι ορισμοί τους είναι διαθέσιμοι απευθείας σε οποιοδήποτε αρχείο μπορεί να τα δει, χωρίς ρητή δήλωση use:
// file: ir/normalize.sio
// (no module declaration)
fn normalize_instruction(instr: &!IrInstr) {
// available without import in other flat-namespace files
}
Αρχεία όπως τα normalize.sio, const_prop.sio, dce.sio και ssa.sio στον self-hosted compiler χρησιμοποιούν αυτό το pattern.
Κανόνες επίλυσης modules
- Ένα αρχείο με
module X::Yπρέπει να εισαχθεί μεuse X::Y::*ήuse X::Y::{name}. - Ένα αρχείο χωρίς
moduleβρίσκεται στο επίπεδο namespace — τα ονόματά του είναι ορατά χωρίς εισαγωγές. - Δεν υποστηρίζονται forward references: οι βοηθητικές συναρτήσεις πρέπει να ορίζονται πριν από τους καλούντες στο αρχείο πηγαίου κώδικα.
- Τα paths των modules αντιστοιχούν σε paths του συστήματος αρχείων:
module ir::profileαντιστοιχεί στοir/profile.sio.
Συνδυασμός modules και επίπεδων αρχείων
Ο self-hosted compiler αναμειγνύει και τα δύο patterns:
// main.sio — uses both module and flat-namespace imports
use ir::ir::* // module import: IrFunction, IrModule, etc.
use ir::profile::* // module import: SprofProfile, sprof_parse, etc.
use ir::inline::* // module import: inl_run_pass, etc.
// normalize.sio, const_prop.sio are flat — no import needed
Πρακτικές οδηγίες
- Χρησιμοποιήστε
moduleγια βιβλιοθήκες και επαναχρησιμοποιήσιμα components με σαφή interfaces. - Χρησιμοποιήστε επίπεδο namespace για στενά συνδεδεμένα αρχεία υλοποίησης που μοιράζονται πολλούς εσωτερικούς helpers.
- Χρησιμοποιείτε πάντα
use parser::ast::*(wildcard) κατά την εισαγωγή τύπων AST — οι επιλεκτικές εισαγωγές μπορεί να σπάσουν τις συγκρίσεις τελεστών σε enum variants.