J'ai décidé de faire quelques efforts pour construire un navigateur web (à partir de zéro), toute recommandation sur la façon de commencer ! Pas seulement le codage, mais aussi les modèles de conception, et les conseils sur les meilleures pratiques sont très appréciés.
PS : J'utilise C# .NET.
Réponses
Trop de publicités?Eh bien, décomposez-le en morceaux. Qu'est-ce qu'un navigateur Web ? Que fait-il ? Il :
- Récupère le contenu externe. Vous avez donc besoin d'une bibliothèque HTTP ou (ce qui n'est pas recommandé) de l'écrire vous-même. Le protocole HTTP est très complexe et subtil, notamment en ce qui concerne la gestion des en-têtes d'expiration, les différentes versions (bien qu'il s'agisse principalement de la version 1.1 aujourd'hui), etc ;
- Gère différents types de contenu. Il existe un registre Windos pour ce genre de choses que vous pouvez utiliser. Je parle ici de l'interprétation du contenu basée sur le type MIME ;
- Analyse de l'HTML et du XML : pour créer un DOM (Document Object Model) ;
- Analyse et application des CSS Pour cela, il faut 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" ou les propriétés séparées border-width, etc ;)
- Implémente le modèle visuel du W3C (et c'est là que le bât blesse) ; et
- Possède un moteur Javascript .
Et c'est essentiellement un navigateur Web en un mot. Maintenant, certaines de ces tâches sont incroyablement complexes. Même celles qui semblent faciles peuvent être difficiles. Prenons l'exemple de l'extraction de contenu externe. Vous devez faire face à des cas d'utilisation comme :
- Combien de connexions simultanées faut-il utiliser ?
- Signalement des erreurs à l'utilisateur ;
- Proxies ;
- Options de l'utilisateur ;
- etc.
La raison pour laquelle moi et d'autres personnes fronçons les sourcils de manière collégiale est que le moteur de rendu est difficile (et, comme quelqu'un l'a noté, des années d'homme ont été consacrées à son développement). Les principaux moteurs de rendu disponibles sont les suivants
- 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 a bifurqué de KHTML il y a quelques années ;
- Presto : utilisé dans Opera depuis la version 7 ;
- Elektra : utilisé dans Opera 4-6 ;
- Cligne des yeux : utilisé dans Chrome 28+, webkit fork ;
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 en existe plusieurs qui ont tendance à être liés à un moteur de rendu particulier :
- SpiderMonkey : utilisé dans Gecko/Firefox ;
- TraceMonkey : remplacera SpiderMonkey dans Firefox 3.1 et introduira la compilation JIT (just-in-time) ;
- 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 le JIT comme TraceMonkey ;
- V8 : Le moteur Javascript de Google utilisé dans Chrome ;
- Opera utilise également son propre système.
Et bien sûr, il y a tout ce qui concerne l'interface utilisateur : la navigation entre les pages, l'historique des pages, l'effacement des fichiers temporaires, la saisie d'une URL, l'autocomplétion des URL, etc.
C'est un lot de travail.
Cela semble être un projet vraiment intéressant, mais il vous demandera un effort énorme.
Ce n'est pas une mince affaire, mais d'un point de vue académique, vous pourriez apprendre tellement d'elle.
Quelques ressources que vous pouvez consulter :
- HTMLayout.NET : composant de rendu et de gestion de la mise en page HTML/CSS rapide, léger et intégrable.
- GeckoFX : Contrôle Windows Forms qui intègre le contrôle du navigateur Mozilla Gecko dans toute application Windows Forms.
- SwiftDotNet : Un navigateur basé sur Webkit en C#
- Gecko DotNetEmbed
- Gecko#
- Rendu d'une page Web - étape par étape
Mais en le voyant d'un réaliste De ce point de vue, l'énorme effort nécessaire pour le coder à partir de zéro m'a rappelé cette BD :
Bonne chance :-)
La plupart des navigateurs web modernes sont des bêtes géantes, et probablement assez mal conçues parce qu'elles (et le web lui-même) ont évolué de manière plutôt désordonnée.
Vous devez commencer par faire le objectifs de votre projet (et de ce que vous espérez obtenir) très explicite. S'agit-il de 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, qu'est-ce qui les incitera à le faire ? Il n'est pas réaliste de s'attendre à ce que vous développiez un nouveau navigateur à partir de rien que tout le monde pourra utiliser en remplacement de Chrome, Safari, Firefox, IE, Opera, etc. Tous ces projets ont 10 à 15 ans d'avance sur vous, et le temps que vous les rattrapiez, ils auront encore 10 à 15 ans d'avance sur vous. De plus, ils ont beaucoup plus d'hommes derrière eux, et si vous voulez que votre projet réussisse, vous aurez besoin de ces hommes à un moment donné.
C'est la raison pour laquelle Apple et Google, de grandes entreprises disposant de nombreuses ressources, ne sont pas parties de rien. Même Microsoft n'est pas parti de zéro. L'IE original était basé sur Mosaic. Les seuls navigateurs importants qui existent encore aujourd'hui et qui sont partis de zéro sont les suivants Opéra , Konqueror et Lynx qui, malheureusement, ont tous une part de marché minuscule. Oublions Lynx pour l'instant, puisqu'il s'agit d'un navigateur texte uniquement et que la seule raison pour laquelle il existe encore est qu'il sert cette niche 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 le succès, mais qui est à la base de WebKit, utilisé par Apple et Google. 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 tous deux été largement produits par des programmeurs norvégiens travaillant dans le même bâtiment à Oslo.
Il faut considérer la création d'un navigateur web comme la création d'un système d'exploitation, car c'est essentiellement ce qu'est un navigateur : 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 comportant de nombreux composants. Bien sûr, des gens ont réussi à créer de nouveaux systèmes d'exploitation à partir de rien. Linus Torvalds vient à l'esprit. Il a créé Linux, l'un des systèmes d'exploitation les plus populaires de tous les temps.
Bien sûr, vous devez faire face à un défi supplémentaire, ce qui rend la construction d'un nouveau succès de navigateur plus difficile que de construire un nouveau succès de OS. On s'attend à ce que les navigateurs exécutent sans problème tout le code hérité flottant sur le web. Supposons maintenant que l'on ait dit à Linus Torvalds que son nouveau système d'exploitation n'aurait aucune importance s'il n'était pas parfaitement rétrocompatible avec UNIX ou un système d'exploitation existant. Je doute qu'il se serait donné la peine, et Linux n'existerait probablement pas aujourd'hui. En réalité, 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 pu créer des outils pour porter d'énormes quantités de code existant vers Linux. Sans le soutien idéologique de GNU à Linux, il n'aurait jamais eu une chance.
Donc, en supposant que vous êtes vraiment assez ambitieux (ou téméraire) pour essayer de créer un nouveau navigateur à succès, la chose sur laquelle vous devriez vous concentrer est la suivante architecture et design . Il n'y a aucune raison pratique de créer un nouveau navigateur à partir de rien, 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 devez pas essayer de copier leur conception, sinon vous pourriez tout aussi bien utiliser leur code.
Je pense personnellement (sans avoir fait suffisamment de recherches) 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 des éléments (comme le remplacement d'un moteur JavaScript par un autre) et de 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 enlevé presque tout contrôle à l'utilisateur. Pourquoi ne puis-je pas, en tant qu'utilisateur, dire au navigateur web comment je veux qu'il rende le contenu affiché sur ma machine ? Le HTML original 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 que l'utilisateur est maintenant à la merci totale du concepteur de sites Web. L'attrait de Linux était qu'il rendait le contrôle à l'utilisateur, et c'est pourquoi tant de geeks l'ont soutenu et en ont fait un système d'exploitation à succès.
Si j'étais vous, je consacrerais également du temps à la recherche sur les principes de conception des systèmes d'exploitation. La conception d'un bon navigateur devrait, du moins en théorie, faire appel aux mêmes principes que la conception d'un bon système d'exploitation, notamment en ce qui concerne les processus concurrents, les modèles de sécurité, etc.
Enfin, après avoir fait des tas et des tas de recherches, c'est ici que vous devriez commencer à coder, je pense :
-
Re-engineer Mosaïque mais avec vos propres idées de design. C'est également ce que je vous suggérerais si vous le faites juste pour le plaisir ou pour votre propre bénéfice éducatif. Lisez les spécifications originales de HTML 1.0 et HTML 2.0, ainsi que les spécifications HTTP 1.1 et les spécifications URI actuelles, et assurez-vous que votre navigateur adhère à toutes ces spécifications. Vous pouvez bien sûr télécharger des logiciels existants qui gèrent déjà les protocoles de transport, les conventions URI, etc., mais si vous voulez sérieusement concevoir votre propre navigateur, je pense que c'est un bon exercice que de faire ces choses à partir de zéro, afin d'avoir une bonne idée de la façon dont toutes les pièces du puzzle s'assemblent. À la fin de l'étape 0, vous devriez avoir un navigateur qui est au moins comparable à ce qui était l'état de l'art dans les années 90. C'est une bonne première étape. Vous pouvez d'ailleurs télécharger le Mosaic original à l'adresse suivante 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 sont rendus dans un ancien navigateur comme Mosaic.
-
Ajoutez le support du DOM à votre navigateur. Concentrez-vous d'abord sur les niveaux 1 et 2 du DOM du W3C, puisque presque tous les navigateurs actuels les supportent complètement. Regardez ensuite les niveaux 3 et 4. Le DOM est extrêmement fondamental pour la programmation web, et donc si vous voulez construire un navigateur web moderne, sa conception doit en tenir compte. Puisque vous écrivez le navigateur en C#, vous pouvez envisager de tirer parti du modèle d'objet .NET existant.
-
Examinez les moteurs de script existants et voyez si vous pouvez les porter sur 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 aussi 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éteur JS fait à la main sera probablement inférieur à ce qui existe déjà, même s'il respecte parfaitement les spécifications EMCAScript. Encore une fois, je pense que le moteur de script devrait être un module complètement séparé du navigateur actuel, donc je pense qu'il serait beaucoup plus utile d'avoir un cadre qui vous permet de substituer n'importe quel moteur de script, plutôt que de construire un moteur de script qui ne fonctionne qu'avec votre navigateur.
-
Examinez le code source HTML / CSS / JS des 10 à 20 principaux sites Web d'Amérique du Nord (Google, Facebook, YouTube, Twitter, Wikipedia, Amazon, les plateformes de blogs les plus populaires, etc. Il s'agit d'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 le faire). Les gens se plaindront que votre navigateur ne respecte pas les normes et ainsi de suite, mais ce n'est pas un problème aussi important que les gens qui se plaignent de ne pas pouvoir accéder à Google ou Facebook avec votre navigateur. Je ne connais aucun navigateur qui ait respecté toutes les normes (ou même la plupart) dès sa première version, alors je vous conseille de ne pas essayer. Si vous pouvez faire quelque chose que les gens voudront utiliser suffisamment pour qu'il y ait une 2ème ou 3ème version, alors vous pourrez vous inquiéter des standards à ce moment-là.
Vous voulez dire comme écrire votre propre moteur de rendu ?
Je ne peux que vous souhaiter bonne chance. De nombreuses années-hommes ont été consacrées à la génération actuelle des différents navigateurs. Si vous voulez faire mieux que l'un d'entre eux, il vous faudra de sérieuses compétences. Si vous devez vous demander par où commencer, vous avez probablement plus que quelques années d'études à faire avant que cela n'ait un sens de tenter une telle tâche.
Cela dit, voici quelques conseils (évidents) :
- écrire beaucoup de code qui fait des petites choses, comme résoudre toutes les projecteuler.net problèmes
- apprenez tout ce que vous pouvez sur votre boîte à outils et les normes de la communauté.
- écrire beaucoup plus de code
- acquérir une solide maîtrise des machines à états finis
- écrire encore plus de code
- apprenez tout sur la pile tcp/ip et comment elle est utilisée pour http
- apprenez tout ce que vous pouvez sur le http
- apprendre les standards (html, xml, sgml, css)
- célébrer votre 150e anniversaire.
- commencez à travailler sur le projet de navigateur actuel.
éditer ci-dessous ici
Je n'ai pas voulu que ce soit motivant ou démotivant, j'ai juste essayé de vous montrer qu'un navigateur est un très gros projet et que les très gros projets demandent beaucoup de réflexion. Une honnêteté brutale saupoudrée d'humour.
J'ai passé plus des deux tiers de ma vie à programmer et j'aime à penser que je suis un bon programmeur, mais il serait stupide de ma part de penser que j'ai la moitié d'une chance d'écrire un navigateur web décent à partir de rien.
Bien sûr, si c'est ce que vous voulez faire, ne laissez pas mon commentaire se mettre en travers de votre chemin. Vous pouvez probablement faire mieux qu'Internet Explorer.
Il s'agit d'un projet extrêmement ambitieux (surtout pour un seul développeur), mais que j'aimerais bien réaliser un jour - il y a tant à apprendre.
Je ne sais pas grand-chose sur le fonctionnement des protocoles (ce que vous devez absolument rechercher) ni sur ce qui se passe dans un navigateur, mais un bon point de départ serait les sources des navigateurs open-source, principalement Chrome et Firefox. Chrome est un projet particulièrement intéressant à examiner car il ne fait que ce par quoi je m'attends à ce que vous commenciez : le chrome et le backend du navigateur. Oubliez la création d'un moteur de rendu dans un premier temps - utilisez Webkit ou Gekko.