翻訳の対象範囲は一部です。完全な技術リファレンスは英語の原文を参照してください。 英語版を見る →

Module System

Organize code into modules with explicit imports and namespace control.

モジュールシステム

Sounioはコードをモジュールで整理します。ファイルは明示的な 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 宣言により、このファイル内のすべての定義が ir::profile 名前空間に配置されます。

モジュールからのインポート

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}

重要: ワイルドカードインポート(use module::*)は、内部ヘルパー関数を持つモジュールに対しては、選択的インポートより信頼性が高いです。一部の内部ヘルパーは選択的インポートでは解決に失敗する場合があります。迷った場合はワイルドカードを使用してください。

フラット名前空間ファイル

module 宣言のないファイルはフラット名前空間に属します。その定義は、明示的な 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 などのファイルがこのパターンを使用しています。

モジュール解決ルール

  1. module X::Y を持つファイルは、use X::Y::* または use X::Y::{name} でインポートする必要があります。
  2. module のないファイルはフラット名前空間に属し、インポートなしで名前が参照可能です。
  3. 前方参照はサポートされていません。ヘルパーはソースファイル内で呼び出し元より前に定義する必要があります。
  4. モジュールパスはファイルシステムパスに対応します。module ir::profile は ir/profile.sio に対応します。

モジュールとフラットファイルの組み合わせ

セルフホストコンパイラでは両方のパターンを混在させています:

// 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 を使用してください。
  • 多くの内部ヘルパーを共有する密結合な実装ファイルにはフラット名前空間を使用してください。
  • AST型をインポートする際は常に use parser::ast::*(ワイルドカード)を使用してください。選択的インポートはenum variantの演算子比較を壊す可能性があります。