web-dev-qa-db-fra.com

Pourquoi la plupart des navigateurs sont-ils développés en C ++

Il semble que la plupart des navigateurs Web courants (Firefox, Chrome, Safari) soient développés en C++. Pourquoi est-ce ainsi?

101
Nipuna

Une autre façon de poser la question est de quel type de support un navigateur a-t-il besoin? La liste restreinte est:

  • Prise en charge de l'analyse (nécessaire pour donner un sens aux scripts [X] HTML, CSS et [ECMA/Java])
  • Fonctionnalités de marche/interprétation d'arbre (partie de l'analyse et de la construction de l'interface utilisateur)
  • Prise en charge des graphiques accélérés
  • Mise en réseau rapide
  • Pour les navigateurs les plus avancés: contrôle des processus et isolation de la mémoire entre les pages
  • Doit fonctionner sur toutes les plateformes prises en charge

La plupart des langues ont une sorte de support d'analyse. Vous avez des générateurs d'analyseurs pour C, C++, C #, Java, etc. Cependant, C et C++ ont quelques années d'avance sur le reste des alternatives afin que les algorithmes et implémentations soient plus matures. Accéder aux graphiques accélérés dans Java est un pas, sauf si vous avez des extensions natives pour le faire fonctionner. WPF sur C # donne accès aux graphiques accélérés, mais il est trop nouveau d'avoir un navigateur sérieux construit avec la technologie.

La mise en réseau est en fait la moindre des raisons de choisir C++ plutôt que Java ou C #. La raison en est que la communication est beaucoup plus lente que le reste du traitement qui continue pour afficher la page. Le brut la vitesse du fil est le facteur limitant. Les deux Java et C # ont un support non bloquant IO support, tout comme C++. Donc il n'y a vraiment pas de gagnant clair dans cette zone.

Pourquoi pas Java? Avez-vous déjà essayé de construire une interface utilisateur avec Java? Cela semble lourd et lent par rapport à n'importe quoi d'autre, car c'est le cas. Aucun graphique accéléré n'est également un gros point négatif ici. Le sandboxing de Java est vraiment bon, et peut aider à améliorer la sécurité d'un navigateur s'il est utilisé correctement, mais c'est difficile à configurer et à faire fonctionner. Sans parler de la prise en charge du format graphique derrière la plupart des navigateurs modernes.

Pourquoi pas C #? Si votre seule cible est Windows, C # pourrait en fait faire une bonne représentation. Le problème survient lorsque vous souhaitez prendre en charge autre chose. Mono n'a pas assez rattrapé pour être considéré comme suffisamment multiplateforme pour cette tâche - en particulier avec la prise en charge graphique accélérée et WPF. Qui sait combien de temps cela prendra pour changer.

Pourquoi pas C? Il existe un compilateur C pour à peu près toutes les plates-formes (y compris les périphériques intégrés). Cependant, il y a beaucoup de choses que C ne fait pas pour lesquelles vous devrez être très vigilant. Vous avez accès à tous les niveaux les plus bas des API, mais la majorité des développeurs C ne font pas d'interfaces graphiques. Même les bibliothèques C GUI sont écrites de manière orientée objet. Dès que vous commencez à parler d'interface utilisateur, un langage orienté objet commence à avoir plus de sens.

Pourquoi pas l'objectif C? Si votre seule cible est Apple, cela a beaucoup de sens. Cependant, la plupart des développeurs ne connaissent pas Objective-C, et la seule raison de l'apprendre est de travailler sur NeXT ou Apple cases. Bien sûr, vous pouvez utiliser n'importe quelle bibliothèque C avec Objective-C, et il existe des compilateurs pour de nombreuses plates-formes, mais trouver des personnes pour y travailler sera un peu plus difficile. Qui sait? Peut-être Apple peut inverser cette lacune perçue.

Pourquoi C++? Il existe un compilateur C++ pour à peu près toutes les plateformes. Presque toutes les bibliothèques GUI ont une interface C++, parfois c'est mieux et parfois c'est juste différent. Par exemple, l'ATL de Microsoft est bien meilleur que les appels de fonction win32 C ou même la bibliothèque MFC. Il existe des wrappers C++ pour GTK sur Unix, et je serais surpris si quelqu'un n'avait pas de wrapper C++ autour de la bibliothèque GUI Objective-C d'Apple. La gestion des processus est plus facile en C++ que Java ou C # (ces détails sont abstraits pour vous). Sa vitesse perçue provient plus de l'accélération matérielle que des performances brutes. C++ s'occupe de plus de choses pour vous que le C brut (comme les chaînes limitées), mais vous donne toujours la liberté de modifier les choses. Sans oublier un certain nombre de bibliothèques nécessaires pour rendre les pages Web sont également écrites en C ou C++.

Pour le moment, C++ fait Edge sur les alternatives.

165
Berin Loritsch

J'ai décidé d'écrire un roman à ce sujet dans l'espoir que les gens s'en occuperont et me voteront. Non, non, je plaisante! J'ai souffert sur chaque Parole. Chaque mot, je vous le dis!

Demandez "quand" avant "pourquoi"

Tous les principaux navigateurs Web peuvent retracer leurs origines dans les années 90. Konqueror est devenu Safari et Chrome; Netscape est devenu Firefox; IE et Opera sont toujours IE et Opera. Ces navigateurs ont tous 15 ans d'avance sur les opérateurs historiques).

Je vous suggère même d'essayer de nommer une langue multiplateforme acceptable (Windows/Mac/Unix et pire encore) qui était disponible vers 1995 lorsque les navigateurs modernes originaire. Pour construire le cœur en tout sauf C/C++, vous auriez probablement dû construire ou acheter et modifier un compilateur et des bibliothèques de plate-forme.

Pourquoi pas aujourd'hui? Quelles sont les alternatives?

Juste pour le plaisir, réfléchissons au problème aujourd'hui. Oui, il existe des alternatives, mais il reste des problèmes majeurs.

Le choix de la langue présente au moins ces problèmes:

  1. Problèmes de connaissances - Embaucher/former des développeurs ou attirer des contributeurs
  2. Problèmes organisationnels/sociaux - Acceptation de la langue
  3. Implémentation du langage: vitesse, support de plateforme, outillage
  4. Pouvoir linguistique

1: Problèmes de connaissances

Où trouver des gens qui connaissent la langue ou peuvent l'apprendre? C'est un obstacle pour les langages comme OCaml, F #, Haskell, Common LISP et D qui sont suffisamment rapides et de haut niveau pour écrire un navigateur correctement, mais qui ont peu de followers (dans la gamme 10k-100k, peut-être) même si vous le faites généreusement compter tous les amateurs et universitaires.

2: Problèmes sociaux/organisationnels

Corollaire de la réponse culte à la cargaison ci-dessus:

  • Un navigateur open source n'utilisant pas C, C++, C # ou Java aura soi-disant aura des difficultés avec les contributeurs.
  • Un navigateur propriétaire n'utilisant pas C, C++, C # ou Java provoquera de vives critiques de la part des chefs de projet dans la plupart des organisations.

3. Problèmes techniques

Même dans les temps modernes, vous avez besoin d'un langage assez rapide pour les parties de calcul intensives du rendu des pages et de l'exécution de Javascript. Vous pouvez choisir de compléter cela avec un langage de haut niveau pour construire des éléments GUI, etc. (par exemple l'approche Firefox de C++ et Javascript) mais vous devez avoir une intégration étroite entre les langages; vous ne pouvez pas simplement dire "D'accord, C # et Lua." Vous devrez probablement créer et déboguer ce pont vous-même, sauf si vous choisissez C ou C++ comme langage de base.

Le développement multiplateforme est un autre sac de vers. Vous pouvez utiliser C # ou F # et croiser les doigts sur GTK # et Mono étant en vie à l'avenir. Vous pouvez essayer Common LISP, Haskell, OCaml ... Bonne chance pour que tout fonctionne sur Windows et Mac et Linux.

4. Puissance linguistique

Après tout cela, vous devez créer une énorme quantité de fonctionnalités, donc si vous choisissez un langage de bas niveau, vous avez besoin d'une armée de codeurs encore plus puissante qu'auparavant. Notez que personne n'a vraiment construit un navigateur à partir de zéro depuis une quinzaine d'années. C'est en partie parce que (surprise!) C'est difficile.

Plus précisément, avoir un interpréteur Javascript est le problème 3 (en acquérir un) ou le problème 4 (en construire un).

Conclusion:

Si vous avez développé un navigateur à trois plates-formes (Windows/Mac/* nix) aujourd'hui (début 2011), quels sont certains des choix?

  • C: Voir (2). Tout le monde va réclamer C++. Amusez-vous à sélectionner une boîte à outils multiplateforme ou à en créer une (1, 2, 3 et 4). Voir aussi (4); amusez-vous à y construire un navigateur stable et sécurisé.
  • C++: Amusez-vous à sélectionner une boîte à outils multiplateforme ou à en créer une (1, 2, 3 et 4). Amusez-vous (4) à y construire un navigateur stable et sécurisé.
  • C ou C++ et HLL: votre meilleur choix. Choisissez votre poison sur le langage dynamique; Voir (1) et (2). Trop de bonnes langues, trop peu d'adeptes de chacune. (1, 2, 3 et 4) sur la boîte à outils.
  • Java: deuxième meilleur choix, si vous devez plaire à la direction. Voir (4); construire des choses énormes en Java prend beaucoup plus de code que dans toute autre chose sur cette liste mais peut-être C.
  • Scala: Beats Java on (4); (1) and (2) but it is catching on.).
  • C et Javascript: Dans un cas particulier, cela est attrayant car vous devez déjà construire ou acquérir et assimiler l'interpréteur Javascript. (D'où Firefox.) (1, 2, 3 et 4) sur la boîte à outils; le peuple Mozilla a construit son propre IIRC.
  • C #: Amusez-vous (3). Vous êtes probablement bloqué avec GTK #, aussi bon soit-il, ou créez votre propre calque et rendu au-dessus de GTK # et de Windows Forms.
  • Ruby/Python/Perl/Racket/Lua/Erlange etc.: Vous avez (3) sur les bibliothèques de widgets multiplateformes et la vitesse. La loi de Moore est avec vous le (4); la demande croissante sur les navigateurs est contre vous.
  • OCaml, Haskell, LISP commun, Smalltalk: (1) et (2) à la pelle. Aucun problème de vitesse, probablement, mais (3) pour le développement multiplateforme, et vous devrez tout créer vous-même ou faire le pont vers les bibliothèques C/C++.
  • Objectif-C: (3) Je ne sais pas comment le développement multiplateforme fonctionnerait ici.

Si nous voyons un autre navigateur majeur augmenter dans les prochaines années, je parierais qu'il sera écrit en C ou C++ et dans un langage dynamique (comme Firefox), qu'il soit open source ou propriétaire.

Edit (31 juillet 2013): Les commentateurs de Hacker News semblent mentionner Rust et Go (pas spécifiquement en rapport avec ma réponse), qui tombent vaguement dans le "Divers rapide". Essayer de garder cette liste de langues égalitaire et à jour sera une bataille perdue, donc je l'appelle un échantillon représentatif au moment de la rédaction et je la laisse tranquille.

89
Jesse Millikan

Vitesse

Aussi laid qu'il soit, le C++ est toujours ce que vous utilisez lorsque vous voulez une application rapide et un contrôle total sur le code.

C'est pourquoi les jeux, les parties non essentielles (telles que les importateurs de fichiers) d'Office, et plus encore, sont toujours écrits en C++.

Modifié pour inclure la réponse de MSalters

36
Ryan Hayes

Portabilité

Je ne peux que deviner, mais vous mentionnez des produits logiciels qui ciblent plusieurs plates-formes, et C++ peut être compilé sur n'importe quelle plate-forme.

17
Pete

(Je travaille sur Firefox depuis environ cinq ans.)

Le questionneur a raison: beaucoup de code de Firefox est C++, et en fait C++ est la majorité si vous comptez par lignes de code (bien que cela ne raconte pas toute l'histoire, car nous avons beaucoup de JavaScript et JS est plus concis que C++).

Mais en réalité, Firefox est écrit dans de nombreuses langues différentes:

  • C++
  • C (NSS, NSPR, various libraries we've imported)
  • x86 et ARM Assembly
  • Javascript
  • XUL (un langage de balisage de type HTML) et CSS
  • Objectif C (code MacOS uniquement)
  • Java (code Android uniquement)
  • Plusieurs langages de définition d'interface personnalisés (XPIDL, IPDL)
  • WebIDL (un autre langage de définition d'interface, mais celui-ci n'est pas personnalisé, bien que le générateur de code le soit)
  • Python (générateurs de code)

J'en oublie certainement.

Cette liste est importante car elle fait allusion à l'incroyable complexité qui se cache derrière un navigateur Web.

Oui, Firefox a beaucoup de code C++, et oui, cela a quelque chose à voir avec le fait que C++ était le meilleur langage pour ce genre de chose lorsque Netscape a été fondé. Mais je soutiens également qu'il n'existe pas de meilleur langage aujourd'hui pour une grande partie de ce que nous faisons.

Aucun autre langage n'a un écosystème de bibliothèques aussi puissant (nous comptons beaucoup sur du code externe). Peu d'autres langages vous offrent un contrôle de pile complète comme C++ (nous ajustons régulièrement notre allocateur de tas personnalisé et faisons toutes sortes de choses dangereuses pour la mémoire pour être plus rapides ou utiliser moins de mémoire). Peu d'autres langues vous permettent de réimplémenter la plupart de la bibliothèque standard de manière saine (nous avons nos propres implémentations de chaînes et de collections, adaptées à nos besoins). Peu d'autres langues vous permettent d'implémenter votre propre garbage collector. Etc.

Bien que C++ soit le choix évident pour beaucoup de ce que nous faisons, les gens qui suggèrent que nous pourrions écrire un navigateur en Java et écrire notre propre JVM si nécessaire sont sur quelque chose. C'est essentiellement ce que nous faisons, mais avec JavaScript au lieu de Java. Bien sûr, une grande partie du navigateur n'est pas écrit en JavaScript. Mais une quantité surprenante l'est.

13
Justin L.

Eh bien, vous devriez demander directement aux développeurs de ces produits d'obtenir la réponse, mais je soupçonne que c'est une combinaison de familiarité (c'est ce que ces développeurs connaissaient le mieux), de performances (compilation en un binaire natif). par opposition au bytecode), et des outils (par rapport aux langages comme C, C++ regorge de gadgets économes en main-d'œuvre comme la STL).

12
John Bode

Histoire

Chacun des navigateurs a une histoire qui a influencé le choix de la langue.

Par exemple, les deux Chrome et Safari sont basés sur WebKit, qui a ses origines dans la partie KHTML du projet KDE. KDE a été créé à l'origine (en partie) comme une démonstration de la boîte à outils de l'interface graphique Qt, donc KDE est, dans l'ensemble, un projet C++. Tous les nouveaux projets KDE étaient, à l'époque, entièrement écrits en C++, donc c'était un choix logique pour KHTML. Il a depuis été porté pour utiliser d'autres boîtes à outils GUI.

Le moteur Presto d'Opera a été écrit avec des performances et une petite taille binaire en tête: C++ était le choix logique.

IE de Microsoft a été écrit comme une collection de composants ActiveX, qui aurait pu être écrit dans n'importe quel langage doté de liaisons COM, mais a probablement été écrit dans un sous-ensemble de C++, car la majorité de leur base de code est déjà écrit dans cette langue.

Le Mozilla de Netscape a été écrit en C++ probablement parce que la portabilité était une préoccupation majeure pour eux. Les compilateurs C et C++ sont (pratiquement) omniprésents, et c'était donc un choix logique.

Il n'y a aucune raison inhérente technique à ces choix. Cela "semblait être une bonne idée à l'époque".

10
greyfade

La mise en réseau en C et C++ est facile à optimiser, car vous n'avez pas besoin d'utiliser des bibliothèques si vous ne le souhaitez pas. Je soupçonne que C++ est le langage de choix car il permet les avantages de C:

  • La vitesse
  • Optimisation
  • Une certaine portabilité
  • Langue compilée, non interprétée

couplé aux avantages de la POO:

  • Extensibilité
  • Visualisation plus simple
  • Meilleure prise en charge de la bibliothèque pour les tâches non critiques telles que le traitement des chaînes et les structures de données
8
Michael K

Lorsque les premières lignes de code de la première série de navigateurs ont été écrites, C # et Java n'existaient pas. Ruby non plus. Python peut avoir existé, mais c'était encore un petit projet homebrew à ce moment-là.

Fondamentalement, il y a vraiment sans aucun autre choix autre que C++ qui permettrait de construire un navigateur rapide et fonctionnant sur de nombreuses plates-formes différentes.

Alors pourquoi ont-ils été écrits en C++? Parce que c'était la seule langue disponible dans laquelle ils pouvaient être écrits.

4
GrandmasterB

Parce que les navigateurs (par exemple, HotJava, évidemment suffisamment écrits en Java) écrits dans d'autres langues n'ont jamais été atteints d'un degré substantiel d'acceptation/pénétration du marché.

Je ne peux rien dire sur l'itération actuelle (ou la plus récente - n'a pas été mise à jour depuis longtemps) de HotJava, mais quand je l'ai essayé, le manque de pénétration du marché semblait (au moins pour moi) extrêmement facile à comprendre - c'était laid, lent et incompatible avec pas mal de pages Web. En fin de compte, cela semblait être basé sur une prémisse qui ne s'est jamais avérée: que le Web serait principalement composé d'applets Java, avec HTML comme peu plus qu'un wrapper indiquant quelles applets afficher où.

Une partie est probablement aussi historique: la plupart des grands navigateurs Web existent depuis longtemps. Quand ils ont été écrits pour la première fois, le paysage était très différent: C++ était un nouveau langage "chaud", donc il était utilisé pour beaucoup de nouveaux développements. Les navigateurs sont devenus l'un des logiciels les plus utilisés, tandis que de nombreux autres de l'époque sont tombés dans l'oubli.

Je pense que l '"attitude" affichée du langage a également un effet: le C++ (comme le C avant) a toujours mis l'accent sur l'aspect pratique et le pragmatisme. Cette attitude de base a tendance à attirer des programmeurs également pragmatiques. De nombreuses autres langues mettent beaucoup plus l'accent sur des choses comme l'élégance - et ce faisant, elles attirent des programmeurs qui pensent de la même manière. Le problème, c'est ce que j'appelle "l'effet LISP". Les symptômes incluent:

  1. Des arguments sans fin sur l'implémentation la plupart élégante des choses les plus triviales.
  2. Impossibilité de figer les fonctionnalités et de terminer quelque chose qui peut être expédié (même avec des défauts)
  3. Incapacité à faire des compromis. Quiconque en désaccord avec moi n'est pas seulement faux, mais doit être soit stupide, soit mauvais.

Il y en a plus, mais vous avez l'idée générale (et oui, j'exagère dans une certaine mesure - mais seulement dans une certaine mesure). Oui, une partie du code que vous obtiendrez sera incroyablement belle - mais il est probable qu'il soit en retard de six mois, et surtout incompatible avec tous les autres codes dans (ce qui est censé être) le système, et au moment où vous le recevez, il y a une chance assez juste que quelque chose d'autre a suffisamment changé pour que vous ne puissiez pas l'utiliser du tout.

Il existe également des langues qui fonctionneraient sans aucun doute très bien, mais (à tort ou à raison) n'ont tout simplement pas (ou au moment crucial, n'avaient pas) la part de marché pour quiconque y ait déjà écrit un navigateur. Compte tenu de la taille et de la complexité d'un navigateur complet, il faut beaucoup de gens et beaucoup de temps pour en développer un. Avec ce genre d'investissement, beaucoup de gens deviennent relativement conservateurs sur des choses comme les outils de développement.

4
Jerry Coffin

Programmation culte du fret. La perception que "C++ est rapide" est toujours là, (malgré des fonctionnalités au niveau du langage mal pensées comme son modèle d'objet mal cassé qui ralentit les choses), et les gens veulent que leurs navigateurs soient rapides, alors ils écrivent en C++ .

Dans un monde sain d'esprit, les personnes qui écrivent des logiciels en réseau seraient horrifiées à la simple pensée d'utiliser un langage qui est assailli de tous les problèmes de sécurité inhérents à C, et le faire serait en réalité un acte de négligence criminelle. (Regardez simplement combien d'exploits de dépassement de mémoire tampon ont été trouvés contre divers navigateurs au cours des 15 dernières années! De combien de millions de dollars de dommages ces codeurs sont-ils responsables?)

Il existe d'autres langages compilés capables de créer des binaires rapides. Le problème est qu'ils n'ont pas la même exposition que la famille C, et nous devons tous en souffrir.

Fait amusant: au moment où le ver Morris a frappé Internet en 1988, démontrant de manière concluante les problèmes d'écriture de systèmes d'exploitation et de logiciels orientés réseau en C (qui n'ont toujours pas été résolus à ce jour, car ce sont des défauts inhérents à la langue ,) Apple avait publié le système d'exploitation le plus avancé que le monde ait vu jusqu'à présent, depuis plusieurs années déjà, écrit en Pascal.

3
Mason Wheeler

Accès aux API au niveau du système

Tous les navigateurs doivent s'interfacer avec le système d'exploitation à un moment donné, et la plupart des principaux systèmes d'exploitation ont des API et des bibliothèques C et C++ bien établies. Il est généralement plus facile de travailler avec ces API en C ou C++ plutôt que d'écrire des wrappers.

2
TMN

Compatibilité héritée - ne peut pas jeter l'ancien code

Cela n'a rien à voir avec les mérites de C++ par rapport à d'autres langages. Vous pouvez sûrement écrire un meilleur navigateur à partir de zéro dans une langue comme Haskell; un projet aussi important pourrait même implémenter leur propre machine virtuelle Java s'ils avaient besoin de garantir certaines performances. Comme la façon dont Facebook a écrit son propre compilateur/optimiseur PHP PHP.

Un navigateur qui rompt avec un balisage non standard est pire qu'inutile. La compatibilité héritée est si critique et si complexe qu'une réécriture n'est tout simplement pas une option. Beaucoup d'argent et de temps sont investis dans une sécurité éprouvée, etc., vous ne pouvez pas simplement jeter cet investissement. Encore une fois, comme la façon dont Facebook est encore écrit en PHP.

0
Dustin Getz

Contrôle et portabilité

la plupart des arguments de vitesse peuvent aller dans les deux sens, mais partout où vous avez besoin d'un contrôle précis sur la façon dont quelque chose est fait, de nombreuses langues de niveau supérieur pleuvront sur votre défilé. Il existe des exceptions à cela, mais la plupart d'entre elles ne sont pas suffisamment multiplateformes pour compter dans quelque chose comme un navigateur.

0
Bill