Swiftは綺麗なC++である。もはやGUIアプリケーション開発のフロントエンドにC++を使う理由はほぼなくなったと言って良い。
ただしバックエンドやOS、組み込み、複雑な計算、アルゴリズムを実現する用途では今後もC/C++は根強く生き残っていくはずだ。 Swiftはネイティブコード側の挙動がブラックボックスになりやすいため、今後もC/C++の利点は評価され、両者との住み分けもきちんと行われていくだろう。
本記事では小規模の開発現場や日曜プログラミング、個人開発者的な目線でSwiftを絶賛し、C/C++を酷評している。産業プログラミングの世界や基幹システム開発の業界の目線ではまったく異なる見方ができる点に注意してほしい。もっとも今日のシステム開発の業界におけるC/C++の役割とその重要性は不動のものであり、C/C++言語の重要性は当面揺らぐこともないだろう。
クロスプラットフォーム開発やゲームプログラミングの世界ではC++人気がまだまだ根強いが、プログラマの多様化に伴い、今後はそれらもSwiftやRust、Go、Kotlin、Dart等の次世代言語に置き換わっていくはずだ。
コンパイラが解消するべき問題を人間が背負っていた時代はもう終わりである。これからは次世代プログラミング言語の時代である。
目次
- 次世代言語の良い所
- Swiftは未来の言語
- 言語仕様の不自由さ・縛りがむしろ利点になっている
- SwiftはC++に似ている
- SwiftはJavaに似ている
- Swiftはミドルユースの高機能一眼レフ
- SwiftはC++の代替となるかもしれない
- Swiftの将来性と未来
- コンパイラ言語界のRuby
- Swift言語はマニア向け
次世代言語の良い所
次世代言語ことSwiftの良い所はなによりもプログラマ側の負担が少なくなる所だ。コンパイラが非常に賢くできているため、プログラマ側は難しいことを考えずにコーディングが行えるようになる。また従来の複雑な記法の多くは、より洗練された簡潔な記法として生まれ変わっている。Swiftはまさに「きれいなC++」と言うに相応しい言語である。
エラーチェックが厳密
C/C++で未定義動作になるようなコードを親切丁寧にチェックしてくれる。 全体的にエラーメッセージの内容もわかり易いものが多い。C/C++特有の罠や注意点も少なく、間違いを犯しにくい頑強な言語仕様が魅力と言える。
豊富な言語機能
タプルやプロパティ、可変長配列、連想配列、遅延初期化、名前付き引数等の現代的な機能の多くがコア機能として組み込まれている。まるでスクリプト言語のようである。
安全性の高い言語仕様
Optionalによって変数や戻り値のnull可能性が厳密にチェックされる。これは言語のコア機能がサポートする仕組みであり、記法も簡潔で手軽に利用できる。これらの仕組みはnull安全を実現するためのもので、テスト効率の向上やソフトウェアの安全性にも貢献する素晴らしいものである。
言語仕様が現代的
プログラマ側の負担を減らす簡潔な記法・言語仕様がなによりの魅力である。いちいちコンパイラに気を使う必要もほとんど無い。ヘッダファイルを書く必要もないし、名前空間の自動解決も行ってくれる(パッケージ名の自動解決はもとより列挙型ラベル名の省略記法までもサポートしている)。
// Swift
let align = TextAlignment.Left
if align == .Left { print("same") }
// C++
auto align = uikit::text_alignment::left;
if (align == uikit::text_alignment::left) print("same");
ただしその分コンパイラ側の負担は高く、初期のSwiftはコンパイル時間に多くの時間を有していた。マシンパワーに物を言わせるまさに現代的な言語仕様である。
メモリ管理機能が組み込まれている
SwiftにはARCと呼ばれるメモリ管理機構が採用されている。C++の世界で有名なスマートポインタ(shared_ptr/weak_ptr)に相当する機能が言語のコア機能として組み込まれている。
スケーラビリティの高さ
Swift上でC言語標準ライブラリの型や関数を用いたり、既存のC言語ライブラリを活用することができる。またC言語の実行コードとほぼ同等の実行コードを生成させることも可能となっている。低レイヤーから高レイヤーまでの幅広い範囲をカバーすることのできるほどの柔軟性を兼ね備えている。
Objective-C言語との互換性も兼ね備えており、過去の資産を有効的に活用することもできる。
Swiftは未来の言語
C/C++に比べれば学習コストは遥かに低い。C/C++が王族のための言語なら、Swiftは庶民のための言語と言える。Swiftは教養がなくてもそれなりに使いこなせるし、なによりも速い。必要最小限の意識さえ持ち合わせておけば、それなりに最適化された高速なネイティブコードをコンパイラ側が適当に見繕ってくれる。初心者や素人にとってはまさに夢の様な言語である。
また簡潔な記法や厳格な言語仕様も相まって、Swiftは非効率なコードが生まれにくい環境にもなっている。C/C++の時代ではきりのなかった小手先のパフォーマンス・チューニングも、Swiftの時代では「コンパイラが上手いことやってくれるから」と割りきれるようになった。実行コード側の挙動を気にしながらプログラムを書く必要もほとんどなくなった。
ほぼ書いたままのコードが動くC/C++と比べれば、Swiftの抽象化された縛りの強い言語仕様は明らかにプログラマ側の負担や煩わしさを軽減させる。プログラマは複雑な仕様やルールに縛られることなく、小手先のテクニックや注意点に惑わされることなく、本来の目的であるロジック側の構築に集中できるようになった。
RubyやPython等のスクリプト言語が実現しようとしていた理想を、Swiftはコンパイラ言語の世界で実現しようとしている。
言語仕様の不自由さ・縛りがむしろ利点になっている
Swiftには「構造体は値渡しでクラスは参照渡し」という思い切った仕様が取り入れられている。また構造体は継承ができない。
Swiftは言語仕様の多様性をあえて排除し、言語仕様に厳格なルールと制限を加えることで表面上の仕様をミニマルに抑えている。実にAppleらしい考え方であり、これらの思想は言語の普及率にも大きく貢献していくことだろう。
Swift言語には他にも様々な制限が加えられている。詳しくは「プログラミング言語の未来 - 仕様は規約」「プログラミング言語の未来 - Swiftはルールが厳格」が参考になる。
Swiftの言語開発者は汎用性と合理性・実用性のバランスを非常に巧みにコントロールしている。この言語は本当によく考えられて作られており、教育用言語としてのポテンシャルも十分に備わっている。もはや「コンパイラ言語界のPython」と言っても過言ではない。
SwiftはC++に似ている
別記事(SwiftはC++に似ている)
そのうちSwiftとC++はシームレスに連携できるようになるのではないかと勘ぐりたくなるほど両者は共通点が多い。ひょっとしたらいつか「Cpp2Swift」が出てきたり、SwiftのフロントエンドがSwiftで作られるような時代もやってくるかもしれない。今はまだ存在しないSwift向けのマクロについても、おそらくC++のテンプレートやconstexprを意識したものになるのではないだろうか。
SwiftはJavaに似ている
別記事(SwiftはJavaに似ている)
Swiftはミドルユースの高機能一眼レフ
SwiftはC++をスペックダウンし、より万人受けするよう簡略化された言語という印象が強い。C++が業務用一眼レフなら、現時点でのSwiftはミドルユースや休日カメラマン向けの高機能一眼と言える。ちなみにJavaはファミリーユースのEOS Kissやデジカメである。私はこのチープさにむしろ惹かれる。
SwiftはC++の代替となるかもしれない
C言語使いにとってのC++は憧れの存在と言える。C言語にはないオブジェクト指向が取り入れられているためだ。しかしC++は熟練のC言語使いでも扱いが難しく、罠の多い言語でもある。事前に熟知しておかなければならない仕様や注意点・ルールが多い。使い手のスキルに応じた厳格なコーディング規約も必要になる。もはやC++は象牙の塔の住人のみが扱うことを許された孤高の存在と化している。
そのようなC++の排他的で複雑な仕様や文化をわずらわしく感じてしまう層も多い。そのような層にとって、Swiftという次世代言語やRust等の代替言語は実に魅力的に映ることだろう。少なくともGUIアプリ開発を行う程度の用途であれば、C++を使うことの利点はもはやSwiftの魅力に遠く遥か霞んでしまう。
C++はあまりにも複雑に、そして膨大になりすぎてしまった。オブジェクト指向とC言語との互換性という大きな売りは、もはや学習コストに見合ってはいない。
TMPとは無縁の大多数のプログラマはC++に見切りをつけてSwiftやその他の次世代言語/代替言語に移ってしまうかもしれない。
Swiftの将来性と未来
SwiftはC++以上に変人向けの言語である。STLに依存し、キーワードや組み込み機能・シンタックスシュガーの追加を極力避ける保守的なC++とは違い(C言語との協調性を保ちながらもユーザ定義可能な汎用的な枠組みの構築にこだわる意欲的なC++とは違い)、Swiftは貪欲にコア機能を拡張してゆく。この言語の思想はPerlやPHP, Rubyのそれに近いものがある。
しかし面白いことに、Swiftの複雑化はそれほど苦にはならない。これはSwiftが言語仕様よりも言語機能を重視しているように感じるからだ。Swiftは言語の多様性を自由で豊富な言語仕様によってではなく、豊富な機能によって実現しようとしているように思える。
複雑でわずらわしい言語仕様を極力排除、または表に出さず、代わりにより簡潔な機能を提供することで、誰もが手を出せる「安心のプログラミング言語」を実現している。これはちょうどLinuxとMacの対比に近いものを感じる。
Swiftは表面上の仕様や機能が実に分かり易く簡潔で、初心者でも安心して利用できる面がある。しかしC/C++の場合は一つの機能を利用するにも前提となる知識が広く求められ、それがC/C++の習得を困難なものにし、多くの挫折者を生む要因になっていたりもする。複雑な言語仕様と行き過ぎた一貫性は時として初学者を混乱させる。
Swiftの思想はまさにMacやiPhoneそのものである。もしかするとSwiftはライトユーザや初心者への受けも良い言語になるかもしれない。近年、Webやモバイルのブームによって、プログラミングが大衆化している。プログラミングはもはやオタクや専門家のためだけの物ではない。Swiftのような簡潔で安全性の高い言語が今後の主流になることは間違いない。
コンパイラ言語界のRuby
実は、Swiftは非常にマニア受けの良い言語でもある。継承を用いずに既存クラスの拡張ができるし、演算子の独自定義もできる。DSLの構築にも最適な言語である。C++やJavaScript, Rubyのような奥の深い言語を愛する言語マニアほどSwiftにハマりやすいはずだ。
Swift言語は表面上の仕様こそシンプルに見えるものの、コアの部分は非常に複雑に、汎用的にできており、多様性も十分すぎるくらいに兼ね備えている。
しかしこのSwiftの自由度や多機能性は、使い方を誤ると開発者達の技術格差を広げる要因になってしまうかもしれない。チーム開発ではC++並に厳格なコーディング規約が必要になるだろう。そういう意味ではエンタープライズ開発には向かない言語とも言える。少なくとも現状のSwiftは個人開発や少人数でのチーム開発に特化した言語であると感じる。
Swiftの言語仕様はシステマティックでルールも複雑であり、また仕様変更も活発である。これらはいずれ技術者のSwift離れを引き起こすことに繋がるかもしれない。
Swift言語はマニア向け
RubyやNode.js, Go言語の新規採用を躊躇し、PHPを有難がって使い続けているような保守的なIT企業には、Swiftの採用は難しいだろう。そのような企業にはJavaがお似合いだ。
このままいけばSwiftは将来的にJavaとうまい具合に対極する言語になるかもしれない。これは現在のWeb言語におけるRubyとPHPの対比に近いものになるはずだ。
ただ個人としては、SwiftにはJavaを置き換える存在になってもらいたいものだが、しかしこのままSwiftの仕様や機能が肥大化してゆけば、SwiftはC++やRuby同様に上級者やマニア向けの言語に留まってしまう恐れもある。しかしそこは天下のAppleとIBMである。うまい具合にコントロールしてくれることだろう。
備考
今後はSwift製のマルチプラットフォーム向けフレームワークがいくつか出てくるかもしれない。
QtはいずれSwiftをサポートすることになるだろうし、MicrosoftのiOS互換フレームワーク「Windows Bridge for iOS(WinObjC)」は早急にSwift対応することになるだろう。
そもそもQtの多言語バインディングよりも先に、Swift側のC++API対応が完了する可能性もある。そうなればQtだけでなくwxWidgetsやその他様々な資産を活用することが可能になるかもしれない。
Swiftがプログラミング言語界のエスペラントになる日は近い。
追記
Google、SwiftをAndroidの第一級言語にすることを検討?
Google、KotlinをAndroidアプリ開発言語に選定―I/O会場から大喝采
Cocoa-Java, WebObjects以降、JVMを見捨てたAppleが開発したSwiftという言語。Androidの第一級言語としての採用もむなしく、結局はJVM言語であるKotrinが採用される運びとなった。なんとも皮肉な結末である。
Swiftはプログラミング言語界のエスペラントにはなれなかったのだ。次はプログラミング言語界のラテン語を目指そう。