概要
私はC++erってほどC++の仕様に詳しいわけじゃないですが、この人生上、最も長けているプログラミング言語はC++言語です。最も好きなプログラミング言語もC++。好きだけどビルドの遅さだけは気になる・・・
最近、Monoというライブラリを使うことでC++からC#のコードを実行できることに興味を持ちました。Monoといえば、ゲームエンジンで有名なUnityや、AndroidやiOSなどのスマホ向けクロスプラットフォーム開発環境のXamarinで利用(Embedded)されています。Monoの使い方についてはいつか別の機会に。
で、要は今までほとんど使ったことがないC#を使い始めたわけです。似てるようで異なるC++とC#。その二つを比較していこうと思います。
※最近のUnityはMonoから自社製IL2CPPというのに移行しているみたいです。
C言語との関係
- C言語のコードをC++言語で利用するのは簡単
- C言語のコードをC#言語で利用するのはめんどくさい
C言語・・・それは長い歴史をもっていてそしてなお現在も生き残り続けるプログラミング言語です。Cで書かれた数多くのライブラリが存在します。利用できるものは利用したい!
C++言語もC#言語も、C言語の影響を受けた派生言語です。文法は非常に似ています。ですが互換性の面では大きな差があります。純粋にCで書かれたコードはそのままC#のコードとしてコンパイルすることはまずできないでしょう。それだけ文法に違いがあります。
一方、CのコードをC++としてコンパイルすることは割とあっさりできたりします。(完全な互換性があるわけではないですが)C++はCで書かれたコードをそのまま再利用できるのです。(CのコードをC#で利用する場合はP/Invokeという仕組みが必要になります。めんどくさい...)
対応環境
- C++ → 多い
- C# → 少ない (現在は増えてきている)
C++は、様々な開発に用いられた長い歴史を持つC言語と高い互換性があります。そういう事情もあって、Windows、Linux、Mac、スマホ、いろんな環境に移植できます。ただ、基本バイナリはネイティブコードであるため、環境に合わせてビルドしなおす必要があります。
C#のバイナリは中間コード(IL)で、プラットフォームに依存しないコードですが、Microsoft製の言語で、古くはWindows限定でした。しかしMicrosoftが仕様を公開して、Monoプロジェクトが立ち上がったことで様々な環境に対応しています。
コンパイル(ビルド)の速度
- C++ → 遅い
- C# → 速い
C++もC#も基本的に事前にコンパイル(+リンク)が必要です。
C++はtemplateやプリプロセッサマクロを利用することで静的でありながら非常に自由度の高いコーディングを実現しますが、その分、複雑になってパース・解析に時間がかります。依存関係を気にせず書いているとコンパイル時間もバイナリサイズもびっくりするほど肥大化します。ただ実行速度(パフォーマンス)は良いです。
C#はC++のようなtemplateはありません。似たようなジェネリクスというのはありますがtemplateの機能限定版のようなものです。C++の自由すぎるものを取っ払って、stringやプロパティ、delegateという仕組みをライブラリとしてではなく、言語そのものに取り込んでいます。自由すぎないのでC++ほど解析に時間はかかりません。ただ実行速度はC++に劣る・・・と言いたいところですが・・・JITエンジンは進化しており、現在では遜色ないぐらいの速度に...(ゲフンゲフン
C++は実行速度の速さが売りのはずなのに追いつかれてるのってなんかちょっとショック!
余談 「IL2CPP」
最近のUnityはMonoから独自のIL2CPPに移行しているみたいです。その名の通りILコードをC++コードに変換するようです。え 最終的にC++コードにするなら最初からC++つかわせてよ!