Swiftコンパイラ超入門
今回は、Swiftから LLVM IR に変換する際に使用される Swift Compiler について簡単にまとめてみようかと思います。
ここら辺の低レイヤーの部分は今まではあまり触っていませんでしたが、知識として持っておくことで、Xcode が暗黙的に行っている作業が理解できるようになり、Swift を使ったアプリケーションまたは、Framework・Library の開発がよりスムーズに行えるようになるかと思われます。
書くこと
Swiftコンパイラ概要
As a whole, the Swift compiler is principally responsible for translating Swift source code into efficient, executable machine code. However, the Swift compiler front-end also supports a number of other tools, including IDE integration with syntax coloring, code completion, and other conveniences.
参照: https://swift.org/swift-compiler/#compiler-architecture
公式ドキュメントにもある通り、SwiftコンパイラはSwiftで書かれたコードを最適化してマシンコードに変換する責任があります。また、コンパイラのフロントエンドでは、構文の色付けやコード補完など、便利なIDE統合機能など他の多くのツールもサポートしているようです。コンパイラは C++ で書かれていて、Apple が管理する OSS として提供されています
LLVMとは?
コンパイル時、リンク時、実行時などあらゆる時点でプログラムを最適化するよう設計された、任意のプログラミング言語に対応可能なコンパイラ基盤である
コンパイラにはフロントエンド、バックエンドがあり(ミドルエンドが存在する場合ある)、LLVM をバックエンドのコンパイラとして用いることが主流になっています。また、バックエンドは中間言語や各アーキテクチャに対する多くの最適化を行う必要があり、LLVM は強力な型システム、制約により高度な最適化を提供します。
また、フロントエンドには、Clang, GCC などがあり、C や Objective-C などの API を Swift API にマッピングするために、Clang などが使用されています。
Swiftコンパイラのアーキテクチャ
Parsing(構文解析)
Parser は、単純な再帰下降構文解析 です。Parser は、セマンティック情報や型情報なしで 抽象構文木(AST) を生成し、入力ソースの文法上の問題に対して警告またはエラーを発行します。
Semantic analysis(意味解析)
解析された AST を取得し、Parser では解決できなかった変数などの参照の解決、型推論、型検査などを行います。また、ソースコードの Semantic 問題に対して警告や Error を発行します。
Clang importer
Clang modules をインポートし、エクスポートする C、Objective-C API を対応する Swift API にマッピングします。また、結果としてインポートされた AST は、semantic analysis によって参照できます。
SIL generation(SIL生成)
The Swift Intermediate Language (SIL) is a high-level, Swift-specific intermediate language suitable for further analysis and optimization of Swift code.
参照: https://swift.org/swift-compiler/#compiler-architecture
SIL(Swift Intermediate Language)は、Swiftコードのさらなる分析と最適化に適した高レベルのSwift固有の中間言語です。これにより、ASTとコード生成の役割を減らすことができます。
SIL 生成フェーズは、タイプチェックされた AST を "raw" SIL に下げます。
SIL guaranteed transformations
初期化されていない変数の使用など、プログラムの正確性に影響を与える追加のデータフロー診断を実行します。これらの最終的な結果は "canonical" SIL です。
SIL Optimizations
- 実装ディレクトリ
プログラムに対して追加の高レベルのSwift固有の最適化を実行します。
LLVM IR Generation
LLVM IR は、LLVM 内部で用いられる中間表現のことです。
IR generation は、SIL から LLVM の API を利用して LLVM IR を生成します。その時点で、LLVM はそれらを最適化してマシンコードを生成できるようになります。
また、Apple は以前から LLVM で実装された Clang の開発に関わっており、Swift の IR 生成を行うにあたり、LLVM自体にも拡張を施しているそうです。
参考
- https://swift.org/swift-compiler/#compiler-architecture
- https://qiita.com/demmy/items/f08a65298d2f2caf1360#ir%E7%94%9F%E6%88%90
- http://llvm.org/docs/LangRef.html#introduction
- https://github.com/apple/swift
- https://ja.wikipedia.org/wiki/Clang#:~:text=Clang%20(%5B%CB%88kl%C3%A6,%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%83%89%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82