SwiftはC++に似ている|SwiftはデフォルメされたC++である

SwiftはC++に似ている

Swiftのスローガンは「Objective-C without the C」である。Objective-CからC言語を排除した言語というわけか。Objective-Cと言えば、あのC言語にSmalltalk風の動的なオブジェクト指向を取り入れたサイボーグ言語として有名だ。

するとSwiftはSmalltalk風の言語に仕上がっているのかと期待してしまうところだが、実際のSwiftを見ると動的な特性はあまり感じられない。むしろ静的な側面が強い言語のように思える。Smalltalk風というよりはどちらかと言うとC++風の言語である。

C#にC++臭さ、KotlinにJava臭さを感じるのと同じように、SwiftにはどうにもC++臭さみたいなものを感じてしまう。単に見た目が似ているとか、AKBはみんな同じ顔に見えるとか、テイラー・スウィフトとミラ・ジョボビッチとスカーレット・ヨハンソンの見分けがつかないとか、そういうレベルの話ではないのだ。

この言語には型に対するユルさがまったく感じられない。コンパイル時にほぼすべての依存関係がカッチリと決まる超静的型付け言語的な厳格さがある(実際Swiftは「強い静的型付け言語」として知られている。個人的にはRust並の「めちゃくちゃ強い静的型付け言語」と言いたいくらいである)

Swift自体は表向きC++からの影響を受けていない言語ということになっているが、実際はかなりC++の影響を受けているように思う。少なくともSwift言語のコア部分は相当C++を意識した仕上がりになっており、もはやこの言語は「陰ながらC++を意識するツンデレ言語」と言っても過言ではない。

Swiftは抽象化されたC++

SwiftはデフォルメされたC++である。

SwiftはJavaやScalaみたいだという意見が多いが、機能的な面はC#に近いように思う。また実際のコンセプトや根底の部分はむしろC/C++の仕様に沿っているようにも思える(Clangと同じLLVM系の言語ならば当然か)。

構造体のメンバー関数にしても演算子オーバーロードにしてもそうである。他にもデフォルト引数や静的バインディング、デストラクタ、仮想関数的なオーバーライド機構、インライン化を前提とした過剰なコード最適化など、これらほとんどのコンセプトはJava的、Objective-C的というよりはむしろC++的である。あの保守的なJavaが頑なに採用を拒んできたC++由来のえげつない機能の多くを、Swiftは恐ろしいほど貪欲に取り入れている。

SwiftにはどこかC/C++の面影を感じさせられる。その要因にはおそらくSwiftのコンパイラ基盤にClang(C/C++/Objective-C)と同じもの(LLVM)が採用されていることが関係している。またSwiftの開発者はClang/LLVMの主要メンバーであり、Swift自体もC++で書かれている。Swift言語はある意味、Clang/LLVMコンパイラ開発者達の長年の研究成果でもあるわけだ。逆にJVM(Java仮想マシン)開発陣営がSwiftを作っていたら今のSwiftとは全く異なる言語になっていたことだろう。少なくともC++っぽさが無くなることは請け合いである。

またSwiftはC++を反面教師としながらもC++の成果を拝借し、より洗練された形で取り入れている点が素晴らしい。

構造体とクラスの区別は非常に合理的なアイディアだと思う。explicitを標準とする思想も現代的で好感が持てる。const変数/関数周りの仕様はとてもスマートな形で抽象化されている。この辺はさすが後発の言語だけのことがある。

つまるところ、Swiftは綺麗なC++なのである。SwiftはC++とJavaの中間に位置する言語という印象を強く受ける。

C++ >>>> Swift >> C# >> |越えられない壁| >> Java

アンチC/C++的なSwift

ただこの言語にはアンチC/C++的な仕様も数多く取り入れられており、Java言語の再来をも感じさせられる。SwiftはC++を猛烈に意識しながらも、若干異なる方向性を目指そうとしている言語のようにも思える。

この辺の話は以前の記事プログラミング言語の未来 ~Swift移行が進まない理由~で次世代言語の思想とC言語文化の対比を例により深く考察したことがあるので、参考にされると良い。

ならばSwiftはJava言語と同じ道を辿っていくのではないかと思われるかもしれない。だが実際はもっとC/C++の隣に這い寄るカオスな言語であり、低レイヤーの処理を扱う分野でも十分に活用できるほどのポテンシャルを備えている(SwiftはもともとObjective-Cの事実上の代替品として生まれた経緯があるため、低レイヤーが扱えるのは当然といえば当然である。むしろそれが出来なければObjective-C→Swift移行は相当困難な物になってしまう)

Swiftは八方美人

するとSwiftはGo言語やRust言語のライバルにもなり得るわけだ。高レイヤーの世界ではJava/Objective-CやHTML5+JavaScriptの代替を目指し──あわよくばWebの世界やエンタープライズ分野でも幅を効かせ──、低レイヤーの世界ではC/C++の代替を視野に入れGo/Rustと敵対する。なんとも欲張りな言語である。

しかしSwiftはそんな八方美人を貫き通せるほどのポテンシャルとカリスマ性を持ち合わせているのも事実である。

ただでさえ次世代言語のSwiftが多様性と万能性という名の翼を持ってプログラミング言語界のエスペラントになろうとしている。

広告