/note/tech

なぜ近年、Zig,Rust,Go,CarbonなどのC/C++ Likeの言語が乱立しているのですか?に対するJunji Ueharaさんの回答

Cが危険であり、Cを使い続けることができない状況だからです。

プログラミング言語のセキュリティについて調べてみる

から孫引きすると

2019年と古めの統計ではあるがIs One Programming Language More Secure Than The Rest?によると、脆弱性情報の多いランキングとして以下のようになっているそうです。

C言語 (47%)

PHP (17%)

Java(12%)

JavaScript (11%)

Python (6%)

C++ (6%)

Ruby (5%)

と実に脆弱性の半分がCで作られています。このことは、Shellshock脆弱性[1] やHeartbleed脆弱性[2] などで代表されるような、バッファオーバーフローを簡単に引き起こしてしまう、現代のレベルから劣っているとしか言いようがない、かつ直しようがない言語設計(50年も前の言語なのでしょうがないのですが)、また置き換えられることなくあまりにも長く使われてきたシステムプログラミング領域の言語であったということから来ています。

一方、システムプログラミングの領域では、やはり性能が求められます。CPUが倍に速くなったからソフトウェアの性能は半分で良いと考える人はいません。特にクラウドやサーバサイドでは、ハードウエアで倍量の処理ができるように速度が向上したなら、倍のユーザの同時処理を行うことが求められます。高価なインスタンスを利用するからと言って、じゃあその分遅い言語で書いていいんだね、とかが許される余地はありません。アプリケーションはともかく、「その上で全てが動作する、その動作速度にあらゆるユーザのあらゆる処理が依存する」ようなシステムプログラミングでは特にそうなのです。

ということで、システムプログラミング分野では、旺盛なソフトウェア開発需要のもとで、Cと同等の実行速度は必要であり、ハイリスクなC以外の選択肢は強く求められているのです。

本来なら、C++はその役を担っても良いものでした。しかしパラダイムシフトに匹敵する方針転換を一つの言語上で後方互換を保ったまま何度も行ったことで、その仕様は難解なものとなりました。後方互換を必要としない開発分野では、まさに重荷というべき、採用コストがペイしないうえに保守コスト上も受け入れがたい言語とみなされ始めました。

以上がCの代替言語が出てきた背景となります。残る疑問は、なぜ、この時期にそしてなぜ多数なのか、です。

多数であることについてですが、質問に挙げられた言語をそれぞれ見ていくと、コンセプト、解決したい領域がそれぞれ異なっていることがわかります。

例えばgoはネットワーク・並列処理であるし、CarbonはC++のプログラミングモデルそのままに重荷である後方互換を除去し、良いところだけを取り出したものです。Rustはリッチな型システムに裏打ちされた静的解析によるメモリエラーの撲滅を目指しています。Zigはより直球でCを代替するもので、一周戻ってRust疲れを癒やす存在です。

だから多数なのには理由があり、Cがあまりにも多くを負うていたことの反動だとも言えるでしょう。

最後に「なぜ今なのか」です。といってもGoやRustが出たのもそんなに新しい話ではないですが、D言語やVなんかもあるし印象としては確かに増えてはいます。

その理由を説明するなら、C以外の言語、例えばHaskell,Ruby,JS,Erlang,Typescript言語による成長期・実験期が終わり、言語機能ごとの評価が定まり、良い機能は何か、あんまり良くない機能は何かのコンセンサスが取れてきたということがあります。収穫期が来たということです。

多角的、総合的な意味で「良いシステムプログラミング言語」をどうすれば作れるかがわかってきて、言語設計業界が成熟し、メリットが大きい言語を作れるようになり、ついに偉大すぎるCの遺産を捨ててでも移行する苦痛を凌ぐようになってきました。Cを捨てるメリットが、損益分岐点を超えつつあるのが今だから、いまそのような言語が我々の目に良く付き始めるようになっているのです。その動向は大きな潮流であり、業界全体に普遍的だから、C代替の多数の言語が今、現れています。

脚注

[1] 2014年シェルショック脆弱性 - Wikipedia

[2] ハートブリード - Wikipedia