Swift 6で、新しいコンパイルモードが可能になるが、これは、カーネルやその他の低レベルコードと同様に、組み込み機器特有の制約に対応することを目的としている。Embedded Swiftは、ほとんどの言語を網羅するSwiftのフル機能のサブセットであり、値型や参照型、クロージャ型、オプショナル型、エラー処理、ジェネリクスなども対応している。
Embedded Swiftは、従来のCコンパイラに類似したコンパイルモデルで、コンパイラが既存のコードと簡単にリンクできるオブジェクトファイル(.o)を生成します。ライブラリやランタイムを移植する必要はありません。
Embedded Swiftは、Reflectionやany
型といったランタイムサポートを必要とする言語機能を無効化する。これにより、macOSやiOSアプリに必要なランタイムを配布することなく、Swiftプログラムを実行することが可能になる。Embedded Swiftは、完全なジェネリクスの特殊化や静的リンクなどのコンパイラ技術を使用して、組み込み機器での実行に適したバイナリを生成する。
具体的には、Mirror
API、プロトコル型の値、Any
や AnyObject
、メタタイプ(let t = SomeClass.Typeまたはtype(of: value)
)、およびany型の文字列化(Reflectionを使用して実現するもの)はサポートされていない。Swift Concurrencyもサポートされていないが、現在開発中だ。
Apple社によると、言語に対するこうした制限で、表現力とパワーは低下しないとのことだ。
いくつかの言語機能をオフにしているにもかかわらず、Embedded Swiftのサブセットは「フル」Swiftに非常に近く感じられ、慣用的で読みやすいSwiftコードを簡単に書き続けられるようになります。
Apple社によると、Embedded Swiftを使うことで、Playdateのような小さなコンソールで実行できる、バイナリサイズがわずか数KBのゲームを作ることが可能になる。同様に、Embedded Swiftは、産業用アプリケーションの構築において人気が高い多種多様なARMやRISC-Vマイコンをターゲットにできる。
余談だが、Apple社自身でもハードウェアの重要なコンポーネントにEmbedded Swiftを使っている。
Apple Secure Enclave Processorは、Embedded Swiftを使用しています。Secure Enclaveは、メインプロセッサーとは分離された独立したサブシステムで、機密データを安全に保つことに特化しています。
Embedded SwiftモードでSwiftコードをビルドするには、コンパイラにtarget triple、-enable-experimental-feature Embedded
フラグ、ソースファイルのセットを以下のように入力する。
$ swiftc -target armv6m-none-none-eabi -enable-experimental-feature Embedded -wmo input1.swift input2.swift ... -c -o output.o
上記の例では、対象の特定ハードウェア用に、デバイスベンダーによって提供される C または C++ SDK ライブラリをリンクすることが通例だという事実を無視している。
macOS CLI プログラムの構築にも Embedded Swift が使用できる。
xcrun swiftc hello.swift -enable-experimental-feature Embedded -wmo
現時点では、Embedded Swiftは実験段階で変更の可能性があるため、プレビューツールチェーンを使用するのが最善だ。現在、ARMチップとRISC-Vチップで32ビットと64ビットの両方がサポートされているが、将来的には新たな命令セットが追加される予定だとApple社は述べている。