Η μεταφραστική κάλυψη είναι μερική. Για την πλήρη τεχνική αναφορά συμβουλευτείτε την αγγλική πηγή. Δείτε την αγγλική έκδοση →

Σύστημα 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

  1. Ένα αρχείο με module X::Y πρέπει να εισαχθεί με use X::Y::* ή use X::Y::{name}.
  2. Ένα αρχείο χωρίς module βρίσκεται στο επίπεδο namespace — τα ονόματά του είναι ορατά χωρίς εισαγωγές.
  3. Δεν υποστηρίζονται forward references: οι βοηθητικές συναρτήσεις πρέπει να ορίζονται πριν από τους καλούντες στο αρχείο πηγαίου κώδικα.
  4. Τα 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.