この記事の要点
- Google Summer of Code(GSoC)は、新しいコントリビューターをオープンソース開発の世界に迎え入れることを目的とした長期のメンターシッププログラムで、2022 年は Swift プロジェクトが参加して 5 回目にあたります。
- 2022 年は 5 名のコントリビューターが、それぞれ担当したプロジェクトをすべて完遂しました。
- 成果は
SwiftSyntaxのセルフホスティング、型推論アルゴリズムのデバッグ出力改善、ArgumentParser のインタラクティブモード、Swift-DocC のクイックナビゲーション、Swift 向け Kafka クライアントパッケージの 5 件です。
プログラムの目的
GSoC は、メンターと組みながらオープンソースプロジェクトへコントリビューションすることで、新しい開発者をオープンソース開発に導くことを目的とした長期のメンターシッププログラムです。Swift プロジェクトはこの 2022 年の参加で 5 回目を迎えました。Amritpan、Felix、Fredrik、Kth、Sofía の 5 名がそれぞれの担当プロジェクトに取り組み、すべて成功裏に完了しています。
成果
SwiftSyntax のセルフホスティング
著者: Fredrik Wieczerkowski さん / メンター: Alex Hoppen さん
SwiftSyntax は、Swift のソースコードを Swift で表現・パース・生成するためのライブラリです。このプロジェクトでは、result builder ベースの DSL である SwiftSyntaxBuilder が改善され、API の使い勝手の問題が修正されてテストが拡充されました。
さらに、これまで gyb(Python ベースのテンプレートツール)で生成していた SwiftSyntaxBuilder のソースの一部を、SwiftSyntaxBuilder 自身を使った型安全な Swift コードへ移植しました。つまり、ライブラリが自分自身を使って自分のコードを生成するようになっています。
たとえば、次のような Swift コードを表す場合、
struct Point {
let x: Int
let y: Int
}
対応する SwiftSyntaxBuilder の DSL は、生成されるコードによく似た形で記述できます。
StructDecl(identifier: "Point") {
VariableDecl(.let, name: "x", type: "Int")
VariableDecl(.let, name: "y", type: "Int")
}
型推論アルゴリズムのデバッグ出力改善
著者: Amritpan Kaur さん / メンター: Pavel Yaskevich さん
Swift の型推論アルゴリズムは、明示的な型情報を常に書かなくてもコードを書けるようにする、開発体験の中核を担う仕組みです。制約ベースの型チェッカーとして実装されており、ソースコードから得られる型の文脈を集め、型情報が欠けている箇所について具体的な型を解決します。
このアルゴリズムは、特に不正な式を扱う際に役立つデバッグ用の出力を生成しますが、従来の出力は冗長でまとまりがなく、読み解くのが困難でした。このプロジェクトでは出力が再設計され、制約の単純化やソルバーのスコープ変更を追えるようにして、制約ソルバーがどのように型変数の束縛や関係を変えていくのかを文脈とともに明示するようになりました。型のプロパティ・単純化の過程・入れ子の制約ソルバースコープがグループ化され、視覚的にも追いやすいレイアウトになっています。
ArgumentParser のインタラクティブモード
著者: Kth さん / メンター: Nate Cook さん
swift-argument-parser は、使いやすいコマンドラインツールを Swift で手軽に作るためのライブラリです。新たに追加されるインタラクティブモードでは、入力が不足している場合にユーザーへ入力を促し、不慣れなツールでも対話的に操作を進められるようになります。ツール作者がすでに提供しているメタデータを活用するため、追加の記述はほとんど必要ありません。
$ roll --verbose --times 3
? Please enter 'sides': 6
Roll 1: 1
Roll 2: 6
Roll 3: 3
Total: 10
この機能は将来の ArgumentParser のリリースに含まれる予定です。
Swift-DocC のクイックナビゲーション
著者: Sofía Rodríguez さん / メンター: Marina Aísa さん、Franklin Schrans さん、Beatriz Magalhaes さん
この機能は、Swift-DocC で生成されたドキュメントサイト上で、Xcode の Open Quickly のようにシンボルをすばやく検索・移動できるようにするものです。主な特徴は次のとおりです。
- ファジー検索: 検索語のあいまいな一致からシンボル名を見つけられます。
- シンボルのランキング: 入力と一致箇所の長さの差、シンボル名の長さ、一致が文字列の先頭からどれだけ離れているかといった類似度の指標を使い、関連性の高い結果を上位に並べます。
- キーボード操作: キーボードショートカットだけで完結し、ナビゲーションサイドバーが折りたたまれていても検索できます。
Swift 向け Kafka クライアントパッケージ
著者: Felix Schlegel さん / メンター: Franz Busch さん
SwiftKafka は、Apache Kafka サーバーと通信するための新しい Swift パッケージです。Swift の新しい並行処理機能を活かした API を提供することを主眼に開発され、内部では C ライブラリ librdkafka を利用しつつ、その unsafe でブロッキングな API を、より安全で扱いやすい Swift の API でラップしています。
メッセージを送信する Producer は、送信時に返される message-id で対応する acknowledgement を識別でき、acknowledgements という AsyncSequence を通じて送信の成否を受け取ります。
let producer = try await KafkaProducer(
config: .init(),
logger: logger
)
let messageID = try await producer.sendAsync(
KafkaProducerMessage(topic: "topic-name", value: "Hello, World!")
)
for await acknowledgement in producer.acknowledgements {
// ...
}
メッセージを受信する Consumer は、topic と partition の組で初期化したうえで、messages という AsyncSequence からメッセージを受け取ります。
let consumer = try KafkaConsumer(
topic: "topic-name",
partition: KafkaPartition(rawValue: 0),
config: .init(),
logger: logger
)
for await messageResult in consumer.messages {
// ...
}
学び・今後
5 名のコントリビューターはいずれも担当プロジェクトを完遂し、その成果はコンパイラのデバッグ体験からライブラリ・ツール・サーバーサイドのエコシステムまで広い範囲に及びました。GSoC を通じて Swift プロジェクトが新しいコントリビューターを継続的に迎え入れていることがうかがえます。Swift プロジェクトはこうしたメンターシップに継続的に取り組んでおり、2021 Swift Mentorship Program での学びの体験でも同様の事例が紹介されています。