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より
しかし、現時点において、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 コンバート開始
図3 変更点が指摘される
図4 いっきに修正、手ずからの作業はゼロ
ただし、Swift 2の言語仕様 は、執筆現在においてリリースノート のみ。Swift 0→Swift 1のころの変更の激しさを思い起こすと、βが取れるまではかなり頻繁な変更が予想されます。Swift 2への移行は正式版が出た後で、ただしSwift 2正式化以後はSwift 1の後方互換性サポートも捨てるのがよさそうです。筆者がGitHubに上げているプロジェクトはそうするつもりです。
import POSIX // ???
今回はほとんどコードが出てきませんでした。いや、政治も立派なcode(法)ではあるのですが、Swiftのソースコードが出ていなかったのはたしかです。というわけで1つだけ。
Appleのいうところの「標準ライブラリ」とはいったい何を指すのでしょう?
同社の文化と沿革から考えて、Foundation
やIOKit
までそこに含まれることは考えがたい。現在「最低限*nix的なAPI」は、Darwin
という名前でこれはオープンではあるけれど標準とは言い難い。というわけで今から予想しておくとそれはPOSIX
という名前になるのでないでしょうか。
import POSIX // write once, run everywhere
この予測が当たるかどうか、半年後が今から楽しみです。
第1特集
MySQL アプリ開発者の必修5科目
不意なトラブルに困らないためのRDB基礎知識
第2特集
「知りたい」「 使いたい」「 発信したい」をかなえる
OSSソースコードリーディングのススメ
特別企画
企業のシステムを支えるOSとエコシステムの全貌
[特別企画]Red Hat Enterprise Linux 9最新ガイド
短期連載
今さら聞けないSSH
[前編]リモートログインとコマンドの実行
短期連載
MySQLで学ぶ文字コード
[最終回]文字コードのハマりどころTips集
短期連載
新生「Ansible」徹底解説
[4]Playbookの実行環境(基礎編)