Edited at

Swiftの通常版とオープンソース版の違いについて

More than 3 years have passed since last update.

pure Swift の言語仕様には両者の違いはないと思います。


Swift Core Libraries

Apple は Swift のコンパイラと標準ライブラリをオープンソース化すると宣言していましたが、「標準ライブラリとはどこまでを指すのか?」というのがかねてより疑問でした。

それに対して、swift.orgのSwiftのコアライブラリでは以下が標準ライブラリだと定めています。


  • データ、URL、文字セット、特化したコレクションなど一般に必要とされる型

  • ユニットテスト

  • ネットワークの基礎

  • スレッド、キュー、通知のスケジューリングおよび実行

  • プロパティリスト、アーカイブによる永続化、JSONおよびXMLの解析

  • 日付、時刻、暦の計算のサポート

  • OS固有の動作の抽象化

  • ファイルシステムの操作

  • 日付や数値のフォーマット、および言語固有のリソースを含む国際化対応

  • ユーザープリファレンス

そしてそれを実現するライブラリとして以下を挙げています。


  • Foundation

  • libdispatch

  • XCTest

Grand Central Dispatch と XCTest については特に説明は要らないと思います。

重要なのは Foundation です。上記に挙げられた Swift のコア機能のほとんどは、実際にはここで実装されています。

ただし、現在の Darwin では、


  • C でコア機能を実装する(CoreFoundation)

  • Objective-C で CoreFoundation を呼び出す(Foundation)

  • Swift 向けにエクスポートされた API を呼び出す

という手間のかかったことをしています。

Foundation から CoreFoundation の呼び出しは、両者の型に互換性があることから低いコストで呼び出せます(toll-free-bridgedという特性)。

Swift は C と Objective-C で書かれたものは自動翻訳してゼロコストで直接利用できる言語仕様のため、その利点を生かしていました。


Swift 3.0 における Foundation API の変更

名前空間があるのにNSStringのような時代錯誤なプレフィクス付きのクラス名があったり、Objective-C のコーディングガイドラインや Cocoa の命名規則に則ったstringByReplacingOccurrencesOfString()のような冗長の命名のメソッドがありましたが、それらは全てFoundationの機能を利用していたことによる制約でした。

一方で、オープンソース化に伴い、Swift 用のAPI Design Guidlinesが公開されました。こちらではシンプルで短くて明瞭な命名を是としています。

両者のギャップをどう埋めるのでしょうか?その答えとなるのが以下の提案です。

Better Translation of Objective-C APIs Into Swift

Swift 3.0 では Objective-C から Swift へクラス名やメソッド名を翻訳する際に、より Swift らしい API とするとのことです。由緒ある NS のプレフィクスも自動的に取り除かれるようになるようです。

この方針を読むに、一旦は Darwin にて Objective-C で実装し、それを Swift へ変換する、という規定路線は変わりがないということにも思えます。


オープンソース版 Swift の Foundation

ところでオープンソース版では Foundation がどうなっているのかというと、驚くべきことに CoreFoundation から Swift 自身で再実装 しています。


  • Cでコア機能を実装する(CoreFoundation)

  • SwiftでCoreFoundationを呼び出す(Foundation)

と1ステップ減ったことで、Objective-C ランタイムを必要としない Foundation となっているのです。

ただし、こちらのプロジェクトはまだ開発の初期状態であり、Swift 3.0 の一部としてリリースされる予定とされています。逆に言えば現在のオープンソース版 Swift というのは基礎部分が未完成な、成長途上の言語ということでもあります。

疑問なのは、現在の Swift のリフレクションでは Key-Value Coding や Key-Value Observing に相当する機能は実現できません。これらに依存した Foundation API(および Foundation に依存している UIKit などより上位のフレームワーク郡)はどうなるのでしょうか?

そしてやはり気になるのは、Swift 自身で書かれた Foundation が、現在の Objective-C 実装を置き換えるのか?というところです。

いずれにしても Swift のオープンソース化は、Swift 3.0 に向けた始点でしかないっぽいですね。