web-dev-qa-db-ja.com

ほとんどのブラウザがC ++で開発されているのはなぜですか

ほとんどの一般的なWebブラウザー(Firefox、Chrome、Safari)はC++を使用して開発されているようです。なぜですか?

101
Nipuna

質問をする別の方法は、ブラウザがどのようなサポートを必要とするかということです。短いリストは次のとおりです。

  • 解析のサポート([X] HTML、CSS、および[ECMA/Java] Scriptを理解するために必要)
  • ツリーウォーキング/解釈機能(UIの解析と構築の一部)
  • 加速されたグラフィックのサポート
  • 高速ネットワーキング
  • より高度なブラウザの場合:プロセスの制御とページ間のメモリの分離
  • サポートされているすべてのプラットフォームで動作する必要があります

ほとんどの言語はある種の解析をサポートしています。 C、C++、C#、Javaなどのパーサージェネレーターがあります。ただし、CとC++は、残りの代替手段を数年前から始めているため、アルゴリズムと実装はより成熟しています。 Java=でアクセラレートされたグラフィックスにアクセスすることは、それを機能させるためのネイティブ拡張がない限り、実行する必要はありません。C#上のWPFはアクセラレートされたグラフィックスへのアクセスを提供しますが、本格的なブラウザを構築するには新しすぎますテクノロジーで。

JavaまたはC#ではなく、C++を選択する理由の中で、ネットワーキングは実際には最小です。その理由は、ページを表示するために行われる残りの処理よりも通信が何倍も遅いためです。ワイヤーの速度が制限要因です。JavaとC#には、C++と同様に、ノンブロッキングIOサポートがあります。したがって、この地域。

なぜJavaではないのですか? JavaでUIを構築しようとしたことがありますか?それは他のどこよりも面倒で遅いと感じます。アクセラレートされたグラフィックスは、ここで大きな欠点でもありません。 Javaのサンドボックス化は非常に優れており、正しく使用すればブラウザーのセキュリティーを向上させることができますが、構成して作業するのは面倒です。言うまでもなく、グラフィック形式のサポートは、最新のほとんどのブラウザーよりも遅れています。

なぜC#ではないのですか?唯一のターゲットがWindowsの場合、C#は実際に適切な表現をする可能性があります。問題は、何か他のものをサポートしたいときに発生します。 Monoは、特に高速化されたグラフィックサポートとWPFを使用して、このタスクに十分なクロスプラットフォームと見なされるほど十分に追いついていません。それが変わるのにどれくらい時間がかかるか誰が知っています。

なぜCではないのですか?そこにあるほとんどすべてのプラットフォーム(組み込みデバイスを含む)用のCコンパイラがあります。ただし、Cが行うことが行わないことには、注意が必要なことがたくさんあります。 APIの最下位レベルすべてにアクセスできますが、C開発者の大多数はGUIを実行しません。 C GUIライブラリでさえ、オブジェクト指向で書かれています。 UIについて話し始めるとすぐに、オブジェクト指向言語はより適切な意味を持ち始めます。

なぜObjective Cではないのですか?唯一のターゲットがAppleであれば、それは非常に理にかなっています。ただし、ほとんどの開発者はObjective-Cを知りません。それを学ぶ唯一の理由は、NeXTまたはAppleボックスで作業することです。Objective-Cで任意のCライブラリを使用できます。多くのプラットフォーム用のコンパイラがありますが、それに取り組む人を見つけるのは少し難しいでしょう。誰が知っているのでしょうか?Appleは、この認識された欠陥を回避できるでしょう.

C++を選ぶ理由ほぼすべてのプラットフォームに対応するC++コンパイラがあります。ほとんどすべてのGUIライブラリにはC++インターフェイスがあり、それが優れている場合もあれば、まったく異なる場合もあります。たとえば、MicrosoftのATLは、win32 C関数呼び出しやMFCライブラリよりもはるかに優れています。 UnixにはGTK用のC++ラッパーがあり、誰かがAppleのObjective-C GUIライブラリの周りにC++ラッパーを持っていなかったとしたら驚きます。 C++内でのプロセス管理は、JavaまたはC#(これらの詳細は抽象化されています)よりも簡単です。速度はハードウェアアクセラレーションのほうが生のパフォーマンスよりも優れていると考えられています。C++はより多くのことを処理します生のC(バインドされた文字列など)よりも便利ですが、Tweakを自由に行うことができます。Webページのレンダリングに必要な多数のライブラリもCまたはC++で記述されています。

とりあえず、C++は代替案を除外します。

165
Berin Loritsch

私はこれについて小説を書くことにしました。いやいや、冗談だよ!すべての言葉に苦しみました。すべての言葉、私はあなたに言います!

「なぜ」の前に「いつ」を尋ねる

すべての主要なWebブラウザは、その起源を90年代までさかのぼることができます。 KonquerorはSafariとChromeになりました。 NetscapeはFirefoxになりました。 IEとOperaは、まだIEとOperaです。これらのブラウザはすべて、15年前から現職をしています。

私はあなたがnameを試してみることをお勧めします発生した。 C/C++以外でコアをビルドするには、コンパイラとプラットフォームライブラリをビルドまたは購入して変更する必要があったでしょう。

今日はどう?代替案は何ですか?

楽しみのために、今日の問題について考えてみましょう。はい、代替案はありますが、依然として大きな問題があります。

言語の選択には、少なくとも次の問題があります。

  1. 知識の問題-開発者の雇用/トレーニングまたは貢献者の誘致
  2. 組織的/社会的問題-言語の受け入れ
  3. 言語の実装:速度、プラットフォームサポート、ツール
  4. 言語力

1:知識の問題

その言語を知っている人やその言語を学べる人はどこにいますか?これは、OCaml、F#、Haskell、Common LISP、Dなどの言語で、ブラウザをうまく書けるほど高速で十分なレベルの障害ですが、自由自在に作成してもフォロワーが少ない(おそらく10k〜100kの範囲)すべての愛好家や学者を数えます。

2:社会的/組織的な問題

上記のカーゴカルト回答の帰結:

  • C、C++、C#、またはJavaを使用していないオープンソースブラウザは、想定される寄稿者に問題があります。
  • C、C++、C#、またはJava=を使用していない独自仕様のブラウザは、ほとんどの組織でプロジェクトマネージャに激怒します。

3.技術的な問題

現代でも、ページのレンダリングとJavaScriptの実行の計算集中型の部分には、かなり高速な言語が必要です。 GUI要素を構築するための高水準言語などでそれを補足することを選択できます(たとえば、C++およびJavascriptのFirefoxアプローチ)。ただし、言語間を緊密に統合する必要があります。 「OK、C#とLua」とだけ言うことはできません。ベース言語としてCまたはC++を選択しない限り、おそらく自分でそのブリッジを構築してデバッグする必要があります。

クロスプラットフォーム開発は、ワームのもう1つのバッグです。 C#またはF#を使用して、GTK#とMonoが将来も健在であることを理解することができます。 Common LISP、Haskell、OCamlを試すことができます... WindowsおよびMacおよびLinux。

4.言語力

結局のところ、膨大な量の機能を構築する必要があるため、低水準言語を選択する場合は、以前よりもさらに多くのプログラマーが必要になります。約15年間、実際にブラウザをゼロから構築した人はいないことに注意してください。 (サプライズ!)難しいからという理由もあります。

具体的には、Javascriptインタープリターを持つことは、問題3(1つを取得)または問題4(1つをビルド)です。

結論:

今日(2011年初頭)に3つのプラットフォーム(Windows/Mac/* nix)ブラウザーを開発した場合、どのような選択肢がありますか?

  • C:(2)を参照してください。誰もがC++を強く要求するでしょう。クロスプラットフォームツールキットの選択または1つ(1、2、3、および4)の構築を楽しんでください。 (4)も参照してください。その中に安定した安全なブラウザを構築する楽しみがあります。
  • C++:クロスプラットフォームのツールキットを選択したり、ツールキット(1、2、3、4)を構築したりしてください。楽しんでください(4)安定した安全なブラウザを構築してください。
  • CまたはC++およびHLL:最善の策。動的言語についての毒を選択してください。 (1)と(2)を参照してください。良い言語が多すぎ、それぞれのフォロワーが少なすぎる。 (1、2、3、4)ツールキット。
  • Java:中間管理職を満足させる必要がある場合は、2番目の最善策。 (4)を参照してください。 Java=で巨大なものを構築するには、このリストの他のどれよりも多くのコードが必要ですが、おそらくCです。
  • Scala:Beats Java on(4);(1)and(2)ですが、それは追いついています。
  • CとJavaScript:特別なケースとして、これは魅力的です。Javascriptインタープリターを構築または取得して、同化する必要があるからです。 (したがってFirefox。)(1、2、3、4)ツールキット。 Mozillaの人々は独自のIIRCを構築しました。
  • C#:(3)を楽しんでください。あなたはおそらくGTK#で立ち往生していますが、それが良いか、GTK#とWindowsフォームの上に独自のレイヤーとレンダラーを構築しています。
  • Ruby/Python/Perl/Racket/Lua/Erlangeなど:クロスプラットフォームのウィジェットライブラリと速度を(3)持っています。ムーアの法則は(4)についてあなたと共にあります。ブラウザへの需要の高まりはあなたに反しています。
  • OCaml、Haskell、Common LISP、Smalltalk:(1)および(2)スペード。おそらく速度の問題はありませんが、(3)クロスプラットフォーム開発の場合、独自のすべてを構築するか、何らかの方法でC/C++ライブラリにブリッジする必要があります。
  • Objective-C:(3)クロスプラットフォーム開発がここでどのように機能するかわかりません。

今後数年の間に別の主要なブラウザが登場するとしたら、それはCまたはC++で記述され、オープンソースであろうとプロプライエタリであろうと動的言語(Firefoxのような)で書かれるでしょう。

編集(2013年7月31日):ハッカーニュースのコメンターは、RustとGo(特に私の回答とは関係ありません)について言及しているようです。 「その他の高速」バケット。この平等主義言語のリストを最新の状態に保つことは困難な戦いになるので、代わりに、執筆時およびそれをそのままにした時点での代表的なサンプルと呼びます。

89
Jesse Millikan

速度

醜いとしても、C++は、高速なアプリケーションとコードの完全な制御が必要な場合に使用します。

これが、ゲーム、Officeの非コアパーツ(ファイルインポーターなど)などがまだC++で記述されている理由です。

MSaltersからの応答を含むように編集されました

36
Ryan Hayes

携帯性

私は推測することしかできませんが、複数のプラットフォームをターゲットとするソフトウェア製品について言及しています。C++は任意のプラットフォームにコンパイルできます。

17
Pete

(約5年間Firefoxに取り組んでいます。)

質問者は、Firefoxのコードの多くがC++であり、実際にはコード行で数えるとC++が大多数です(ただし、JavaScriptが多く、JSの方が多いので、全体の話はわかりません) C++よりも簡潔です)。

しかし実際には、Firefoxはさまざまな言語で書かれています。

  • C++
  • C (NSS, NSPR, various libraries we've imported)
  • x86およびARMアセンブリ
  • JavaScript
  • XUL(HTMLのようなマークアップ言語)とCSS
  • Objective C(MacOSのみのコード)
  • Java(Androidのみのコード)
  • 複数のカスタムインターフェイス定義言語(XPIDL、IPDL)
  • WebIDL(別のインターフェイス定義言語ですが、これはカスタムではありませんが、コードジェネレーターはカスタムです)
  • Python(コードジェネレータ)

きっと忘れてしまいます。

このリストは、Webブラウザーの背後にある信じられないほどの複雑さを示しているため、重要です。

はい、Firefoxには多くのC++コードが含まれています。これは、Netscapeが設立されたとき、C++がこの種のことで最も優れた言語であったという事実と関係があります。しかし、私たちが行う多くのことについて、今日よりよい言語は存在しないとも私は主張します。

ライブラリのエコシステムほど強力な言語は他にありません(外部コードに大きく依存しています)。 C++のようなフルスタックコントロールを提供する言語は他にほとんどありません(私たちは定期的にカスタムヒープアロケーターを微調整し、あらゆる種類のメモリ安全でないことを高速化するか、使用するメモリを少なくしています)。他の言語では、ほとんどの標準ライブラリを正常な方法で再実装できません(独自の文字列とコレクションの実装があり、ニーズに合わせて調整されています)。他の言語では、独自のガベージコレクターを実装できません。等々。

C++は私たちの多くの活動にとって明らかな選択ですが、ブラウザをJavaで記述し、必要に応じて独自のJVMを記述できると示唆している人は、何かに取り組んでいます。これは基本的にJavaの代わりにJavaScriptを使用していますが、ブラウザーの多くはJavaScriptで作成されていません。

13
Justin L.

そうですね、これらの製品の開発者に直接問い合わせてもらう必要がありますthe回答ですが、これは親しみやすさ(開発者が最もよく知っていること)、パフォーマンス(ネイティブバイナリへのコンパイル)の組み合わせだと思います。バイトコードとは対照的に)、ツール(Cなどの言語と比較して、C++にはSTLのようなニースの省力ガジェットがたくさんあります)。

12
John Bode

歴史

各ブラウザには、言語の選択に影響を与えたいくつかの歴史があります。

たとえば、ChromeとSafariはどちらも、KDEプロジェクトのKHTML部分に起源を持つWebKitに基づいています。KDEは、もともと(部分的に)Qt GUIツールキットのデモとして作成されたため、 KDEは全体としてC++プロジェクトです。現時点では、すべての新しいKDEプロジェクトは完全にC++で記述されていたため、KHTMLの論理的な選択でした。それ以来、他のGUIツールキットを使用するように移植されました。

OperaのPrestoエンジンは、パフォーマンスと小さなバイナリサイズを念頭に置いて作成されました。C++が論理的な選択でした。

MicrosoftのIEは、ActiveXコンポーネントのコレクションとして作成されました。これは、COMバインディングを持つ任意の言語で作成できますが、C++のサブセットで作成された可能性があります。その言語ですでに書かれています。

NetscapeのMozillaはC++で作成されたのは、おそらく移植性が彼らの主な関心事だったからです。 CおよびC++コンパイラーは(事実上)ユビキタスなので、論理的な選択でした。

これらの選択には固有の技術理由はありません。 「当時は良いアイデアのように見えた」だけです。

10
greyfade

CおよびC++でのネットワーキングは、必要に応じてライブラリを使用する必要がないため、最適化が簡単です。 C++がCの利点を可能にするので、C++が最適な言語だと思います。

  • 速度
  • 最適化
  • ある程度の移植性
  • 解釈されないコンパイル済み言語

oOPの利点と相まって:

  • 拡張性
  • より簡単な視覚化
  • 文字列処理やデータ構造などの重要でないタスクに対するライブラリサポートの向上
8
Michael K

ブラウザーの最初のラウンドのコードの最初の行が書かれたとき、C#とJavaは存在しませんでした。Rubyも存在しませんでした。Pythonは周りにあったかもしれませんが、しかし、それはその時点ではまだ小さな自作プロジェクトでした。

基本的に、C-++以外にも実際には他の選択肢がありますがあり、高速で多くの異なるプラットフォームで実行できるブラウザを構築できます。

では、なぜC++で記述されたのでしょうか。なぜなら、それは彼らが書くことができる利用可能な唯一の言語だったからです。

4
GrandmasterB

他の言語で記述されたブラウザー(例:HotJava、明らかにJavaで十分)は、市場で受け入れられ、浸透されたことはありません。

私はHotJavaのcurrentイテレーション(または最新のもの-しばらく更新されていない)については何も言えませんが、試したところ、市場への浸透が見られなかったようです(少なくとも私にとっては)非常に理解しやすい-醜く、遅く、かなりの数のWebページと互換性がなかった。結局のところ、それはパンニングされないという前提に基づいているように見えました。Webは主にJavaアプレットで構成され、HTMLはラッパーにすぎず、どのアプレットをどこに表示するかを指示するだけです。

その一部はおそらく歴史的なものでもあります。ほとんどの大きなWebブラウザーは長い間使用されてきました。それらが最初に書かれたとき、状況は大きく異なっていました。C++は「ホット」な新しい言語だったので、多くの新しい開発に使用されていました。ブラウザは、最も頻繁に使用されるソフトウェアの一部になりましたが、それ以外の多くのブラウザは時代遅れになりました。

言語の表示された「態度」にも影響があると思います。C++(以前のCと同様)は常に実用性と実用性を強調してきました。その基本的な態度は、実用的であるプログラマーを引き付ける傾向があります。他の多くの言語は、優雅さなどに非常に重点を置いています。そうすることで、同じように考えるプログラマーを惹きつけます。その問題は、私が「LISP効果」と呼んでいるものです。症状は次のとおりです。

  1. mostについての無限の議論は、最も些細なことのエレガントな実装です。
  2. 機能をフリーズして出荷できるものを完成させることができない(欠陥がある場合でも)
  3. 妥協できない。私に反対する人は誰でも間違っているのではなく、愚かで悪であるに違いありません。

もっとありますが、あなたは一般的な考えを理解します(そして、はい、私はある程度誇張していますが、ある程度だけです)。ええ、あなたが手に入れるコードのいくつかは驚くほど美しいでしょう-しかし、それはおそらく6ヶ月遅れであり、システム内の(本来あるべきもの)の他のすべてのコードとほとんど互換性がなく、それを受け取るまでに他の何かが十分に変更されて、まったく使用できない可能性がかなり高いです。

間違いなく正常に動作する言語もありますが、(正しいか間違っているかを問わず)、ブラウザを作成したことのあるユーザーが市場シェアを持っていない(または重要な時期になかった)場合があります。完全なブラウザーのサイズと複雑さを考えると、ブラウザーの開発には多くの人とかなりの時間がかかります。そのような投資により、多くの人々は開発ツールのようなものについて比較的保守的になります。

4
Jerry Coffin

カーゴカルトプログラミング。 「C++は高速である」という認識はまだ存在しており(物事を遅くする、ひどく壊れたオブジェクトモデルのような、十分に考えられていない言語レベルの機能にもかかわらず)、人々は、ブラウザーが高速であることを望んでいるため、C++で記述します。

正気の世界では、ネットワークに面したソフトウェアを書いている人々は、Cの固有のセキュリティ問題すべてに対応した言語を使用するという単なる考えに恐怖を感じ、実際にそうすることは犯罪過失の行為になるでしょう。 (過去15年間で、さまざまなブラウザーに対してバッファオーバーフローのエクスプロイトがいくつ発見されたかを確認してください。これらのコーダーは何百万ドルの損害を被っていますか?)

高速バイナリを作成できるコンパイル済み言語は他にもあります。問題は、彼らがCファミリーと同じエクスポージャーを持っていないことであり、私たち全員がそれに苦しむ必要があります。

おもしろい事実:1988年にモリスワームがインターネットを襲ったときまでに、OSとネットワーク向けソフトウェアをCで作成する際の問題を明確に示しています(これらは言語の本質的な欠陥であるため、今日まで解決されていません) 、)Appleは、Pascalで書かれた、すでに数年間、世界がこれまでに見た中で最も先進的なオペレーティングシステムをリリースしていました。

3
Mason Wheeler

システムレベルのAPIへのアクセス

すべてのブラウザーは、ある時点でOSとインターフェースする必要があり、主要なOSのほとんどは、確立されたCおよびC++ APIおよびライブラリーを備えています。通常、ラッパーを作成するよりも、CまたはC++でこれらのAPIを使用する方が簡単です。

2
TMN

レガシー互換性-古いコードを捨てることはできません

C++と他の言語の利点とは何の関係もありません。 Haskellのような言語を使用すれば、より優れたブラウザーを最初から作成できます。この重要なプロジェクトは、パフォーマンス特性を保証する必要がある場合、独自のJVMを実装することもできます。 Facebookが独自のPHPコンパイラ/オプティマイザを作成した方法と同様に。

非標準のマークアップで壊れるブラウザは、役に立たないよりも悪いです。レガシー互換は非常に重要であり、非常に複雑であるため、書き換えはオプションではありません。多くのお金と時間は、テスト済みのセキュリティなどに投資されています。その投資を捨てることはできません。繰り返しになりますが、Facebookのようにまだ PHPで記述されています。

0
Dustin Getz

制御と移植性

ほとんどの速度の引数はどちらの方向にも行くことができますが、何かが行われる方法を正確に制御する必要がある場合は、多くの高水準言語がパレードに雨が降ります。これには例外がありますが、それらのほとんどは、ブラウザのようなもので数えるのに十分なクロスプラットフォームではありません。

0
Bill