Comment commencer à créer un navigateur Web? [fermé]

88

J'ai décidé de faire des efforts pour créer un navigateur Web à partir de zéro. Quelles sont les fonctions, architectures et caractéristiques communes des navigateurs Web modernes que je devrais connaître avant de commencer?

Toutes les recommandations sont très appréciées!

Galilyou
la source
9
Oui, c'est un projet insensé mais nous n'avons pas besoin de prendre le mickey ici - je pense que c'est un excellent point de discussion sur la façon dont vous pourriez contourner cela :)
Ross
8
Je me souviens d'un article il y a quelque temps où quelqu'un déplorait le fait que personne n'ait plus le courage de construire de nouveaux moteurs de rendu. De nouveaux navigateurs sont nécessaires, dit-il, car les ordinateurs d'aujourd'hui sont différents. Plusieurs cœurs. La première étape est Chrome avec 1 processus par onglet. Voyons ce qui va suivre.
stesch
35
Faites pousser des balles et faites ce que vous voulez. Si cela fonctionne, tant mieux. Sinon, continuez à essayer, sinon vous vous retrouverez comme l'autre moitié de la société qui dit "Ne créez rien de nouveau, utilisez simplement la merde cassée que nous avons déjà."
uSeRnAmEhAhAhAhAhA
7
Vous avez besoin d'une de ces pilules que Bradley Cooper prend dans Limitless . ;)
Ali Gajani
3
Essayez. Je parie que c'est beaucoup plus facile que ce que les gens disent ici, surtout si vous branchez de nombreux composants existants. À quel point peut-il être difficile d'analyser du texte et de produire des boîtes de couleur avec du texte à l'intérieur?
Ian Warburton

Réponses:

125

Eh bien, décomposez-le en morceaux. Qu'est-ce qu'un navigateur Web? Qu'est ce que ça fait? Il:

  • Récupère le contenu externe. Vous avez donc besoin d'une bibliothèque HTTP ou (non recommandé) de l'écrire vous-même. Il y a beaucoup de complexité / subtilité dans le protocole HTTP, par exemple la gestion des en-têtes d'expiration, des versions différentes (bien que ce soit principalement 1.1 de nos jours), etc;
  • Gère différents types de contenu. Theres un registre Windos pour ce genre de chose que vous pouvez utiliser. Je parle d'interprétation du contenu basé sur le type MIME ici;
  • Analyse HTML et XML : pour créer un DOM (Document Object Model);
  • Analyse et applique le CSS : cela implique de comprendre toutes les propriétés, toutes les unités de mesure et toutes les façons dont les valeurs peuvent être spécifiées (par exemple "border: 1px solid black" vs la largeur de bordure séparée, etc. propriétés);
  • Implémente le modèle visuel du W3C (et c'est le vrai kicker); et
  • Possède un moteur Javascript .

Et c'est essentiellement un navigateur Web en un mot. Aujourd'hui, certaines de ces tâches sont incroyablement complexes. Même les plus faciles peuvent être difficiles. Prenez la récupération de contenu externe. Vous devez gérer des cas d'utilisation tels que:

  • Combien de connexions simultanées utiliser?
  • Rapport d'erreur à l'utilisateur;
  • Procurations;
  • Options utilisateur;
  • etc.

La raison pour laquelle moi et d'autres haussons collectivement nos sourcils est que le moteur de rendu est difficile (et, comme quelqu'un l'a noté, des années ont été passées dans leur développement). Les principaux moteurs de rendu sont:

  • Trident: développé par Microsoft pour Internet Explorer;
  • Gecko: utilisé dans Firefox;
  • Webkit: utilisé dans Safari et Chrome 0-27;
  • KHTML: utilisé dans l'environnement de bureau KDE. Webkit est sorti de KHTML il y a quelques années;
  • Elektra: utilisé dans Opera 4-6;
  • Presto: utilisé dans Opera 7-12;
  • Clignotement: utilisé dans Chrome 28+, Opera 15+, fork du kit Web;

Les trois premiers doivent être considérés comme les principaux moteurs de rendu utilisés aujourd'hui.

Les moteurs Javascript sont également difficiles. Il y en a plusieurs qui ont tendance à être liés au moteur de rendu particulier:

  • SpiderMonkey: utilisé dans Gecko / Firefox;
  • TraceMonkey: remplacera SpiderMonkey dans Firefox 3.1 et introduira la compilation JIT (juste à temps);
  • KJS: utilisé par Konqueror, lié à KHTML;
  • JScript: le moteur Javascript de Trident, utilisé dans Internet Explorer;
  • JavascriptCore: utilisé dans Webkit par le navigateur Safari;
  • SquirrelFish: sera utilisé dans Webkit et ajoute JIT comme TraceMonkey;
  • V8: le moteur Javascript de Google utilisé dans Chrome et Opera;
  • Opera (12.X et moins) a également utilisé le sien.

Et bien sûr, il y a tout ce qui concerne l'interface utilisateur: la navigation entre les pages, l'historique des pages, la suppression des fichiers temporaires, la saisie d'une URL, la saisie semi-automatique des URL, etc.

C'est beaucoup de travail.

cletus
la source
* Gecko :) Aussi d'accord. Les composants principaux sont le moteur de rendu HTML et le moteur JavaScript.
abatishchev
1
Opera a créé le leur. Presto est l'actuel, et Electra était leur précédent.
Tim Sullivan
Excellente réponse en profondeur - j'ai oublié l'analyse JavaScript tous ensemble!
Ross
1
Le monde a cependant besoin de plus de gens qui ont des balles pour créer des navigateurs. Cp eff.org/deeplinks/2016/04/save-firefox .
Pacerier
26

Cela semble être un projet vraiment intéressant, mais il vous demandera d'investir un effort énorme.

Ce n'est pas chose facile, mais d'un point de vue académique, vous pourriez en apprendre beaucoup .

Quelques ressources que vous pourriez vérifier:

Mais en le voyant d'un point de vue réaliste , l'énorme effort nécessaire pour le coder à partir de zéro m'a rappelé cette bande dessinée:


(source: geekherocomic.com )

Bonne chance :-)

Christian C. Salvadó
la source
Oh, est-ce que GHC a continué? Je pense que je me suis désabonné quand ils ont commencé à faire ce truc de la tanière de Ross.
Ross
@Ross: Ouais, ils livrent toujours la bande dessinée, ce nouveau gars s'appelle Boris de Russie, et il est un "Super Hacker" LOL
Christian C. Salvadó
17

La plupart des navigateurs Web modernes sont des bêtes géantes, et probablement assez mal conçus car ils (et le Web lui-même) ont évolué de manière plutôt aléatoire.

Vous devez commencer par rendre très explicites les objectifs de votre projet (et ce que vous espérez réaliser). Est-ce quelque chose que vous faites juste pour le plaisir ou vous attendez-vous à ce que d'autres personnes utilisent votre navigateur? Si vous vous attendez à ce que d'autres l'utilisent, quelle sera la motivation pour eux? Il n'est pas réaliste de s'attendre à ce que vous développiez un nouveau navigateur à partir de zéro que tout le monde pourra utiliser en remplacement de Chrome, Safari, Firefox, IE, Opera, etc. Tous ces projets ont une longueur d'avance de 10 à 15 ans. vous, et le temps que vous les rattrapiez, ils auront encore 10 à 15 ans d'avance sur vous. De plus, ils ont beaucoup plus de force humaine derrière eux, et donc si vous voulez que votre projet réussisse, vous aurez besoin de cette force humaine à un moment donné.

C'est la raison pour laquelle Apple et Google, de grandes entreprises avec beaucoup de ressources, ne sont pas partis de zéro. Même Microsoft n'est pas parti de zéro. L'IE original était basé sur Mosaic. Les seuls navigateurs importants encore existants qui ont été démarrés à partir de zéro sont Opera , Konqueror et Lynx, qui ont malheureusement tous une part de marché minuscule. Oublions Lynx pour le moment, car il s'agit d'un navigateur contenant uniquement du texte et probablement la seule raison pour laquelle il est toujours là, c'est parce qu'il sert ce créneau spécifique. Opera est sans doute l'un des meilleurs navigateurs jamais créés, et pourtant il n'a jamais eu une grande part de marché, alors rappelez-vous que le succès et l'innovation ne sont pas la même chose. KHTML est le moteur de Konqueror, qui n'a jamais connu un grand succès en soi, mais est la base de WebKit qu'Apple et Google utilisent. Je pense que l'on pourrait certainement affirmer que si KHTML n'avait jamais été créé, ni Safari ni Chrome n'existeraient. Il est intéressant de noter que KHTML et Opera ont été en grande partie produits par des programmeurs norvégiens travaillant dans le même bâtiment à Oslo.

Vous devez envisager de créer un navigateur Web comme la création d'un système d'exploitation, car c'est essentiellement ce qu'est un navigateur - c'est un système d'exploitation pour exécuter des applications Web. Et comme un système d'exploitation, un navigateur Web est un logiciel très complexe avec de nombreux composants. Bien sûr, les gens ont réussi à créer de nouveaux systèmes d'exploitation à partir de zéro. Je pense à Linus Torvalds. Il a fait de Linux, l'un des systèmes d'exploitation les plus réussis de tous les temps.

Bien sûr, vous êtes confronté à un défi supplémentaire, qui rend la création d'un nouveau navigateur réussi plus difficile que la construction d'un nouveau système d'exploitation réussi . Les navigateurs sont censés exécuter parfaitement tout le code hérité qui circule sur le Web. Supposons maintenant que Linus Torvalds ait été informé que son nouveau système d'exploitation n'aurait pas d'importance à moins qu'il ne soit parfaitement rétrocompatible avec UNIX ou un système d'exploitation existant. Je doute qu'il aurait dérangé, et Linux n'existerait probablement pas aujourd'hui. De manière réaliste, bien sûr, la seule raison pour laquelle Linux est devenu populaire était parce qu'il était bien conçu et que le projet GNU était capable de créer des outils pour porter d'énormes quantités de code existant sur Linux. Sans le soutien idéologique de GNU pour Linux, il n'aurait jamais eu de chance.

Donc, en supposant que vous soyez vraiment assez ambitieux (ou téméraire) pour essayer de créer un nouveau navigateur à succès, vous devriez vous concentrer sur l' architecture et le design . Il n'y a aucune raison pratique de créer un nouveau navigateur à partir de zéro, sauf si vous êtes sûr de pouvoir améliorer la conception des navigateurs existants d'une manière ou d'une autre. Cela signifie que vous devez vous familiariser suffisamment avec le code de WebKit et Gecko pour comprendre les décisions de conception qu'ils ont prises, mais vous ne devriez pas essayer de copier leur conception, sinon vous pourriez aussi bien utiliser leur code.

Mes pensées personnelles (sans avoir fait suffisamment de recherches) sont que les navigateurs d'aujourd'hui ne sont pas assez modulaires. Si je devais créer un nouveau navigateur, je trouverais un moyen de faciliter les échanges entrants et sortants (comme remplacer un moteur JavaScript par un autre), et donner à l'utilisateur beaucoup plus de contrôle qu'il n'en a actuellement avec les navigateurs existants . Les navigateurs et les concepteurs Web modernes ont presque tout pris le contrôle de l'utilisateur. Pourquoi est-ce que je ne peux pas, l'utilisateur, dire au navigateur Web comment je veux qu'il rende le contenu affiché sur ma machine? Le HTML d'origine ne donnait que des directives sur la façon de structurer le contenu, et au fil du temps, les nouvelles normes sont devenues de plus en plus dogmatiques, au point où l'utilisateur est maintenant à la merci du concepteur Web. L'attrait de Linux était qu'il redonnait le contrôle à l'utilisateur, et que '

L'autre chose que je passerais du temps à rechercher, si j'étais à votre place, ce sont les principes de conception du système d'exploitation. La conception d'un bon navigateur devrait, au moins en théorie, exiger les mêmes principes que la conception d'un bon système d'exploitation - en particulier en ce qui concerne les processus concurrents, les modèles de sécurité, etc.

Enfin, après avoir fait beaucoup de recherches, c'est ici que vous devriez commencer à coder je pense:

  1. Réorganiser la mosaïque, mais avec vos propres idées de design. C'est aussi ce que je suggérerais si vous le faites simplement pour le plaisir ou pour votre propre bénéfice éducatif. Lisez les spécifications HTML 1.0 et HTML 2.0 d'origine, ainsi que les spécifications HTTP 1.1 et les spécifications URI actuelles, et assurez-vous que votre navigateur respecte toutes ces spécifications. Vous pouvez bien sûr télécharger un logiciel existant qui gère déjà les protocoles de transport, les conventions URI, etc., mais si vous êtes sérieux au sujet de la conception de votre propre navigateur, je pense que c'est un bon exercice de faire ces choses à partir de zéro également, donc vous obtenez une bonne idée de la façon dont toutes les pièces du puzzle s'emboîtent. À la fin de l'étape 0, vous devriez avoir un navigateur au moins comparable à ce qui était à la pointe de la technologie dans les années 90. C'est une bonne première étape. Et vous pouvez en fait télécharger la mosaïque originale àftp://ftp.ncsa.uiuc.edu/Mosaic/ et voyez comment il se compare à votre navigateur. C'est aussi un bon exercice pour voir comment les sites Web actuels s'affichent dans un ancien navigateur comme Mosaic.

  2. Ajoutez la prise en charge du DOM à votre navigateur. Concentrez-vous d'abord sur le DOM W3C niveau 1 et niveau 2, car à peu près tous les navigateurs actuels les prennent complètement en charge. Ensuite, regardez les niveaux 3 et 4. Le DOM est extrêmement fondamental pour la programmation Web, et donc si vous voulez réellement créer un navigateur Web moderne, sa conception entière doit en tenir compte. Étant donné que vous écrivez le navigateur en C #, vous souhaiterez peut-être prendre en considération la manière dont vous pourriez tirer parti du modèle objet .NET existant à votre avantage.

  3. Regardez les moteurs de script existants et voyez si vous pouvez les porter dans votre projet. Je vous déconseille d'écrire votre propre interpréteur JavaScript, non seulement parce que c'est un très gros projet en soi, mais parce que beaucoup de travail a déjà été consacré à l'optimisation des compilateurs JS (par exemple V8). Donc, à moins que vous ne soyez un gourou de la conception de compilateurs, votre interpréteur JS construit à la main sera probablement inférieur à ce qui existe déjà, même s'il suit parfaitement les spécifications EMCAScript. Encore une fois, je pense que le moteur de script devrait être quelque chose qui est un module complètement séparé du navigateur réel de toute façon, donc je pense qu'il serait beaucoup plus utile d'avoir un cadre qui vous permette de remplacer n'importe quel moteur de script, plutôt que de créer un moteur de script cela ne fonctionne qu'avec votre navigateur.

  4. Consultez le code source HTML / CSS / JS des 10 à 20 meilleurs sites Web d'Amérique du Nord (Google, Facebook, YouTube, Twitter, Wikipédia, Amazon, plates-formes de blogs populaires, etc.) et concevez votre navigateur pour qu'il fonctionne bien avec ces sites . C'est un problème un peu plus facile à résoudre que de créer un navigateur qui adhère à toutes les normes existantes (ce que les navigateurs actuels ne font toujours pas parfaitement) et encore moins de créer un navigateur qui rend correctement tous les sites Web sur le Web (personne ne peut faire ça). Les gens se plaindront du fait que votre navigateur enfreint les normes et ainsi de suite, mais ce n'est pas un problème aussi grave que les gens se plaignant de ne pas pouvoir accéder à Google ou à Facebook avec votre navigateur. Je ne peux penser à aucun navigateur qui ait correctement suivi toutes les normes (ou même la plupart) lors de sa première version, alors je dis ne même pas essayer.

user2188685
la source
1
+1 pour la plupart du code des navigateurs Web aujourd'hui est horriblement nul avec des tonnes de merde héritée des années 1990 . Google a essayé de résoudre ce problème en créant Blink qui est essentiellement Webkit avec 8,8 millions de lignes de merde supprimées, mais même quand même, il reste des cargaisons de merdes retranchées inamovibles coincées dans Blink.
Pacerier
1
... Si Google avait commencé à créer un navigateur aujourd'hui, il le créerait certainement à partir de zéro , mais maintenant c'est trop cher pour eux de transformer le Titanic parce que tous ses employés connaissent déjà Blink. Une nouvelle startup avec des compétences approfondies et bien financée avec de l'argent pour créer un navigateur-OS concurrent peut certainement avoir un avantage sur Chrome.
Pacerier
15

Vous voulez dire comme en écrivant votre propre moteur de rendu?

Je ne peux que dire bonne chance. De nombreuses années d'homme se sont écoulées dans la génération actuelle des différents navigateurs.Si vous voulez faire mieux que l'un ou l'autre, vous aurez besoin de compétences sérieuses. Si vous devez vous demander par où commencer, vous avez probablement plus de quelques années d'étude à faire avant qu'il ne soit logique de tenter une telle tâche.

Cela dit, voici quelques conseils (évidents):

  1. écrire beaucoup de code qui fait de petites choses, comme résoudre tous les problèmes de projecteuler.net
  2. découvrez tout ce que vous pouvez sur votre boîte à outils et ses normes communautaires
  3. écrire beaucoup plus de code
  4. avoir une réelle compréhension des machines à états finis
  5. écrire encore plus de code
  6. tout savoir sur la pile tcp / ip et son utilisation pour http
  7. apprenez tout ce que vous pouvez sur http
  8. apprendre les standards (html, xml, sgml, css)
  9. célébrez votre 150e anniversaire.
  10. démarrer le projet de navigateur actuel.

modifier ci-dessous ici

Je ne voulais pas que ce soit motivant ou démotivant, juste une tentative de vous montrer qu'un navigateur est un très gros projet et que de très gros projets nécessitent beaucoup de réflexion. Une honnêteté franche saupoudrée d'humour.

Je programme depuis plus des deux tiers de ma vie et j'aime penser que je suis un programmeur assez décent, mais il serait stupide de ma part de penser que j'aurais une demi-chance d'écrire un navigateur Web décent à partir de zéro. .

Bien sûr, si c'est ce que vous voulez faire, ne laissez pas mon commentaire vous gêner. Vous pouvez probablement faire mieux qu'Internet Explorer.

Kris
la source
12
J'aurais dû mentionner: si vous voulez créer une tarte aux pommes à partir de zéro, vous devez commencer par créer un univers.
Kris
@ Mk12: en effet, merci. mis à jour.
Kris
1
@Kris Comment créer un Univers quand il n'y a rien avec lequel le créer?
uSeRnAmEhAhAhAhAhA
1
@ user2645707: Je ne saurais pas, je suis juste en train de perroquet quelqu'un de plus intelligent que moi. quotationspage.com/quote/26980.html
Kris
12
+1 pour "Vous pouvez probablement faire mieux qu'Internet Explorer."
Pulah Nandha
14

C'est un projet incroyablement ambitieux (surtout pour un seul développeur) mais quelque chose que j'aimerais faire un jour - vous pourriez en apprendre tellement.

Je ne sais pas grand-chose sur le fonctionnement des protocoles (quelque chose que vous devez absolument rechercher) ou sur ce qui se passe dans un navigateur, mais un bon point de départ serait la source des navigateurs open-source, principalement Chrome et Firefox. Chrome est un projet particulièrement intéressant à regarder car ils ne font que ce avec quoi je m'attendrais à ce que vous commenciez: le chrome et le backend du navigateur. Oubliez la création d'un moteur de rendu au début - utilisez Webkit ou Gekko.

Ross
la source
8

Comme tout le monde l'a déjà dit, un navigateur Web est un énorme projet. Vous devez vous soucier de tcp / ip & sockets, du rendu html, de l'utilisation de css, de la création d'un modèle DOM, de l'exécution de javascript, du traitement du balisage et du code malformés et de la gestion de tous les types de fichiers avant même de pouvoir penser à tout ce que les gens attendent. un navigateur (c'est-à-dire les signets, l'historique, la navigation privée, la sécurité, etc.) C'est un énorme projet.

Cela étant dit, cela peut être fait. Ma suggestion serait d'aller chercher la source de Firefox. Je sais que vous avez dit que vous vouliez créer un navigateur à partir de zéro, mais il serait très utile d' apprendre d'abord à partir d'un projet open source.

Je téléchargerais la source Firefox et je la supprimais lentement. En d'autres termes, je prendrais la source et supprimerais toutes les fonctionnalités de bookmarking. Ensuite, je supprimerais la possibilité de gérer les addons. Ensuite, je supprimerais tout le code concernant l'enregistrement des fichiers. Je continuerais ce processus jusqu'à ce que j'aie un navigateur Web très basique. Je regarderais ce code.

Ensuite, je commencerais à construire le mien. Je prendrais les connaissances que j'avais acquises en démontant Firefox, et je les mettrais dans la construction d'un nouveau navigateur.

Un tas de chance à vous!

stalepretzel
la source
Pouvez-vous fournir des indications sur la façon de désintégrer Firefox? Je veux dire, j'obtiens un exefichier, lors de l'installation, j'obtiens un dossier source avec beaucoup de dllfichiers. Comment étudier le code réel qui a fait cela et la logique qui sous-tend cela?
SexyBeast
Ce commentaire est en retard à la fête, mais de toute façon. Les fichiers .EXE et .DLL sont le résultat d'une étape de compilation et vous ne pouvez pas vous attendre à en avoir beaucoup de sens. Vous auriez besoin du code source (certains C ++ et d'autres langages dans différents fichiers) pour donner un sens au programme. Les programmeurs doivent comprendre leur propre programme, ils ont donc tendance à séparer et à documenter les différentes parties fonctionnelles du code.
Roy Prins
4

Vous pouvez commencer avec du XHTML bien formé et valide, ce qui devrait être plus facile que la soupe de balises que votre navigateur rencontrera dans la vraie «vie».

Ensuite, vous devez trouver un moyen de plier le vrai HTML du Web à vos besoins.

Mais ne vous leurrez pas: un navigateur n'est pas un petit projet.

stesch
la source
3

... puis commencez à vous soucier de la sécurité

(Les préoccupations non fonctionnelles et transversales doivent être généralement prises en compte dès le départ :))

Mat
la source
1

projet très ambitieux mais un développeur ne peut pas le faire seul vous avez besoin d'une équipe (chef de projet, testeurs ...) et peut-être devriez-vous revoir votre choix de langage c # fonctionne uniquement sous windows (je connais mono sous linux mais ce n'est pas le idem) de toute façon je vous souhaite bonne chance et je serai heureux d'utiliser votre navigateur: D

Hannoun Yassir
la source
0

Vous avez vraiment beaucoup de temps libre entre vos mains, n'est-ce pas? AFAIK, la plupart des navigateurs ont été écrits en C ++, tous les utilisateurs n'ont pas le framework .NET installé sur leurs ordinateurs et s'ils le font, ce n'est peut-être pas la version dont vous avez besoin.

Cela pourrait vous prendre des années mais de toute façon, il existe de nombreux navigateurs open source, FireFox, Google Chrome .. etc., vous pouvez commencer par jeter un œil sur le code, bonne chance avec ça :)

Waleed Eissa
la source
1
Chrome n'est pas open source; Mais la plupart de son code source peut être trouvé dans le projet chrome
Anonyme