書いて覚えるSwift入門

第11回Swiftのオープンソース化

swift.isOpenSource == true

今回はProtocol Oriented Programmingを紹介する予定でしたが、ここで緊急のお知らせです。と言ってもこれが記事に反映されるのは1ヵ月以上先ではあるのですが[1]⁠、それを考慮しても予定を変更するだけの価値があるでしょう。Swiftにとってそれ自体のリリースの次に重要なニュースなのですから。

2015年12月3日(日本時間では翌4日⁠⁠、Swiftはオープンソースとして公開されました。

Swift is Open Source

  • [Swift.org⁠⁠ ‒ a site dedicated to the opensource Swift community
  • Public source code repositories at ⁠github.com/apple]
  • A new Swift package manager project for easily sharing and building code
  • A Swift-native core libraries project with higher-level functionality above the standard library
  • Platform support for all Apple platforms as well as Linux

抄訳すると、次のとおりです。

  • オープンソースSwift専用サイト、⁠Swift.org]の開設図1

    図1 Swift.org
    図1 Swift.org
  • GitHubにおけるソースコード公開図2

    図2 github.com/apple
    図2 github.com/apple
  • Swiftパッケージマネージャープロジェクト開始

  • Swiftネイティブ標準ライブラリ以上の高機能ライブラリプロジェクト開始

  • すべてのAppleデバイスに加え、Linuxのサポート

クリスマスを待たずして、公約は果たされたわけです。

Swift on Linux:Getting Started

オープンソースとなった意義はこの後じっくり吟味するとして、まずは実際に試してみましょう。もちろんオープンソースだけあって、図2のWebページの解説に従ってソースからビルドしても良いのですが、引数なしのデフォルトのutils/build-scriptをそのまま実行すると、16GBのメモリ、64GB程度の空き容量が必要でした。仮想マシンだとちょっと荷が重い。-Rをつけてデバッギングシンボルなしのリリースビルドだとそこまでリソースは食わないのですが、幸いにしてビルド済みのbinary snapshotをAppleが用意してくれているので今回はそれを利用することにします。

用意するもの

64-bit版のUbuntu 14.04 LTSまたはUbuntu 15.10

いずれはもっと多くのプラットフォームでサポートさせるはずですが、執筆現在、Mac以外のプラットフォームで正式サポートされているのはLinuxそれもUbuntuだけです。とはいえオープンソースなプラットフォームとしては最も普及しているものでもあり、導入の敷居は低いでしょう。GUIは含まれていないのでデスクトップ版ではなくサーバ版でもかまいませんし、仮想マシンでもかまいません。筆者はVMware FusionでRAM 2GB、仮想ディスク16GBの仮想マシンで動かしています。

clangのアップデート(14.04 LTSのみ)

Ubuntu 15.10では不要のようです。

$ sudo apt-get install clang-3.6
$ sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-3.6 100
$ sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-3.6 100

ダウンロード

あとは、図2のWebページからLatest Development Snapshotをダウンロードし、適当なところに解凍すれば準備完了です。ここでは配布物全体を̃/swiftに置いています。全部で90MB弱。clangなどが含まれていないとはいえ、意外とコンパクトです。

$ wget https://swift.org/builds/ubuntu1404/swift-2.2-SNAPSHOT-2015-12-01-b/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz
$ tar zxvf swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz
$ mv swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04 ̃/swift

なお、Tarballは執筆現在のものであり、本稿が読者の皆さんに届くころには変わっている可能性があるのでご注意を。

REPL

それでは、早速ターミナルから、

$ ̃/swift/usr/bin/swift

と叩けば、REPLが起動します。フルパスが面倒なら、

$ export PATH=$HOME/swift/usr/bin:$PATH

などで̃/swift/usr/binをパスに追加しておけば、swiftだけでOKです。

Rubyにおけるirbや引数なしのpythonを実行したのと同様に、対話的にSwiftを使うことができます図3⁠。

図3 Linux上で動くSwift
図3 Linux上で動くSwift

Tips

このREPL、irbやインタラクティブモードのpythonと比べると、少しモダンになっています。

関数/メソッド補完

そのひとつは、関数やメソッドを補完してくれることです。たとえば1.と打った後で[Tab]を打つと……、

  1> 1.
Available completions:
  advancedBy(n: Distance) -> Int
  advancedBy(n: Int, limit: Int) -> Int
  bigEndian: Int
  byteSwapped: Int
  description: String
  distanceTo(other: Int) -> Distance
  hashValue: Int
  littleEndian: Int
  predecessor() -> Int
  stride(through: Int, by: Distance) ->
StrideThrough<Int>
  stride(to: Int, by: Distance) ->
StrideTo<Int>
  successor() -> Int
  toIntMax() -> IntMax
  1> 1.successor()
$R0: Int = 2

...Intのインスタンスメソッドが表示されますし、さらにsuと打って[Tub]tを打つと、.successor()まで補完してくれます。

ブロック編集のサポート

SwiftのREPLのヒストリーは、行単位ではなくブロック単位です。たとえば、

  1> (1...10).reduce(0) {
  2. $0 + $1
  3. }
$R0: Int = 55

この状態で[↑]キーを押すと、3行に渡るこのブロックが丸ごと再表示されます。reduce(0)reduce(1)に、$0 + $1を$0 * $1に編集して、最後に}の後ろまでカーソルを移動してから[Enter]キーを押すと……、

  4> (1...10).reduce(1) {
  5. $0 * $1
  6. }
$R1: Int = 3628800

となります。ブロックの終了、つまり}以前にリターンした場合、そのまま行挿入もできます。

import Glibc

Swiftは強力な言語です。しかしPerlやPythonやRubyなどのスクリプト言語と異なり、生のSwiftは三角関数を1つサポートしていません。

  7> let pi = -2 * atan2(-1, 0)
repl.swift:7:15: error: use of unresolved
identifier 'atan2'
let pi = -2 * atan2(-1, 0)

新規playgroundで、iOSならimport UIKitOS Xならimport Cocoaという「呪文」が最初から入っているのは、そのためです。残念ながらLinux版のSwiftにはまだplaygroundはないのですが、Linuxでは何をインポートするのがそれに相当するのでしょうか?

import Glibcだそうです。連載第7回で筆者が予想したimport POSIXではなく。

  7> import Glibc
  8> let pi = -2 * atan2(-1, 0)
pi: Double = 3.1415926535897931

これを#ifと組み合わせると、クロスプラットフォームなSwiftコードが書けそうです。リスト1のコードは、Linuxと OS X双方でchmod+xしたうえでスクリプトとして実行可能で、swiftc pi.swiftでコンパイルしても動くことを確認しました。

リスト1 pi.swift
    #!/usr/bin/env swift
    #if os(OSX)
    import Cocoa
    #elseif os(iOS)
    import UIKit
    #elseif os(Linux)
    import Glibc
    #endif
    let π = -2 * atan2(-1.0, 0.0)
    print("π = \(π)")

あらためて、オープンソースであるということ

公約どおり、Swiftはオープンソースとなりました。ここで2つの疑問が湧いてきます。

  • なぜ、オープンソースにしたのか?
  • なぜ、はじめからオープンソースにしなかったのか?

この2つの疑問に対し、連載第7回時点の筆者はこう答えています。

食えなきゃ誰も食ってくれない。オープンでなければ、誰も食いつづけてくれない。

WWDC2014におけるデビューからわずか1年半、iOSとOS Xのリリースサイクルわずか1回分で、SwiftはiOSアプリ開発における第一言語となっています。オープンソースとなる前から、⁠食える言語」という地位は、すでに確立したわけです。しかし、Xcode以外の実装を持たなかったSwiftは、真の意味での汎用言語ではありませんでした。⁠どんなプログラムでも書ける」では汎用言語としては十分ではありません。⁠どんなプラットフォーム上でも」も成立して、はじめて汎用と呼べるのです。オープンソース化は、そのための最短距離でもあります。Apple自身はLinux、それもUbuntuしか現時点でサポートしていませんが、リリースから1日も経たずして、すでにGitHubでは他のプラットフォームへの移植が雨後の筍のように始まっています。⁠言語の普及競争において、Swiftほど高いオッズを持つ言語が見当たりません」と連載第7回時点で筆者は言いましたが、オープンソース化の公約を果たした今、オッズはさらに高まったのは確かでしょう。

Appleプラットフォームとは無縁だった読者も、今後本連載はスルーできなくなったのではないでしょうか。

Software Design

本誌最新号をチェック!
Software Design 2022年9月号

2022年8月18日発売
B5判/192ページ
定価1,342円
(本体1,220円+税10%)

  • 第1特集
    MySQL アプリ開発者の必修5科目
    不意なトラブルに困らないためのRDB基礎知識
  • 第2特集
    「知りたい」⁠使いたい」⁠発信したい」をかなえる
    OSSソースコードリーディングのススメ
  • 特別企画
    企業のシステムを支えるOSとエコシステムの全貌
    [特別企画]Red Hat Enterprise Linux 9最新ガイド
  • 短期連載
    今さら聞けないSSH
    [前編]リモートログインとコマンドの実行
  • 短期連載
    MySQLで学ぶ文字コード
    [最終回]文字コードのハマりどころTips集
  • 短期連載
    新生「Ansible」徹底解説
    [4]Playbookの実行環境(基礎編)

おすすめ記事

記事・ニュース一覧