ネイティブコードベースシステムとJust-In-Timeベースシステムの利点について、面白い議論を最近、Microsoftの Herb Sutter氏とMonoの Miguel de Icaza氏が行ない、洞察力のある解説をしている。二人の意見は、ネイティブとマネージコード間にある、現在の最先端技術について有益な見方を提供している。
Herb Sutter氏は、まず「いつもっと優れたJITがマネージコードを救いますか?」という質問に答えた。氏は、自分の立場を次の言葉で要約した。「C++とマネージコードには、異なる根本的なトレードオフがあり、いざとなったらパフォーマンスと生産性のどちらを優先するのか、ということです。」
氏の見方は、C++はパフォーマンスを選び、マネージ言語(彼は Java/NETをそのように定義している)は、プログラマーの生産性を優先にすることでトレードオフを決着している。氏は更に深く次のように言っている。
「まず、JITコンパイルは主要な問題ではありません。根本原因はずっと基本的なことです。マネージ言語は基本的にパフォーマンス効率がぎりぎりの時でさえも、それを犠牲にして、プログラマーの生産性を最適化するよう、意図的に設計上のトレードオフを行なっています。」
Miguel de Icaza氏は Sutter氏のポイントを取り上げ、簡単に彼の見解を述べている 。
「マネージ言語の設計者は、設計のためにパフォーマンスよりも安全性の道を選びました。例えば、配列の境界外の要素にアクセスするのは、無効な操作であり、プログラムの実行を終了させます。クラッシュしたり、攻撃可能なセキュリティホールを作ることがないようにしています。」
それぞれが最適なコードを生成する、JITベース言語の能力をどのように見るか、という点でも2つは違う。
「2つ目に、たとえJITが唯一の大きな問題であったとしても、JITは普通に最適化するコンパイラー程良くなることはありません。なぜならJITコンパイラーには、速いことが重要であり、最適化したコードの生成を気にしていないからです。」- Herb Sutter
しかし上記には問題があります。一般にこのことは初期のJITコンパイラーには当てはまり、恐らく Microsoftの .NET JITコンパイラーを反映しているのでしょう。しかし、この話は、最先端のJITコンパイラーには当てはまりません。? Miguel de Icaza
de Icaza氏が感じているのは、JITコンパイラーは「生成したコードの品質とコード生成にかかる時間とのバランスをうまく取らなければならない。JITコンパイラーは、生成したコードの品質よりもコンパイル時間を早くする傾向にある。」しかし、Monoではユーザーがコンパイルに LLVMを使うことで生成コードの品質をもっと上げる方を選ぶことができる。氏が言うには、「MonoはAppleが現在Lion上で使っているのと同じコンパイラーを使っています。LLVMが改善すれば、Monoが生成するコードも改善します。」
LLVMバックエンドを選ぶ機能により、Monoユーザーはプロジェクトにニーズによりコンパイルスピードか生成するコードの品質かを選ぶことができる。これによって開発者は、ずっと柔軟性を手に入れることができるので、開発中は何度でも再コンパイルが必要なので、コンパイル時間を短くすれば開発スピードを上げることができる。その次に、プロジェクトが終わったり、終り近くなったら、コードの最適化を選ぶことで、エンドユーザーの利益になる。
このことは、パフォーマンスよりも安全性を選ぶことは、マネージランタイムがそのパフォーマンスをさらに改善することはできない、という意味ではない。 de Icaza氏は、改善の余地のある幾つかを述べており、その中には、インテントを含むこと、VMの拡張、動的言語のフィーチャを制限することなどがある。また言語フィーチャをネイティブハードウェアにマップするように、固有なものをより良くサポートすることも上げている。
Sutter氏は、最初の投稿へのフォローアップコメントを書いた。C++には基本的なパフォーマンス上の利点がある、と考えている。
「しかし、「予防」と「治療」にはいつも避けがたい、基本的な差があります。パフォーマンスの最適化となると、C++はいつも「予防」を選び、これまで述べた英雄的な努力とそれ以上によって、マネージ言語は「治療」を選びます。しかし、古くから諺である予防はいかなる治療にも勝るは、絶対です。予防には勝てません(その理由の1つは、最初に予防した後に治療ができるからです。しかし逆はできません)。もしパフォーマンスとコントロールを一番大事にするなら、それを一番優先するように設計されている言語を使うべきです。それだけです。」
InfoQの読者はC++とマネージコード間のトレードオフについて、どう思うだろうか?マネージコードが持つ開発者にとっての利点がパフォーマンス不足を埋め合わせするだろうか?マネージコードの開発者は、今一度最新C++の新フィーチャに目をむけるべきか?