書いて覚えるSwift入門

第7回Swiftが愛される理由

WWDC15で得られたものは何か?

前回と今回の間に、WWDC15がありました[1]⁠。素人的には、⁠見るべきものがなかった」前回以上に「つまらない」WWDCだったかもしれません。前回同様、新ハードウェアの発表はゼロ。Mac OS Xと iOSのバージョンが1つずつ上がるのはいつもどおり。しかもOS X v10.11の名前El Captanは、Mac OS Xの名前の由来であるYosemiteの中の地名。命名的には、Mac OS Xv10.5 LeopardとMac OS X v10.6 Snow Leopardより変化に乏しいと言えなくもありません。

その「素人的にはつまらなかった」前回が、⁠玄人的にはサイコー」だったのは、新言語Swiftの発表に尽きるでしょう。それからわずか1年で、Stack OverflowのDeveloper Surveyで「最も愛される開発言語図1⁠」の座を射止めました

図1 Stack OverflowのDeveloper Surveyより
図1 Stack OverflowのDeveloper Surveyより

しかし、現時点において、Swiftで開発できるソフトウェアはMac OS XとiOSという、わずか2種類のプラットフォームのみ。⁠Watch OSもあるではないか」という意見もありますが、Apple WatchがiPhoneを必須とするのと同様、Watch OSが現時点でiOSを必須とする以上、ひいき目に見ても対象プラットフォームは3ではなく2.5といったところでしょう。しかもすべてApple製ハードウェア上でしか動かない。あくまで現状は「Apple帝国公用語」であって、⁠ギークの共通言語」ではないのです。

Appleは、それが半年後に変わることを公約しました。

Swiftは2015年末にオープンソースソフトウェアになるのです。

Appleの公約

WWDC15でAppleが公約したのは、次のとおりです

  • SwiftのソースコードがOSI認可のpermissiveなライセンスのもとで公開されること
  • Apple自身がMac OS X、iOSに加えLinuxポートを寄贈する所存であること
  • ソースコードにはSwiftコンパイラおよび標準ライブラリが含まれていること

本連載第0回で、筆者はこう書きました。

口上だけみると、SwiftはiOS/OS Xアプリケーション開発専用に見えますが、専用にしておくにはもったいないほどよくできた言語で、学べば学ぶほど汎用向けの言語であることが明らかになってきます。Swiftをオープンソース化するつもりがあるかをAppleはつまびらかにしていませんが、同社のオープンソース戦略、とくにLLVMへのコミットメントを考えるとその可能性は低くないと筆者は考えています

予言というより願望だったのですが、それが成就したといってもよいでしょう―このSwiftの沿革は、Objective-Cのそれと比べると実に興味深い。

Back to the Future

Swiftの登場まで「Apple帝国公用語」だったObjective-Cは、

  • クロスプラットフォームな
  • C言語上位互換の
  • オブジェクト指向言語

として誕生しましたが、

  • NextSTEPで採用された以外は、⁠gccに標準サポートされているにもかかわらず)他プラットフォームではあまり採用されず
  • NeXT社のAppleによる買収―という形をとった、Steve Jobsによる「大政奉還」―にともなって、Mac OS Xの事実上の標準開発言語となり
  • それがiPhone OS、後のiOSにも引き継がれ
  • 事実上のAppleプラットフォーム専用言語

となって今にいたっているわけですが、Swiftは

  • Mac OS XおよびiOS専用言語として生まれ
  • 事実上どころか公式のAppleプラットフォーム第1言語(Lingua Prima)となった後
  • オープンソース化とクロスプラットフォーム化がなされる

というわけでObjective-Cの歴史を逆再生しているようです。それも20倍速ぐらいで。

Appleはなぜそうしたのでしょう?

後出しジャンケンは勝ってなんぼ

21世紀において、電脳言語というのは、はじめからクロスプラットフォームかつオープンソースとして公開されるのが常識になってきています。Mozilla Foundationが公開したRustしかり、Googleが公開したGoしかり。PerlやPythonやRubyは前世紀どころか「オープンソース」という言葉が生まれる前からそうでしたし、それらの言語の成功が、⁠言語はオープンソースが当たり前」という現況の原動力になったのはたしかでしょう。

しかし悲しいかな、言語が普及するにあたって最も重要なのはオープンソースであることではないのです。RustとGoを比較してもそれはわかります。言語としてより先進的なのはどう見てもRustで、SwiftもRustから多くの特長を取り入れています。しかしどちらがより使われているかといえば、Goのほうでしょう。なぜか?

ライフワーク(life work)ならぬ「ライスワーク(rice work⁠⁠、つまりその言語を学ぶことで日々の糧を得ることがより容易だからです。普及した言語におよそ例外は見当たりません。COBOLとFORTRANの時代から、数多の言語が群雄割拠する現在に至るまで。思い起こせば、Java、正確にはJavaの生みの親であるSun Microsystems(以降Sun略記)による標準のJDKもオープンソース化されたのは、1995年から11年後の2006年。しかもJDKの「ほとんど」であってすべてではありませんでした。

言語を普及させるのに、オープンソースであることは必須ではないのです。

それではなぜ、Appleはオープンソース化に踏み切ることにしたのでしょうか?

主導権を握り続けるためだ、と筆者は考えています。

Javaの事例は、格好の反面教師となっています。SunがJDK―の全部ではなく大部分―をオープンソース化した2006年、Sunはかつて誇っていた主導権をさまざまな分野で失っていました。サーバはLinuxに押され、もともとJavaが狙っていたシンクライアントの分野は分野そのものがテイクオフしたとは言い切れず……Javaのオープンソース化は同社の起死回生の一手(の一環)でしたが、結局同社はそれから4年後の2010年、Oracleによって買収されたのは読者のみなさんもご存じのとおりです。

そのJavaの本来の目的に最も忠実なのは、Androidでしょう。Javaの深慮遠謀はスマートフォンによって花開いたわけですが、その果実がもたらされる前に生みの親はなくなってしまいました。その「最も成功したJava」であるAndroidのJavaが、⁠それは本物のJavaじゃない、勝手に使うな」とばかりにSunを買収したOracleに訴えられているにいたってはもう何がなんだかです。

食えなきゃ誰も食ってくれない。

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

よって、まずは食える言語としての地位を確立しておき、まだ主導権がある内にオープンにする。

それが、Swiftに対するAppleの基本戦略だったと弾言できます。

歴史の教訓によく学んだ、悪く言えば見事な後出しジャンケンと言えるでしょう。

それだけに、負けるわけにはいかない。

言語の普及競争において、Swiftほど高いオッズを持つ言語が見当たりません。

Swift2「後方互換性? なにそれおいしいの?」

ところで、オープンソース化されるSwiftは、Version 2以降のものになります。で、このSwift2、Swift1のコードはほとんどそのままでは動きません

「後方互換性? なにそれおいしいの?」とばかりの改変がもりだくさんです。

たとえばprintln()print()`print()のみになり、改行の有無を2番目の引数appendNewline: Bool = true(つまりただのprint()はSwift1のprintln()と等価)という変更だけみても、⁠ひょえぇぇ」です。Python2とPython 3の違いに匹敵する違いがあります。

その代わり、Swift 2の現時点における唯一の実装、Xcode 7 betaにはコンバータが付いています(これもPythonっぽい⁠⁠。Swift 1のプロジェクトをSwift 2に変換してくれるのですが、試しにswift-complexを食わせてみたところ、手による修正ゼロでコンバートできました図2、図3、図4⁠。同プロジェクトはプロトコル、ジェネリクス、演算子定義といったSwiftの特長をめいっぱい活用したプロジェクトであることを考えると、まさに驚き桃の木もといリンゴの木。

図2 コンバート開始
図2 コンバート開始
図3 変更点が指摘される
図3 変更点が指摘される
図4 いっきに修正、手ずからの作業はゼロ
図4 いっきに修正、手ずからの作業はゼロ

ただし、Swift 2の言語仕様は、執筆現在においてリリースノートのみ。Swift 0→Swift 1のころの変更の激しさを思い起こすと、βが取れるまではかなり頻繁な変更が予想されます。Swift 2への移行は正式版が出た後で、ただしSwift 2正式化以後はSwift 1の後方互換性サポートも捨てるのがよさそうです。筆者がGitHubに上げているプロジェクトはそうするつもりです。

import POSIX // ???

今回はほとんどコードが出てきませんでした。いや、政治も立派なcode(法)ではあるのですが、Swiftのソースコードが出ていなかったのはたしかです。というわけで1つだけ。

Appleのいうところの「標準ライブラリ」とはいったい何を指すのでしょう?

同社の文化と沿革から考えて、FoundationIOKitまでそこに含まれることは考えがたい。現在「最低限*nix的なAPI」は、Darwinという名前でこれはオープンではあるけれど標準とは言い難い。というわけで今から予想しておくとそれはPOSIXという名前になるのでないでしょうか。

import POSIX // write once, run everywhere

この予測が当たるかどうか、半年後が今から楽しみです。

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の実行環境(基礎編)

おすすめ記事

記事・ニュース一覧