Swiftとは、Appleが2014年に発表した比較的新しいプログラミング言語です。Appleが発表したことから分かるように、iPhoneやiPadに搭載されているiOSやmacOSで動くプログラムを作ることができます。しかし、この人気言語がそれだけで終わることはありません。2015年にはSwiftがオープンソース化され、Linuxでも動くようになりました。今回は、モダンで高速なSwiftについて紹介します。Windowsでも仮想マシンやWSLを使うと動くので気軽に試してみましょう。

Swiftが高速である理由

その言語名の「Swift」とは英語で「速い」とか「迅速な」を意味しています。それまで、AppleはiOSやmacOS向けにアプリを作る際、Objective-Cを推奨していました。SwiftはObjective-Cよりもモダンな言語仕様を持つ言語なので、柔軟性が高く、記述もシンプルで、より素早くアプリを開発できるようになりました。また速いのは、実行速度においてもです。

SwiftのコンパイラはLLVMのフロントエンドとして開発されています。LLVMとは様々な言語をコンパイルできるコンパイラ基盤です。SwiftのコンパイラはLLVM用の中間コードを作成します。LLVMはこの中間コードを最適化して特定プラットフォームの実行ファイルを作成します。つまり、Swiftで作ったアプリが高速に実行できるのは、このLLVMのおかげというわけです。

また、AppleがiOS/macOS開発に推奨するObjective-CもLLVMのフロントエンドであり、Swiftのプログラムを従来のObjective-Cのプログラムと共存させることが可能となっています。これまでのコード資産を無駄にすることなく、新たな言語を使って開発できるように配慮されています。

  • Swiftコンパイラの仕組み

    Swiftコンパイラの仕組み

対話実行環境を持つインタプリタも用意されている

また、Swiftには対話実行環境(REPL)が備わっています。対話実行環境とは、入力したプログラムをその場で実行し結果を返すツールです。しかし、通常、対話実行環境というのは、インタプリタ言語(スクリプト言語)の専売特許であり、実行可能バイナリを生成するコンパイラにはお備わっていないことが多いものです。

ここから分かるのは、Swift開発者陣の本気度です。新しい言語というのは、普及するまでに非常に時間がかかるものです。Swiftは新しい言語なので、対話実行環境を用意して、みんなに気軽に試してもらって、その後も使ってもらおうという作戦です。実際、Swiftは非常に短期間のうちに人気言語となりました。

また、iPad専用ですが『Swift Playgrounds』というアプリも提供されています。これはiPad上でSwiftのプログラムを作成し、実行したり、みんなに共有したりできるというものです。楽しくSwiftのプログラムを学ぶことができます。

Swiftをインストールしてみよう

残念なことに、SwiftはWindowsには対応していません。しかし、Windows上に仮想マシンを用意し、その上でUbuntuなどのLinuxを動作させるなら、Swiftを利用することができます。Windows 10ならば、WSL(Windows Subsystem for Linux)を利用することで、手軽にSwiftを導入できます。

(参考記事) Windows 10にUbuntuをインストールしよう

なお、macOSの場合は、Xcodeをインストールすれば、Swiftのプログラミングが可能です。とは言え、macOSでも仮想マシンのVirtualBoxをインストールすれば、その上で、Ubuntu18.04を動かすことができます。ここでは、Ubuntu上でSwiftを使う方法を紹介します。

Ubuntu 18.04を用意したら、Swiftをインストールしましょう。コマンドラインを開き、以下のコマンドを実行します。

# インストール可能なパッケージを更新
sudo apt-get update

#コンパイラのclangをインストール
sudo apt-get install clang

# 必要なライブラリをインストール
sudo apt install clang libicu-dev libcurl4-openssl-dev libssl-dev libtinfo5 libncurses5

# Ubuntu18.04向けSwiftのアーカイブをダウンロード
wget https://swift.org/builds/swift-4.2.3-release/ubuntu1804/swift-4.2.3-RELEASE/swift-4.2.3-RELEASE-ubuntu18.04.tar.gz

# アーカイブを解凍
tar xzvf swift-4.2.3-RELEASE-ubuntu18.04.tar.gz

# 実行できるようパスに追加(~/.bashrcなどに追記)
export PATH=~/swift-4.2.3-RELEASE-ubuntu18.04/usr/bin/:$PATH

一番簡単なプログラム

それでは、Swiftで一番簡単なプログラムを作ってみましょう。以下のプログラムを「hello.swift」という名前で保存します。ちなみに、コマンドラインのUbuntu上だと、nanoというエディタが利用できます。

var msg = "Hello, World!"
print(msg)

続いて、コマンドラインから、以下のコマンドを実行すると、プログラムを実行できます。

swift hello.swift

実行すると、以下のように「Hello, World!」と表示されます。

  • 一番簡単なプログラムを実行したところ

    一番簡単なプログラムを実行したところ

フィボナッチ数列を求めるプログラムを作ってみよう

次に、もう少し複雑なプログラムを作ってみましょう。ここでは、フィボナッチ数列と呼ばれる数列を求めるプログラムを作ってみましょう。フィボナッチ数とは、1, 1, 2, 3, 5, 8, 13, 21, 55・・・のように、隣り合う二つの数(一つ前の値と、二つ前の値)を足し合わせることでできる数列のことです。

まずは、再帰処理を使って簡単に求めるプログラムを作ってみましょう。以下のプログラムをfib1.swiftという名前で保存します。

// フィボナッチ数を求める関数を定義 --- (*1)
func fib(n:Int) -> Int {
    if n < 2 { return n }
    return fib(n: n - 1) + fib(n: n - 2)
}

// 10個の値を得る --- (*2)
for i in 1...10 {
    print(fib(n:i))
}

コマンドラインから実行するには、以下のコマンドを入力します。

swift fib1.swift

すると、以下のようにフィボナッチ数列を得ることができます。

  • フィボナッチ数列が表示されたところ

    フィボナッチ数列が表示されたところ

プログラムを確認してみましょう。フィボナッチ数とは、1つ前の値と、2つ前の値を足し合わせたものです。そのため、再帰処理を使うと非常に簡潔に記述できます。(*1)の部分が、フィボナッチ数列を求める関数を定義している部分です。そして、(*2)の部分では、このフィボナッチ数列の関数を10回呼び出します。

Swiftの面白いところですが、関数を呼び出す際に、引数の名前を指定するという部分です。関数に値を渡して実行する際、『関数名(引数名: 値)』の形式で呼び出します。これにより、複数の引数がある時に、順番を間違えるというミスを防ぐことができます。

次に、フィボナッチ数列を求める関数を効率化してみます。フィボナッチ数列とは、一つ前と二つ前の値を足し合わせたものなので、その値を覚えておけば、より高速にフィボナッチ数列を求めることができます。以下のプログラムを「fib2.swift」という名前で保存しましょう。

// 前回の値を覚えておく連想配列を準備 --- (*1)
var memo = [Int: Int]()

// フィボナッチ数を得る関数 --- (*2)
func fib(n:Int) -> Int {
    if n < 2 { return n }
    // キャッシュがあるか調べる --- (*3)
    if let r = memo[n] { return r }
    // 1つ前と、2つ前の値を足す --- (*4)
    return fib(n:n - 1) + fib(n:n - 2)
}

// 10個の値を求める --- (*5)
for num in 1...10 {
    print(fib(n:num))
}

プログラムを実行するには「swift fib2.swift」のコマンドを実行します。正しく実行できたら、プログラムを確認してみましょう。(*1)の部分では連想配列を定義します。連想配列のキーと値が共に整数であることを指定します。(*2)の部分では、フィボナッチ数を計算する関数を定義します。先ほどと違うのは、(*3)の部分で、連想配列memoの値を調べている部分です。(*4)で前回と前々回の値を足し合わせたものを戻り値とします。そして、(*5)でfor構文を利用して繰り返し、10個のフィボナッチ数列を計算します。

まとめ

以上、今回は、Swiftについて紹介しました。登場当初はもっぱらiOSやmacOSなどApple製品のアプリ開発にのみ使われていました。しかし、オープンソース化されて、Linuxでも動くようになると、いろいろな場面でSwiftを使おうという動きも出てきています。高速であり、安全なプログラムを作れることから、Webアプリ開発にも使われるようになっています。今後は、Appleのアプリ開発だけでなく、さらに広く使われていくことでしょう。