
2025/12/15 5:04
Advent of Swift
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
**
著者は、Python 3.13 と互換性のあるプリビルトバイナリがないため、Void Linux 上で Swift 6.2 をソースからコンパイルして評価しています。インタープリタは単一ファイルスクリプトを高速に実行しますが、クラッシュ時のバックトレースは限定的です。デフォルトではコンパイル済みバイナリは標準ライブラリへ動的リンクし、静的リンクすると約10 MB増加します。
Swift の言語機能には、モダンな構文、optional/Result 型、Unicode 対応の
Character.wholeNumberValue、および split(whereSeparator:) などの Sequence ユーティリティが含まれます。文字列処理は完全な Unicode セマンティクスに従い、オフセットや範囲インデックスを使うと面倒になるため、著者は一部の問題でコードポイント配列を使用しました。正規表現は Ruby より約 100 倍遅く(ループ内)、ホイスト後は 3 倍遅く、またプレフィックス/サフィックス演算子は式に「貼り付け」る必要があり (if !condition は無効) ます。関数パラメータは名前付きで、可読性は向上しますが OCaml のような再順序化やカリー化はできません。コレクションは値セマンティクスを採用し、コピーオンライトと inout 最適化があります;サブストリングには専用の Substring 型があり、func parse<T>(_ str: T) where T: StringProtocol のように別途関数シグネチャが必要です。著者は swift‑algorithms ライブラリを使用せず、自前でコレクションコードを書きました。型チェックは通常のコードでは高速ですが、遅く混乱しやすいケースもあります(例:上限より下限が大きい空範囲はエラーとして致命的に扱われます)。欠落している機能には Hashable タプル(2020 年に削除)と配列/パターンマッチングがあり、利便性を低減しています。
改善された要約(必要なら):
(上記の段落。)
本文
今年はアドベント・オブ・コードを使ってSwiftを学ぶことにしました。
2025年のタスクは12日間しかなかったため、ここで体験談と解答へのリンクをまとめました。
ツールチェーン
Void Linux 上で Swift 6.2 を自前でコンパイルし、Python 3.13 が必要な lldb と互換性のあるバイナリが無かったので仕上げました。Swift のベースは clang++ だけで構築できるため、Gentoo ebuild を参考に設定を行いましたが、エンドユーザーにはそれほど関係ありません。
ツール自体はまともです:インタプリタがあり、
swift foo.swift で簡単な「スクリプト」を実行できます。起動時間が短く、手軽な実験に便利です。また REPL もあります(まだ試したことはありません)。インタプリタの欠点として、クラッシュ時に有用なバックトレースが得られない点があります。代わりにバイナリをコンパイルして lldb を使う必要がありました。swift-format が組み込まれており、デフォルトは 2 スペースですが、Swift コードの多くは 4 スペースです。単一ファイルで書くだけなので
swift-build は触れませんでした。デフォルトでは標準ライブラリを動的リンクしてコンパクトに保ちますが、静的リンクすると約 10 MB 増え、許容範囲です。
言語の感想
Swift はモダンで取り入れやすいと感じました。構文は C 系統に似ているものの Rust よりもシンボルが少なく、クロージャには Ruby スタイルのブロック構文があります。エラーハンドリングはチェック付き例外・オプショナル型・
Result で行えますし、標準ライブラリに Character.wholeNumberValue のような便利関数が揃っています。配列上の Sequence 抽象化により、split(whereSeparator:) のようなメソッドを利用できます。ドキュメントも充実しています。
文字列操作は強力ですが、Unicode を尊重するためオフセットや範囲でインデックス付けすると不便です(これは多くの場合メリットなので回避策としてコードポイント配列に変換しました)。正規表現は意外と遅い。ループ内でリテラル (
#/…/#) を使うと毎回新しいインスタンスが生成され、定数化しても Ruby より 3 倍遅くなりました。最終的に正規表現を使わない実装へ書き直しました。プレフィックス/サフィックス演算子は式に「貼り付け」る必要があるため if !condition は書けません。Swift の関数はパラメータ名(Objective‑C 互換)を多用し、可読性は高いですが OCaml のラベル付き引数ほど柔軟ではありません。
コレクションは値セマンティクスで、コピーオンライトや inout パラメータで最適化します。ガベージコレクションは参照カウントです。
Substring は専用型なので、文字列とサブストリングの両方を受け取る関数を書くにはプロトコル指定が必要です。
func parse<T>(_ str: T) -> … where T: StringProtocol
swift‑algorithms ライブラリはさらに多くのシーケンス・コレクションアルゴリズムを提供しますが、今回は使いませんでした。
欠点
- LLVM ベースなのでコンパイルは速いですが、型チェック時にエラーが遅くて混乱しやすいです。
- 型チェック以外のエラーメッセージは役立つことが多い(例:文字列に
を使ったときや空のマップに''
を渡したときの対処法を示してくれます)。[] - 範囲は inclusive (
) と exclusive (...
) があり、上限が下限より小さい範囲を作ると致命的エラーになります。ほか言語では空範囲として扱われます。..< - 「当たり前」だと思う機能が抜けている点もあります:
値のタプルはハッシュ化できず(2020 年に提案が削除され、未解決)不便です。言語は代数型・タプルでパターンマッチをサポートしますが、配列やシーケンスでは未対応で制約があります。Hashable
Swift に慣れるまで多くの情報を検索しなければならず、古いバージョンへの参照が多く、10 年以上経っても頻繁に変更があることが分かりました。言語が安定化して欲しいです。
総じて、Swift はこれらの課題で楽しく簡単に使えました。非 macOS 系ではライブラリの可用性が課題です。
NP: Adrianne Lenker—Promise is a Pendulum