Swift 4.2 日本語化計画 : Swift 4.2
コンパイラと標準ライブラリ
メインの Swift リポジトリ には、Swift コンパイラと標準ライブラリのソースコード、および SourceKit (IDE 統合用)、Swift 回帰テストスイート、および実装レベルのマニュアルなどの関連コンポーネントが含まれています。
コンパイラのアーキテクチャ
全体として、Swift コンパイラは、Swift ソースコードを効率的かつ実行可能なマシンコードに変換することに主に責任があります。ただし、Swift コンパイラのフロントエンドはまた、シンタックスカラーリング、コード補完などの便利な機能を備えた IDE 統合環境など、さまざまなツールもサポートしています。この文書では、Swift コンパイラの主要コンポーネントのハイレベルな説明をします。
- 構文解析:解析は、統合された、手でコード化されたレクサーを持つ単純な、再帰的に下降するパーサー (lib/Parse で実装されています) です。解析は、セマンティック (意味的) または型情報なしの抽象構文木 (AST) を生成し、入力ソースに関する文法上の問題の警告またはエラーを出力する責任があります。
- 意味 (セマンティック) 解析:意味解析 (lib/Sema で実装されています) は、解析された AST を取り出し、完全に型チェックされた AST 形式に変換し、ソースコード内の意味問題に関する警告またはエラーを出力します。意味解析には型推論が含まれ、成功した場合には、結果の型チェックされた AST からコードを生成することが安全であることが示されます。
- Clang 移入機:Clang 移入機 (lib/ClangImporter で実装されています) は Clang モジュール を移入し、対応する Swift API に移出した C または Objective-C API をマッピングします。得られた、移入された AST は、意味解析によって参照することができます。
- SIL の生成:Swift Intermediate Language (SIL、Swift 中間言語) は、Swift コードのさらなる分析と最適化に適した、高度な Swift 固有の中間言語です。SIL 生成相 (lib/SILGen で実装されています) は、型チェックされた AST をいわゆる "生の" SIL に下げます。SIL の設計は、docs/SIL.rst に記述されています。
- SIL保証変換:(lib/SILOptimizer/Mandatory で実装された) SIL 保証変換は、プログラム (初期化されていない変数の使用など) の正しさに影響を与える追加のデータフロー診断を実行します。これらの変換の最終結果は、"標準的な" SIL です。
- SIL の最適化:SILの最適化 (lib/Analysis、lib/ARC、lib/LoopTransforms、および lib/Transforms で実装されています) は、(例えば) 自動参照カウントの最適化、非仮想化、汎用特殊化を含む、追加の高レベルな、プログラムへの Swift 固有の最適化を実行します。
- LLVM IR の生成:IR の生成 (lib/IRGen で実装されています) は SIL を LLVM IR に下げます。この時点で、LLVM は SIL を最適化し、マシンコードを生成し続けます。
標準ライブラリの設計
Swift の標準ライブラリには、基本的なデータ型 (例えば、Int、Double など)、コレクション (例えば、Array、Dictionary など)、それらを操作するアルゴリズム、文字と文字列、低レベルのプリミティブ (例えば、UnsafeMutablePointer) のような、さまざまなデータ型、プロトコルおよび関数が含まれています。標準ライブラリの実装は、Swift リポジトリ 内の stdlib/public サブディレクトリにあり、このサブディレクトリは、さらに以下のように細分化されています。
- 標準ライブラリのコア:すべてのデータ型、プロトコル、関数などの定義を含む標準ライブラリのコア (stdlib/public/core で実装されています)。
- 実行時環境:言語サポート実行時環境 (stdlib/public/runtime で実装されています)。これは、コンパイラとコアの標準ライブラリの間に階層化されています。これは、キャスト (例えば:as! および as? 演算子)、型メタデータ (汎用および反映をサポートするため)、およびメモリ管理 (オブジェクト割り当て、参照カウントなど) などの言語の多くの動的機能を実装する責任があります。上位レベルのライブラリとは異なり、実行時環境は主に C++ または (相互運用性のために必要な場合) Objective-C で書かれています。
- SDK オーバーレイ:Apple プラットフォームに特化して、SDK オーバーレイ (stdlib/public/SDK で実装されています) は、Swift へのマッピングを改善するために、既存の Objective-C フレームワークに Swift 固有の追加と修正を提供します。特に、Foundation オーバーレイは、Objective-C コードとの相互運用性をさらにサポートします。
Swift の標準ライブラリは Swift で書かれていますが、スタック内の最下位の Swift コードであるため、他の Swift コードがビルドされれているコアデータ型を実装するため、通常の Swift コードとは少し異なります。その違いのいくつかは以下のとおりです。
- コンパイラ組み込み関数へのアクセス:Builtin モジュールのみが一般的に標準ライブラリにアクセス可能で、コンパイラ組み込み関数 (例えば SIL 命令を直接作成するため) やデータ型 (例えば "生" ポインタ、プリミティブな LLVM 整数型) を提供し、これらは Swift のプログラミングにとって基本的なデータ型を実装するのに必要です。
- 視認性はしばしば慣例によって管理される:標準ライブラリ宣言は、標準ライブラリがコンパイルされ、最適化される方法のために、一般的に好きであるよりも大きな視認性を必要とすることがよくあります。たとえば、private 修飾子は決して使用されません。さらに重要なのは、パブリックなインターフェイスの一部として意図されていない場合でも、何かを public にする必要があることが一般的です。このような場合は、private API がプライベートであることを示すために先頭にアンダースコアを付ける必要があります。標準ライブラリのアクセス制御ポリシーは、docs/AccessControlInStdlib.rst にあります。
- 反復コードは gyb を使用します:gyb は、標準ライブラリで頻繁に使用されるテンプレートから反復コードを生成するための簡単なツールです。たとえば、さまざまなサイズの整数型 (Int8、Int16、Int32、Int64 など) の定義を単一のソースから作成するために使用されます。
- テストはコンパイラと密接に結合されています:標準ライブラリとコンパイラは一緒に進化し、密接に結合されています。コアデータ型 (例えば Array、Int など) での変更はコンパイラ側での変更が必要な場合があり、その逆もあります。そのため、標準ライブラリテストスイートは、コンパイラと同じディレクトリ構造内の test/stdlib および validation-test/stdlib 内に格納されています。