業界がCからC ++に切り替えたのはなぜですか?[閉まっている]


19

まず第一に、私は本当の答えを持ちたいです、私は常にさまざまなソースや記事からもっと多くを得ようとします、そしてC ++のようなものを読むとき、それは仮想関数を持ち、このCが優れているので、私は本当に何を言い、頭脳を持つ人間として考えるかわからない。回答でこのレベルに到達しないようにしてください。

私の質問は、Coomへの大規模な切り替えで、Doom 3でほぼ完了しました。

私にとって興味深いのは、このマイルストーンの前に、ほとんどのゲームエンジンとゲーム自体が、Quake時代以来のようにCで書かれていたことです。また、IDソフトウェアがIdTech 4のコードベースをC ++で完全に書き換えることを決定したことに注意するのも興味深いことです。これは、本当に良い理由のリストなしでは理解できない膨大な量の作業です。

私は主にOpenGLの世界に興味があり、私はこのトピックに集中しようとするので、Doom 3に焦点を当てています。したがって、私はこれについて多くのことを読みますが、そのような質問はrender-API -あまり問題のない不可知論者。

ある特定の時点で、業界が大規模にC ++に切り替えたのはなぜですか?IDが選択した理由は何ですか?

最後に言いたいのは、C ++は実装が非常に簡単で、提供する機能の数が少ないことです。これは、C ++が実際に頻繁に行うのとは異なり、断片化される可能性がはるかに低いためです。簡単に言えば、すべての機能が適切に実装された優れたC ++コンパイラではなく、本当に優れたCコンパイラを見つける機会がはるかに多くあります。

たとえば、Android向けNDKは、最新の優れた機能をすべて備えた(r8bリリースの)C ++サポートがまだ十分ではなく、世界で最も人気のあるモバイルOSのネイティブツールキットです。

世界で最も人気のあるOSの1つが立ち入り禁止になっているため、コードを最新のC ++で記述していたとしたら、おそらく今苦痛を感じるでしょう。また、Androidのように、他の多くのコンパイラーはそれほど優れていません。

2-3リリース古いC ++バージョンを参照するC ++コードを書く必要がありますか?


1
私は、C ++がCの準拡張であると疑っています。人々はstd :: vectorなどのC ++機能を使用してCを書き始め、そこからC ++ではなくC ++が教えられたため、人々は本格的なC ++を書き始めました。
APIビースト

1
さて、大規模なアプリケーションを開発するときのCとC ++の違いは?OOPは素晴らしいパラダイムであり、C。++がサポートしています。Cでゲームを作成する場合は、データ指向設計を検討してください。それ以外の場合、現在の主要な業界のプレーヤーがすべてC ++を使用している理由について考えてみましょう。ソフトウェアエンジニアリングは、金融アプリケーションであれレジャーアプリケーションであれ、OOPパラダイムとアーキテクチャおよびデザインパターンの肩を掘り下げます。簡単に言えば、Cはカプセル化が提供する全体像を提供できません。Cで書かれた最新の大きなソフトウェアはありますか?たぶん、カーネルと組み込みシステム。
テオドロン

@teodron 1)優れた実行可能ファイルを作成する必要があり、重要な資産に関心があるように言語に関心がありますが、それはすべてではなく、私が販売しているものではありません2)カプセル化はパフォーマンスにあまり適していませんC ++の世界を去るよう説得して、カプセル化はこのための良いトピックの1つです。
-user827992

3
私にとって興味深いのは、このマイルストーンの前に、ほとんどのゲームエンジンとゲーム自体が、Quake時代以来のようにCで書かれたことです。」そのための証拠をいくつか見たいと思います。Id-softwareのオープンソースエンジンに加えて。ビデオゲーム業界全体ではありません。
ニコルボーラス

@NicolBolas私がIDについて話していた理由を説明していました。質問全体の意味を理解してください。
-user827992

回答:


28

C ++は、Cが行うすべてのことを行います。Cの利点がC ++の利点を上回る場合は、CとC ++を簡単に混在させることができます。これは、C ++の非常に意図的な設計上の決定です。

C ++は、Cではできないことを行います。これには、簡単なポリモーフィズムが含まれますが、テンプレートを使用した簡単なコンパイル時コード生成も含まれます。これは、Cの最大の弱点であるコンテナのようなものに非常に便利です。また、多くの時間を節約するユーザー定義のポインターのような型(スマートハンドル)、および演算子をサポートするベクトルやマトリックスなどのユーザー定義のプリミティブのような型も使用できます(多くの時間も節約できます)。

仮想関数は、非仮想関数よりも低速です。ただし、仮想機能にオプトインする必要があり、有能なプログラマーはそれらが有益である場合にのみそうします。Cプログラマーは関数ポインターを持ち、多くの場合、他の構造体によって参照される構造体のコレクションを保存します。つまり、仮想関数テーブルとまったく同じものを再作成するために余分な作業が行われます。単一の関数ポインターのみが必要でテーブルが不要な場合、C ++はそれを完全に許可し、Cと同等です。最新のコンパイラーでは、プログラマーが機能にオプトインする特定のケースでC ++はCより遅いだけです。 。また、実際の仮想関数のオーバーヘッドは、モデムCPUでは非常に小さくなっています。今日のハードウェアは、C ++の使用パターンに合わせて設計されており、高レベルの解釈された言語のニーズに合わせてますます設計されています。

C ++例外は歴史的に多くのオーバーヘッドを課しており、C ++を使用していない場合でもC ++が遅くなります。例外セーフコードの作成に伴う複雑さの大幅な増加以外の理由がない限り、例外はC ++に追加するのが恐ろしいものでした。実際、一部のコンテナ設計は例外的に安全にすることは文字通り不可能です。ゲームプログラマーは、例外の存在をしばしば無視し、コンパイラーでそれらを無効にします。最近のコンパイラには、オーバーヘッドがゼロの例外があります(つまり、実際に使用する場合にのみコストを支払います)。

Cは、すべてのルールを学ぶのが簡単です。C ++は非常に大きく複雑な言語です。C ++では、高レベルのコードを記述して、より簡単でシンプルなAPIを作成できます。言語をより簡単に理解したい人もいれば、高度なコードを簡単に書きたい人もいます。これは、コンパイラが特定のコードで何をしているのかを理解する単純さと、大規模で複雑な相互接続アプリケーションを記述する単純さとのトレードオフです。一部の人々は、さまざまな理由で、一方を他方よりはるかに高く評価しています。

結局、C ++はCのスーパーセットです。私の意見では、まずまずのCプログラマーではない有能な C ++プログラマーなどはありません(ただし、私の水準を下回るC ++プログラマーはたくさんいますが)純粋なCで失われる)。C ++はプログラマーをCの大部分から隔離する機能を追加しますが、些細でないC ++コードはしばしば物事を成し遂げるためにCを使用する必要があります。これは、C ++とJavaおよびC#の主な違いの1つです。結局のところ、「C / C ++」がひとまとめになっているのをよく見ます。

私の個人的な信念は、私がやり取りした他のほとんどのゲーム業界の専門家と共有していますが、C ++の拡張された表現力と高レベルのプログラミング機能は、Cを超える言語の複雑さを上回ることであり、行われた反C ++の主張は、今日の技術では単に時代遅れです。


19
「有能なCプログラマーでもない有能なC ++プログラマーというようなものはありません。」私はこの声明に強く反対します。慣用的なCは慣用的なC ++とは大きく異なります。2つのスタイルは分かれており、1つは不透明なポインターと静的関数を強調し、もう1つは言語ベースのカプセル化などを使用しています。唯一++ C ++で有能であってもよいが、それでも、むしろ慣用的なC.で混乱します慣用Cを知っている人
ニコルボーラ

C ++の能力があり、「イディオマティックC ++」のみを知っていることに同意しません。C ++の難しい部分は、Cの同じ難しい部分(およびテンプレート)です。C ++プログラマーが、スタンドアロン関数、プレーンな構造体、生または不透明なポインターに混乱した場合、実際の非学術的なシナリオで非自明なC ++コードをまだ書いていません。私は、「イディオマティック」なものだけに精通している人は誰でもまだコンピテンシーを達成していないと主張します。
ショーンミドルディッチ

3
「イディオム」とは「快適」を意味する別の方法であり、相対的であることは別として、ほとんどの場合、有能なC ++プログラマーが特に熟練していない言語の不快な領域があることを意味します。(必ずしもそれらがそれらの要素に「混同」されていることを意味するとは思わないが、単にそれらに不快または流fluentではない。)そして、ある程度、慣用的なC ++を学んでいる人々は不快になると教えられている生のポインタを垣間見るだけです。ですから、有能なC ++プログラマーが有能なCプログラマーを意味するとは思いません。
ジョンカルスビーク

別の言い方をすれば、高レベルのC ++レルムがあることは間違いありません。その上で、本格的なCコードを記述するために必要な低レベルの機能の使用を完全に避けることができます。ほとんどの実世界の非アカデミックコードベースは、この領域内に完全にとどまるわけではないと確信していますが、この領域にしか満足せず、それでも「有能」と呼ぶ人を見つけることができると思います。もちろん、そのような人をCプログラマと比較することはありません。他の多くの高水準言語でプログラミングしている人と比較することになります。
ジョンカルスビーク

1
@DanielCarlsson:結構です、私はただつまらないです。ごめんなさい。ただし、C ++はCよりも最適化を難しくすることはしません。:)確かに、STLを使用する場合は、STLの機能に限定されますが、その大部分は我々は代わりにC#やJavaのC ++我々だけなど、全体STLを再実装または(SSEの組み込み関数のように)インラインアセンブラまたは言語の拡張機能で、生の配列、あるいはクランクを使用することができるためである使用
ショーンMiddleditch

12

ある特定の時点で、業界が大規模にC ++に切り替えたのはなぜですか?IDが選択した理由は何ですか?

Id Softwareは「業界」ではありません。彼らは一つの会社です。彼らは影響力があるかもしれませんが、彼らは皆ではありません。

1999年にさかのぼるいくつかのゲームエンジンに取り組み、C ++を使用しました。

「その頃」C ++を採用した主な理由は次のとおりです。

  1. それはされた標準化。C ++ 98は、1998年にISO標準としてリリースされたため、その名前が付けられています。それまでは、C ++の方言が複数あり、「本当」または「正しい」という明確な考えがありませんでした。標準化され、コンパイラーが標準の実装を開始すると、ゲーム開発者は実際の標準に依存することができました。

  2. 昔の冗談を思い出してください。ある男が診療所に入って、「このように腕を上げると痛い」と言います。それで、医者は「そのように腕を上げないでください」と言います。

    仮想関数がニーズに対して遅い場合、C ++はそれらの使用を強制しません。C ++のすべてはオプトインです。特定の各機能を使用することを選択します。パフォーマンスが重要なコードを使用しており、仮想オーバーヘッドが必要ない場合は、仮想関数を使用しません。Cでパフォーマンスが重要なコードを使用している場合と同様に、関数ポインターを使用しません。

    実際、これにより、多くのC ++ゲームが慣用的なC ++ではなく(少なくとも、現代の慣用的なC ++ではなく)、単に「クラスを持つC」になりました。そして、これはC ++をプログラムする完全に機能的な方法です。地獄、typedef struct新しい型を作成するときに型を入力する必要がないことは利点です。

    C ++は機能の大きな袋であり、必要な機能を選択できます。

たとえば、Android向けNDKは、最新の優れた機能をすべて備えた(r8bリリースの)C ++サポートがまだ十分ではなく、世界で最も人気のあるモバイルOSのネイティブツールキットです。

あなたのポイントは?GoogleはNDKを使用する人々をほとんど容認しません。誰もがJavaを使用することを望んでいることは明らかです。NDKが存在する唯一の理由は、それなしではプラットフォームを使用しないという特定の重要な開発者がいるためです。したがって、NDKはそれらとそれらの機能のニーズに対応するために存在します。

はい、C ++はより大きく、より複雑な実装仕様です。Javaも同様です。だから、ある任意の C.除く言語

また、「すべての最新かつ最高の機能」とはどういう意味ですか?C ++ 11のことを話しているなら、まだ完全に実装している人はいません。仕様は、わずか 1年前になりました。また、NDKがC11をサポートしているかどうかもわかりません。はい。Cには、どこでもサポートされていない「最新かつ最高の機能」もあります。

これは重要なポイントをもたらします:pure-CアプリケーションをVisual Studioでコンパイルするには、C89に準拠する必要があり、それ以上のものは必要ありません。したがって、Cによるフラグメンテーションはすでに存在します。一部のプラットフォームはC89のみをサポートします。一部はC99をサポートしています。さまざまな程度でC11をサポートするものもあります。等。

あなたがCを使用したい場合は、Cを使用します。他の人がその選択をしなかったという事実は、あなたの選択が間違っている、または彼らの選択が間違っているという意味ではありません。あなたは彼らに自分自身を正当化する必要はありませんし、彼らはあなたに自分自身を正当化する必要はありません。


2
NDKの開発が進行中であり、Androidで利用可能なリリースがいくつかあるため、GoogleがNDKを使用することを容認しているとは思わない、たとえGoogleがC / C ++を嫌っていても、達成できるとは思わないJavaでのゲームや市場で最も重要なプレーヤーのパフォーマンスの良いレベルは、JavaとAndroidのためだけにコードを書き換えることができます。おそらくGoogleにとって必要な悪です。わかりません。ビューと世界対Javaの対C ++対C程度ではないラメの質問は、私は言語からより多くの一般の答えを探していた継続
user827992

すべての言語機能を考慮したコンパイラに、あなたの答えは、市場でのCコンパイラの可用性に関する私の最初のポイントを強調することもできます.Windowsでは、独自のコンパイラでコンパイラを生成するほとんどすべてのソフトウェアハウスがあり、 MinGWのような他の無料オプション。Cで見つけた本当の問題は、C ++のデータ構造、コンテナーのネイティブサポートの欠如です。特定のコンテナーまたは特定のステートメントにどれくらいのコストがかかるかを知ることができます。
user827992Aug

Cではおそらく同じことを行うコードには1つ以上の実装があり、C ++ではこれの結果としてコンパイラがさらに最適化できます。おそらくC ++をもっと勉強する必要がありますが、言語自体ではなく、特定の機能を適切にサポートするためだけにC ++に切り替えると思います。
user827992

7

また、IDソフトウェアがIdTech 4のコードベースをC ++で完全に書き直すことに決めたのも興味深いことです。これは、正直なところ、非常に適切な理由のリストがないと理解できない膨大な量の作業です。

彼らはすべてのリリースでエンジン全体をほとんど書き換えるのが一般的です(少なくとも最近まで-私は最後のいくつかのゲームについてあまり知りません)、そしてC ++の人気が高まっているので、それを使うよりもそれを使うのが理にかなっています時間が経つにつれて、Cに対応できる人が少なくなります。

ある特定の時点で、業界が大規模にC ++に切り替えたのはなぜですか?

それは、Cコードとほぼ完全に後方互換性を持ちながら、より多くの高レベルの機能を提供するからです。

IDが選択した理由は何ですか?

Googleはあなたのためにこれに答えたでしょう:http : //fabiensanglard.net/doom3/interviews.php

「...プログラマの半分は最初は本当にC ++のバックグラウンドを持っていました。私はCとObjective-Cのバックグラウンドを持っていて、C ++の人たちが書いているコードを見るだけで「C ++に移行」しました。使用を開始する前に、言語を徹底的に調査および調査するための時間を確保しておけばよかったのに。

レンダラーコードの大部分はCで開発され、それからC ++にスキン変更されたと言うことができるかもしれません。

今日、私は、C ++が重要なパフォーマンス要件を持つ大規模なマルチ開発者プロジェクトに適した言語であり、Doom 3エクスペリエンスにとってTech 5の方がはるかに優れていると確信しています。」

世界で最も人気のあるOSの1つが立ち入り禁止になっているため、コードを最新のC ++で記述していたとしたら、おそらく今苦痛を感じるでしょう。

  1. プログラマは未来を見ることができません。彼らは、C ++のサポートが不十分な新しいプラットフォームがあることを知りません。Androidは2009年まで適切に存在していませんでした。Doom3は2004年からでした。
  2. PCやコンソール向けの最先端の3Dゲームを書いているプログラマーは、コードが携帯電話でも実行されることを期待していると思いますか?その程度の移植性を目指すことは非常にまれであり、利用可能な電力の大きな違いのためにしばしば無意味です。

2-3リリース古いC ++バージョンを参照するC ++コードを書く必要がありますか?

なぜこれを気にしますか?最新のものを追いかけて捕まらないでください。5年前にそれが十分に良かったなら、今では突然悪化することはありません。


3

さて、C ++は80年代からリリースされているため、コンパイラがサポートしていない場合は、おそらく別のコンパイラを使用する必要があります。また、C ++は実際にはCよりも遅くありません。仮想関数やその他の抽象化を使用してロードした場合にのみ実際に遅くなります。ただし、C ++には柔軟性があり、Cにはない新しい機能があるため、Unix以外の世界で今日多く使用されています。C ++でモジュラーコードを記述することは、Cで行うよりもはるかに簡単で、より移植性の高いコードを記述するのに役立ちます。コンパイラの話題に戻りますが、C ++をサポートしていないコンパイラは知りません(C ++ 11を完全にはサポートしていないかもしれませんが、まともなコンパイラはC ++をサポートする必要があります)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.