potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

雑記 C#でC++ほど個人開発ライブラリが流行らないのは言語の設計思想や時代背景の違い?

個人開発のライブラリ(クラスライブラリやヘッダーオンリーライブラリ)が多数存在するC++に対して、C#ではあまり見かけない気がします。数学や統計、機械学習に関する大規模なライブラリはGitHubで複数公開されていますが、特定機能に絞ったものは特に見かけません。その理由をずっと考えているのですが、言語の設計思想や時代背景があるのかと想像しています。なお、C#およびC++言語仕様の知識はほとんどないので間違ったことも書くかもしれません。

言語の設計思想として、C#はリフレクションによる型情報の取得が前提です。クラスやメソッドは実行中に名前を取得でき、コンパイル時に未使用でも作成や呼び出しが可能です。このクラスやメソッドはビルドに含まれたすべてのコードが対象であり、使わないコードも実行ファイルあるいはILとして型単位でメモリに読み込まれてしまいます。最近はC#もAOTで未使用コードのトリミングに対応しつつありますが、現時点ではWinFormsに非対応です。この仕様はコンパイルまでに未使用コードを削るC++と対照的な仕様で、ファイル・メモリ容量を気にするプログラマー層、即ちおそらくライブラリを作る層には使いにくい性質だと思います*1

言語の時代背景として、C#C++よりも言語が揃った時代に生まれました。数学や統計をしたいならRやPythonで事足りますし、どちらもGUIや出力に対応しています。Web開発ならRubyも選択肢に入りますし、何ならTypeScriptもあります。RustをはじめとしたC++の代替も多数提案されています。C++全盛期と比べれば選択肢が多く、仕事でも趣味でも開発していたマニアックなプログラマーが減ったのだろうなと思います。日本人によるC#開発なフリーソフトもあまり見かけません*2

書きやすい2点を抜き出しましたが、実際には他の理由も多々あると思います。C#のAOTが本格化すれば変わるかもしれないので、今後も動向を注視していきたいです。

*1:C++でも動的ライブラリ(いわゆるDLL)ではコードがほぼ残ると思います

*2:敷居が高いですよね……