Swiftは完璧な次世代言語 〜SwiftはC++の代替品である〜


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++」と言うに相応しい言語である。

エラーチェックが厳密

C/C++で未定義動作になるようなコードを親切丁寧にチェックしてくれる。 全体的にエラーメッセージの内容もわかり易いものが多い。

C言語とやり取り可能

Swift内部でC言語の型や既存のライブラリを認識・利用出来る(Swiftの構文でCの関数を呼び出せる)。

nullの可能性を把握する仕組みを言語側が備えている

Optionalによって変数や戻り値のnull可能性が厳密にチェックされる。これは言語のコア機能がサポートする仕組みであり、記法も簡潔で手軽に利用出来る。

またタプルやプロパティ、可変長配列/連想配列、遅延初期化、名前付き引数、スマートポインタ等の現代的な機能の多くも同様に、コア機能として組み込まれている。

メモリ管理機能がコア機能として組み込まれている

SwiftにはARCと呼ばれるメモリ管理機構が採用されている。C++の世界で有名なスマートポインタ(shared_ptr/weak_ptr)に相当する機能が言語のコア機能として組み込まれている。

言語仕様が現代的

プログラマ側の負担を減らす簡潔な記法・言語仕様がなによりの魅力である。いちいちコンパイラに気を使う必要もほとんど無い。ヘッダファイルを書く必要もないし、名前空間の自動解決も行ってくれる(パッケージ名の自動解決はもとより列挙型ラベル名の省略記法までもサポートしている)。

// Swift
let align = TextAlignment.Left
if align == .Left { print("サメ") }
// C++
auto align = uikit::text_alignment::left;
if (align == uikit::text_alignment::left) print("サメ");

ただしその分コンパイラ側の負担は高く、初期のSwiftはコンパイル時間に多くの時間を有していた。マシンパワーに物を言わせるまさに現代的な言語仕様である。

Swiftは未来の言語

C/C++に比べれば学習コストは遥かに低い。C/C++が王族のための言語なら、Swiftは庶民のための言語と言える。Swiftは教養がなくてもそれなりに使いこなせるし、なによりも速い。必要最小限の意識さえ持ち合わせておけば、それなりに最適化された高速なネイティブコードをコンパイラ側が適当に見繕ってくれる。初心者や素人にとってはまさに夢の様な言語である。

また簡潔な記法や厳格な言語仕様も相まって、Swiftは非効率なコードが生まれにくい環境ともなっている。C/C++の時代では切りの無かった小手先のパフォーマンス・チューニングも、Swiftの時代では「コンパイラが上手いことやってくれるから」と割り切ることが出来るようになった。Swiftユーザは実行コード側の挙動を気にしながらプログラムを書く必要はほとんどない。

ほぼ書いたままのコードが動くC/C++に比べれば、Swiftの抽象化された縛りの強い言語仕様は明らかにプログラマ側の負担や煩わしさを軽減させるのだ。プログラマは複雑な仕様やルールに縛られることなく、小手先のテクニックや注意点に惑わされることなく、本来の目的であるロジック側の構築に集中出来るようになった。

RubyやJavaScript等のスクリプト言語が実現しようとしていた理想を、Swiftはコンパイラ言語の世界で実現しようとしている。

言語仕様の不自由さ・縛りがむしろ利点になっている

Swiftには「構造体は値渡しでクラスは参照渡し」という思い切った仕様が取り入れられている。また構造体は継承が出来ない。

C/C++の世界では両者のような区別はなく、参照型の利用やポインタ渡しは「&宣言子、&アドレス演算子」で明示的に行う必要がある。C++のそれは一見時代錯誤のマキシマルな仕様に思えるかもしれないが、むしろこれはC/C++の自由さと一貫性・多様性の表れでもある。

対して、Swiftはそのような多様性をあえて排除している。Swiftは言語仕様に厳格なルールと制限を加えることで表面上の仕様をミニマルに抑えている。実にAppleらしい考え方であり、これらの思想は言語の普及率にも大きく貢献していくことだろう。

Swiftの言語開発者は汎用性と合理性・実用性のバランスを非常に巧みにコントロールしている。この言語は本当によく考えられて作られており、教育用言語としてのポテンシャルも十分に兼ね備えている。もはや「コンパイラ言語界のPython」と言っても過言ではない。

Swift言語には他にも様々な制限が加えられている。詳しくは「プログラミング言語の未来 - 仕様は規約」や「プログラミング言語の未来 - Swiftはルールが厳格」を参考にすると良い。

SwiftはC++に似ている

別記事(SwiftはC++に似ている)

そのうちSwiftとC++はシームレスに連携出来るようになるのではないかと勘ぐりたくなるほど両者は共通点が多い。ひょっとしたらその内「Cpp2Swift」が出てきたり、SwiftのフロントエンドがSwiftで作られるような時代もやってくるかもしれない。今はまだ存在しないSwift版マクロについても、おそらくC++のテンプレートを意識したものになるのではないだろうか。

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言語はLLVMを基盤とする言語であり、Clang(C/C++/ObjC)とのやり取りもほぼシームレスに行える。過去の資産を十分に活かすことの出来る言語でもある。

Swiftの将来性と未来

SwiftはC++以上に変人向けの言語である。STLに依存し、キーワードや組み込み機能・シンタックスシュガーの追加を極力避ける保守的なC++とは違い(C言語との協調性を保ちながらもユーザ定義可能な汎用的な枠組みの構築にこだわる意欲的なC++とは違い)、Swiftは貪欲にコア機能を拡張してゆく。この言語の思想はRubyやPerlのそれに近いものがある

しかし面白いことに、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言語はマニア向け

Rubyの新規採用を躊躇し、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がプログラミング言語界のエスペラントになる日は近い。

広告