LLVMとSwift
LLVMやClangへのコミットがどうSwiftに繋がるのでしょうか?AppleはLLVMとClangによって作り上げた環境を、Swiftでもやりなおしたわけではありません。実はSwiftもObjective-Cと同じくLLVM上で動作するのです。なぜそんなことが可能なのでしょうか。秘密はLLVMの仕組みにあります。
LLVMでは以下のようにソースコードをマシン語に変換し実行します。
ソースコード -> フロントエンド -> LLVM Optimizer -> バックエンド -> マシン語
ざっくり説明すると、ClangやGCCなどのフロントエンドがソースコードを受け取り、最適化を施しバックエンドに送った上で最終的にマシン語に変換されて実行されます。ここで、フロントエンドとLLVM Optimizer、LLVM Optimizerとバックエンドの間はそれぞれLLVM IR(Intermediate Representation)という形式でやりとりされます。ここまでで勘の良い方は気づいたと思いますが、フロントエンドさえ別の言語に対応すれば他の言語もLLVMで動かすことができる設計になっています。実際、GCCでコンパイルできるAdaやFortranのような言語をLLVMで動作させることができます(LLVMプロジェクト内のDragonEggを参照してください)。つまり、SwiftはLLVMの新しいフロントエンドとして実装されているということです。
公式に詳しく紹介されているわけではありませんが、コンパイラのオプションなどから以下のようにLLVM IRにコンパイルされることがわかります。
ソースコード -> Swift AST -> SIL -> LLVM IR
ソースコードはまず、Swift Abstract Syntax Tree(AST)に変換されます。次にSwift Intermediate Language(SIL)に変換され、Swift向けの最適化を施した後にLLVM IRへと変換されLLVM Optimizerに送られます。なお、これらの中間状態はSwiftコンパイラから直接取り出すことも可能です。コンパイラのヘルプ(xcrun swiftc -help)を見ると出力の仕方がわかりますので、興味のある方は是非試してみてください。
このようにSwiftにおいてもLLVMの技術は深く関わっています。SwiftではObjective-Cと共存できたりCを直接使ったりすることができますが、そういったことができるのも共通の基盤としてLLVMがあるからこそです。そのおかげでObjective-Cのプログラマは少し勉強すればSwiftを使いこなせるようになりますし、Swiftへの移行が非常に緩やかに実現できます。これこそまさにAppleの技術選択が非常にうまくはまっていることを示す良い例だと言えます。
まとめ
Appleのコンパイラ関連技術の歴史を紹介し、Swiftがその恩恵を強く受けた言語であることを紹介しました。その歴史を踏まえてSwiftを見てみると、Appleが自分たちのプラットフォームのためのプログラミング言語を新しく作ることがそれほど突飛な発想でないことがわかるとおもいます。
Swiftの登場当時、筆者の周りではその魅力的な仕様とは裏腹に「これに移行して大丈夫なのか」や「いつかAppleが強制的にSwiftに移行しろと言いだす」のようなネガティブな声が聞こえていました。登場があまりに突然だったことも少なからず影響していることでしょう。しかし、Swiftは決してAppleの思いつきでリリースされたようなものではなく、長年積み重ねてきた技術の結晶です。
WWDC 2015ではSwift 2が発表されました。いくつかの構文やエラーハンドリングの追加に留まらず、Swiftをより使いやすくするためにObjective-Cにジェネリクスのサポートまで追加されており、正にAppleがSwiftに本気で取り組んでいることが見て取れます。
また、Keynoteで2015年末ごろSwiftがオープンソースプロジェクトになると発表された瞬間こそ、その日会場から最も高い歓声が上がった瞬間でした。Swiftの進化そのものだけでなく、開発者コミュニティの熱の高さにも驚きます。オープンソース化に伴いLinuxのサポートの追加も発表されているので、ますます利用される領域も増えていくでしょう。
筆者にはこれからのSwiftとそのコミュニティが楽しみでなりません。
