ほとんどの一般的なWebブラウザ(Firefox、Chrome、Safari)はC ++を使用して開発されているようです。なぜそうですか?
ほとんどの一般的なWebブラウザ(Firefox、Chrome、Safari)はC ++を使用して開発されているようです。なぜそうですか?
回答:
質問をする別の方法は、ブラウザにどのようなサポートが必要ですか?短いリストは次のとおりです。
ほとんどの言語には、ある種の解析サポートがあります。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 ++ラッパーがなかったら、驚くでしょう。プロセス管理は、JavaやC#よりもC ++内で簡単です(これらの詳細は抽象化されています)。知覚される速度は、生のパフォーマンスよりもハードウェアアクセラレーションによるものです。C ++は、生のC(バウンド文字列など)よりも多くのことを処理しますが、それでも自由に調整できます。
とりあえず、C ++は代替案を排除しています。
私はこれについて小説を書くことを決めました。人々がそれをglossめ、私に賛成してくれることを期待して。いや、いや、冗談だよ!私はあらゆる言葉で苦しみました。すべての言葉、私はあなたに言います!
すべての主要なWebブラウザーは、その起源を90年代までさかのぼることができます。KonquerorはSafariとChromeになりました。NetscapeはFirefoxになりました。IEとOperaは引き続きIEとOperaです。これらのブラウザはすべて、既存の企業で15年間有利なスタートを切っています。
1995年頃に近代的なブラウザが誕生した頃に利用できた、受け入れ可能なクロスプラットフォーム(Windows / Mac / Unixおよびさらに悪い)言語に名前を付けることをお勧めします。C / C ++以外でコアをビルドするには、おそらくコンパイラとプラットフォームライブラリをビルドまたは購入して変更する必要がありました。
楽しみのために、今日の問題について考えてみましょう。はい、代替手段はありますが、まだ大きな問題があります。
言語の選択には、少なくとも次の問題があります。
その言語を知っているか、それを学ぶことができる人々をどこで手に入れますか?これは、OCaml、F#、Haskell、Common Lisp、Dのような、ブラウザをうまく書くのに十分なほど高速で高レベルであるが、たぶんあなたが寛容であっても(10k-100kの範囲で)フォロワーが少ない言語の障害ですすべての愛好家や学者を数えます。
上記のカーゴカルトの答えの結果:
現代であっても、ページのレンダリングとJavascriptの実行の計算集約的な部分には、かなり高速な言語が必要です。GUI要素などを構築するための高レベル言語(たとえば、C ++およびJavascriptのFirefoxアプローチ)でそれを補うこともできますが、言語間の密接な統合が必要です。「わかりました、C#とLua」とは言えません。CまたはC ++を基本言語として選択しない限り、おそらく自分でそのブリッジを構築してデバッグする必要があります。
クロスプラットフォーム開発もワームの別のバッグです。C#またはF#を使用して、GTK#とMonoが将来にわたって正常に機能していることを確認できます。Common Lisp、Haskell、OCamlを試すことができます... Windows と Mac および Linuxですべてが動作するように頑張ってください。
そのすべての後、膨大な量の機能を構築する必要があるため、低レベルの言語を選択する場合、以前よりもさらに膨大な数のコーダーが必要になります。約15年の間、誰も最初からブラウザを最初から構築したことがないことに注意してください。それは部分的には(驚き!)難しいからです。
具体的には、Javascriptインタープリターを持つことは、問題3(1つを取得)または問題4(1つを構築)です。
3プラットフォーム(Windows / Mac / * nix)ブラウザーを今日(2011年初頭)開発した場合、選択肢は何ですか?
今後数年で別の主要なブラウザが登場するのを見ると、オープンソースであろうとプロプライエタリであろうと、CまたはC ++と動的言語(Firefoxのような)で書かれるに違いない。
編集(2013年7月31日):Hacker NewsのコメンターはRust and Goに言及しているようです(特に私の答えとは関係ありません)。これは漠然と「その他の高速」バケットに分類されます。この言語のリストを平等主義で最新のものにしようとすることは負けの戦いになるので、代わりに執筆時点での代表的なサンプルと呼んでいます。
速度
ugいですが、C ++は、高速なアプリケーションとコードの完全な制御が必要なときに使用するものです。
これが、Officeのゲーム、非コアパーツ(ファイルインポーターなど)などがまだC ++で記述されている理由です。
MSaltersからの応答を含めるように編集されました
私は推測することしかできませんが、あなたは複数のプラットフォームを対象とするソフトウェア製品について言及しており、C ++は任意のプラットフォームにコンパイルできます。
(私は約5年間Firefoxに取り組んでいます。)
質問者は、Firefoxのコードの多くがC ++であり、実際、コード行で数えればC ++が大半であることは正しいです(ただし、JavaScriptがたくさんあり、JSはC ++より簡潔)。
しかし実際には、Firefoxは多くの異なる言語で書かれています。
私は確かにいくつかを忘れています。
このリストは、Webブラウザーの背後にある信じられないほどの複雑さを示唆しているため重要です。
はい、Firefoxには多くのC ++コードがあります。そして、それは、C ++がNetscapeが設立されたときのこの種の最高の言語であったという事実と関係があります。しかし、私たちがやっていることの多くにとって、今日より良い言語は存在しないとも私は主張します。
ライブラリのエコシステムがこれほど強力な言語は他にありません(外部コードに大きく依存しています)。C ++のようなフルスタック制御を提供する言語は他にほとんどありません(カスタムヒープアロケーターを定期的に調整し、高速化またはメモリ使用量を削減するためにあらゆる種類のメモリ安全でない処理を行います)。他の言語を使用して、ほとんどの標準ライブラリを適切な方法で再実装することはできません(ニーズに合わせて独自の文字列とコレクションを実装しています)。独自のガベージコレクタを実装できる他の言語はほとんどありません。等々。
C ++は私たちが行うことの多くにとって明らかな選択ですが、Javaでブラウザーを作成し、必要に応じて独自のJVMを作成することを提案する人々は、何かに取り組んでいます。これは基本的に私たちが行うことですが、JavaではなくJavaScriptを使用します。もちろん、ブラウザの多くはJavaScriptで書かれていません。しかし、驚くべき量です。
各ブラウザには、言語の選択に影響を与えるいくつかの歴史があります。
たとえば、ChromeとSafariはどちらもWebKitに基づいています。WebKitは、KDEプロジェクトのKHTMLパーツに由来しています。KDEはもともと(一部)Qt GUIツールキットのデモンストレーションとして作成されたため、KDEは全体としてC ++プロジェクトです。当時、すべての新しいKDEプロジェクトは完全にC ++で記述されていたため、KHTMLの論理的な選択でした。その後、他のGUIツールキットを使用するために移植されました。
OperaのPrestoエンジンは、パフォーマンスと小さなバイナリサイズを考慮して作成されました。C++が論理的な選択でした。
MicrosoftのIEはActiveXコンポーネントのコレクションとして書かれており、COMバインディングを持つ任意の言語で記述できますが、C ++のサブセットで記述されている可能性があります。コードベースの大部分は既にその言語で記述されているためです。
NetscapeのMozillaは、移植性が彼らの主要な関心事だったため、おそらくC ++で書かれました。CおよびC ++コンパイラは(事実上)遍在するため、論理的な選択でした。
これらの選択に固有の技術的理由はありません。それは「当時は良いアイデアのようでした」。
CとC ++でのネットワークは、必要に応じてライブラリを使用する必要がないため、最適化が容易です。C ++がCの利点を可能にするため、C ++が最適な言語であると思われます。
OOPの利点と相まって:
ブラウザの最初のラウンドのコードの最初の行が記述されたとき、C#とJavaは存在しませんでした。Rubyもそうではありませんでした。Pythonはあったかもしれませんが、その時点ではまだ小さな自作プロジェクトでした。
基本的に、高速で多くの異なるプラットフォームで実行できるブラウザを構築できるC ++ 以外の選択肢はありませんでした。
では、なぜC ++で書かれたのでしょうか?なぜならそれが彼らが書くことができる唯一の利用可能な言語だったからです。
なぜなら、他の言語で書かれたブラウザ(たとえば、Javaで書かれたHotJava)は、市場で十分な受け入れ/浸透が達成されたことがないからです。
HotJava の現在のイテレーション(または最新の-かなり長い間更新されていない)については何も言えませんが、試してみたところ、市場浸透の欠如は(少なくとも私には)非常に理解しやすいようでした-それはく、遅く、かなりの数のWebページと互換性がありませんでした。最終的に、それはパンアウトすることのない前提に基づいているように見えました:Webは主にJavaアプレットで構成され、HTMLはどのアプレットをどこに表示するかを伝えるラッパーにすぎません。
その一部はおそらく歴史的なものでもあります。大規模なWebブラウザのほとんどは長い間使用されてきました。それらが最初に書かれたとき、景観は大きく異なっていました。C++は「ホットな」新しい言語であったため、多くの新しい開発に使用されていました。ブラウザは、最も頻繁に使用されるソフトウェアの一部になりましたが、当時の多くのブラウザは忘れ去られていました。
言語の表示された「態度」にも効果があると思います。C++(以前のCと同様)は常に実用性と実用主義を強調してきました。その基本的な態度は、実用的でもあるプログラマを引き付ける傾向があります。他の多くの言語では、優雅さなどに重点を置いていますが、そうすることで、同じように考えるプログラマーを惹きつけています。それに関する問題は、私が「Lisp効果」と呼ぶものです。症状は次のとおりです。
他にもありますが、一般的なアイデアは得られます(そして、はい、ある程度誇張していますが、ある程度だけです)。はい、あなたが得るコードのいくつかは驚くほど美しいです-しかし、チャンスはそれが6ヶ月遅れており、システム内の(あるはずの)コードの他のすべての部分とほとんど互換性がなく、あなたがそれを受け取るまでに他の何かがあなたがそれをまったく使用できないほど十分に変化したかなり公平なチャンス。
間違いなく正常に動作する言語もありますが、(正しいか間違って)単純にブラウザを記述したことのある市場シェアをまったく持っていません(または重要な時に持っていませんでした)。完全なブラウザのサイズと複雑さを考えると、多くの人とブラウザを開発するのにかなりの時間がかかります。この種の投資により、多くの人は開発ツールなどについて比較的保守的になります。
gets
。これはひどい機能ですが、やむを得ないことはほとんどありません(また、言語やそのようなものに「根本的」ではありません)。第二に、C ++はどの場合でもCと同じ言語ではありません。第三に、OpenBSDはセキュアなソフトウェアがCで作成でき、Cで作成されていることを非常にうまく示しています。人。
gets
は、使用しているバッファの長さを渡さないという単純な結果です。言語に関する基本的なことは何もありません。Pascalでも同じことができます(そして私も持っています)。インテリジェントな攻撃者に対して安全なソフトウェアを書くことは、言語に関係なく簡単ではありません。3つのすべての経験に基づいて、それはパスカルよりもCで少し簡単だし、たくさん C.よりもC ++で簡単に
カーゴカルトプログラミング。「C ++は高速」という認識はまだあります(物事の速度を落とす、ひどく壊れたオブジェクトモデルのようなよく考えられていない言語レベルの機能にもかかわらず)人々はブラウザを高速にしたいので、C ++で記述します。 。
健全な世界では、ネットワーク対応ソフトウェアを作成する人は、C固有のセキュリティ問題のすべてに付随する言語を使用することを考えるだけで恐ろしくなり、実際にそうすることは刑事過失の行為になります。(過去15年ほどでさまざまなブラウザーに対して発見されたバッファーオーバーフローエクスプロイトの数だけを見てください!これらのコーダーが責任を負うのは何百万ドルの損害ですか?)
高速バイナリを作成できるコンパイル済み言語は他にもあります。問題は、彼らがCファミリーと同じ露出をしていないことであり、私たち全員がそれのために苦しむ必要があります。
おもしろい事実:1988年にMorris Wormがインターネットにヒットするまでに、CでのOSとネットワーク対応ソフトウェアの記述に関する問題を最終的に実証しました(これらは言語の固有の欠陥であるため、今日でも解決されていません) 、)Appleは、これまで数年にわたり、Pascalで書かれた世界でこれまでに見てきた最も先進的なオペレーティングシステムをリリースしてきました。
C ++と他の言語のメリットとは何の関係もありません。Haskellのような言語で、より優れたブラウザーをゼロから確実に作成できます。この重要なプロジェクトは、パフォーマンス特性を保証する必要がある場合、独自のJVMを実装することさえできます。Facebookが独自のPHPコンパイラ/オプティマイザーを作成した方法と同様です。
非標準のマークアップで壊れるブラウザは、役に立たないよりも悪いです。レガシーコンパットは非常に重要かつ複雑であるため、書き換えはオプションではありません。多くのお金と時間は、戦闘でテストされたセキュリティなどに投資されています。その投資を捨てることはできません。繰り返しになりますが、Facebook がまだ PHPで記述されているように。