web-dev-qa-db-fra.com

Comment commencer à créer un navigateur Web?

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

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

65
Galilyou

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é) écrivez-la vous-même. Il y a beaucoup de complexité/subtilité dans le protocole HTTP, par exemple la gestion des en-têtes expirés, différentes versions (bien que ce soit principalement 1.1 de nos jours), etc;
  • Gère différents types de contenu. Il existe un registre Windos pour ce genre de chose que vous pouvez superposer. Je parle ici d'interprétation de contenu basé sur le type MIME;
  • analyse HTML et XML: pour créer un DOM (Document Object Model);
  • analyse et applique 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" par rapport à la largeur de bordure séparée, etc.) );
  • Implémente le modèle visuel du W3C (et c'est le vrai kicker); et
  • A un moteur Javascript.

Et c'est essentiellement un navigateur Web en bref. Maintenant, certaines de ces tâches sont incroyablement complexes. Même ceux qui semblent 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 levons nos sourcils de manière collective est que le moteur de rendu est difficile (et, comme quelqu'un l'a noté, les années-hommes sont entré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 issu de KHTML il y a quelques années;
  • Elektra: utilisé dans Opera 4-6;
  • Presto: utilisé dans Opera 7-12;
  • Blink: utilisé dans Chrome 28+, Opera 15+, fork du webkit;

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 introduit 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: 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 toutes les fonctionnalités de l'interface utilisateur: navigation entre les pages, historique des pages, effacement des fichiers temporaires, saisie d'une URL, URL de saisie semi-automatique, etc.

C'est un beaucoup de travail.

110
cletus

Cela ressemble à un projet vraiment intéressant, mais il vous demandera d'investir un énorme effort.

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

Quelques ressources que vous pouvez vérifier:

Mais le voir 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 :-)

21
CMS

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

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 que j'attends de vous: le chrome et le backend du navigateur. Oubliez tout d'abord la création d'un moteur de rendu - utilisez Webkit ou Gekko.

14
Ross

Vous voulez dire par écrit votre propre moteur de rendu?

Je ne peux que vous souhaiter bonne chance. De nombreuses années-hommes sont entré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 demander par où commencer, vous avez probablement plus de quelques années d'études à 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 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. obtenir une réelle compréhension solide 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. lancez-vous sur 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 les très gros projets nécessitent beaucoup de réflexion. Une honnêteté brutale parsemé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.

13
Kris

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 les objectifs de votre projet (et ce que vous espérez atteindre) très explicites. 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 leur incitation? 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 au moment où vous les aurez rattrapés, ils auront encore 10 à 15 ans devant vous. De plus, ils ont beaucoup plus de puissance humaine derrière eux, et donc si vous voulez que votre projet réussisse, vous aurez besoin de cette puissance humaine à un moment donné.

C'est la raison pour laquelle Apple et Google, les grandes entreprises avec beaucoup de ressources, ne sont pas partis de zéro. Même Microsoft n'est pas parti de zéro. L'original IE était basé sur Mosaic. Les seuls navigateurs importants encore ouverts aujourd'hui qui ont été lancés à partir de zéro sont Opera , Konqueror et Lynx , qui ont malheureusement tous une part de marché minuscule. Oublions pour l'instant Lynx, car il s'agit uniquement de texte navigateur et probablement la seule raison pour laquelle il existe toujours 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 succès et innovation ne sont pas la même chose. KHTML est le moteur de Konqueror, qui n'a jamais connu de succès, mais est la base de WebKit que les deux Apple et Google utilisent. Je pense que l'on pourrait certainement soutiennent que si KHTML n'avait jamais été créé, ni Safari ni Chrome existerait. Chose intéressante, KHTML et Opera ont été largement 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. Linus Torvalds me vient à l'esprit. Il a fait de Linux, l'un des systèmes d'exploitation les plus performants de tous les temps.

Bien sûr, vous faites face à un défi supplémentaire, qui rend la construction d'un nouveau navigateur réussi plus difficile que la construction d'un nouveau réussi OS. Les navigateurs sont censés exécuter parfaitement tout le code hérité flottant sur le Web. Supposons maintenant que Linus Torvalds ait été informé que son nouvel OS n'aurait pas d'importance à moins qu'il ne soit parfaitement rétrocompatible avec UNIX ou certains OS existants. Je doute qu'il l'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 est qu'il a été bien conçu et que le projet GNU a été en mesure de créer des outils pour porter d'énormes quantités de code existant vers Linux. Sans le support idéologique de GNU pour Linux, il n'aurait jamais eu de chance.

Donc, en supposant que vous êtes suffisamment ambitieux (ou téméraire) pour essayer de créer un nouveau navigateur réussi, la chose sur laquelle vous devriez vous concentrer est l'architecture et conception . 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 suffisamment pour comprendre les décisions de conception qu'ils ont prises, mais vous ne devriez pas essayer de copier leur conception, sinon vous pourriez tout aussi bien utiliser leur code.

Mes pensées personnelles (sans avoir fait suffisamment de recherches) sont que les navigateurs actuels ne sont pas assez modulaires. Si je devais créer un nouveau navigateur, je trouverais un moyen de faciliter l'échange et le retrait de choses (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 modernes et les concepteurs de sites Web ont retiré presque tout contrôle à l'utilisateur. Pourquoi ne puis-je 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 indications 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 que l'utilisateur est désormais à la merci totale du concepteur Web. L'intérêt de Linux était qu'il redonnait le contrôle à l'utilisateur, et c'est pourquoi tant de geeks l'ont soutenu et en ont fait un système d'exploitation réussi.

L'autre chose que je passerais du temps à rechercher, si j'étais vous, ce sont les principes de conception du système d'exploitation. La conception d'un bon navigateur devrait, au moins en théorie, nécessiter 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, beaucoup de recherches, c'est là que vous devriez commencer à coder je pense:

  1. Refonte Mosaic , mais avec vos propres idées de conception. 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 un bon premier jalon. Et vous pouvez réellement télécharger la mosaïque originale sur ftp://ftp.ncsa.uiuc.edu/Mosaic/ et voir comment elle 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 niveau 1 et le niveau 2 du DOM W3C, car presque tous les navigateurs actuels les prennent complètement en charge. Ensuite, regardez le niveau 3 et le niveau 4. Le DOM est extrêmement fondamental pour la programmation Web, et donc si vous voulez réellement construire 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 compte la manière dont vous pourriez tirer parti du modèle d'objet .NET existant à votre avantage.

  3. Examinez les moteurs de script existants et voyez si vous pouvez les porter sur votre projet. Je vous découragerais d'écrire votre propre interpréteur JavaScript, non seulement parce que c'est un très grand projet en soi, mais parce que beaucoup de travail a déjà été fait pour optimiser les compilateurs JS (par exemple V8). Donc, à moins que vous ne soyez un gourou de la conception de compilateurs, votre interprète 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 de toute façon être un module complètement séparé du navigateur réel, 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 construire un moteur de script cela ne fonctionne qu'avec votre navigateur.

  4. Regardez le code source HTML/CSS/JS pour les 10-20 meilleurs sites Web en Amérique du Nord (Google, Facebook, YouTube, Twitter, Wikipedia, Amazon, plates-formes de blogs populaires, etc.) et concevez votre navigateur pour bien fonctionner avec ces sites . C'est un problème un peu plus facile à résoudre que de créer un navigateur qui respecte toutes les normes existantes (ce que les navigateurs actuels ne font toujours pas parfaitement) et encore moins de créer un navigateur qui affiche correctement tous les sites Web sur le Web (personne ne peut faire cela). Les gens se plaindront que votre navigateur enfreint les normes et ainsi de suite, mais ce n'est pas un problème aussi important que les gens se plaignant de ne pas pouvoir accéder à Google ou Facebook avec votre navigateur. Je ne peux penser à aucun navigateur qui a correctement suivi toutes les normes (ou même la plupart) sur sa première version, donc je dis même pas la peine d'essayer. Si vous pouvez créer quelque chose que les gens voudront utiliser suffisamment pour qu'il y ait jamais une deuxième ou une troisième version, alors vous pouvez vous inquiéter des normes à ce stade.

11
user2188685

Comme tout le monde l'a déjà dit, un navigateur Web est un énorme projet. Vous devez vous soucier de TCP/IP et des 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 mal formés et de la gestion de tous les types de fichiers avant de pouvoir penser à tout ce que les gens attendent de un navigateur (c.-à-d. signets, historique, navigation privée, sécurité, etc.) C'est un énorme projet.

Cela étant dit, cela peut être fait. Ma suggestion serait d'aller voir 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 de apprendre à partir d'un projet open-source, d'abord.

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

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

A beaucoup de chance pour vous!

7
stalepretzel

Udacity a maintenant un cours intitulé "Construire un navigateur Web" - https://www.udacity.com/course/programming-languages--cs262

6
Elijah Lynn

Vous pouvez commencer avec du XHTML bien formé et valide, qui devrait être plus facile que la soupe de tag 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 faites pas d'illusions: un navigateur n'est pas un petit projet.

4
stesch

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

(les préoccupations non fonctionnelles et transversales devraient toutefois être généralement prises en compte à l'avance :))

2
Matt

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 langue c # ne fonctionne que sur windows (je connais mono sur linux mais ce n'est pas le même) de toute façon je vous souhaite bonne chance et je serai heureux d'utiliser votre navigateur: D

1
Hannoun Yassir

Vous avez vraiment beaucoup de temps libre dans la main, 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 au code, bonne chance avec ça: )

0
Waleed Eissa