Как начать создавать веб-браузер?

Я решил приложить некоторые усилия для создания веб-браузера с нуля. Какие общие функции, архитектуры и особенности современных веб-браузеров мне следует знать перед тем, как начать?

Любые рекомендации приветствуются!

Ответов (10)

Решение

Ну разобьем на части. Что такое веб-браузер? Что оно делает? Это:

  • Получает внешний контент. Итак, вам нужна HTTP-библиотека или (не рекомендуется) написать ее самостоятельно. В протоколе HTTP много сложностей / тонкостей, например, обработка заголовков с истекшим сроком действия, различных версий (хотя в наши дни это в основном 1.1) и т. Д .;
  • Обрабатывает разные типы контента. Есть реестр Windos для такого рода вещей, который вы можете использовать вместе. Я говорю об интерпретации контента на основе типа MIME;
  • Анализирует HTML и XML : для создания DOM (объектной модели документа);
  • Анализирует и применяет CSS : это влечет за собой понимание всех свойств, всех единиц измерения и всех способов указания значений (например, «border: 1px сплошной черный» против отдельных свойств border-width и т. Д.);
  • Реализует визуальную модель W3C (и это настоящий кикер); а также
  • Имеет движок Javascript .

И это вкратце веб-браузер. Некоторые из этих задач невероятно сложны. Даже легко звучащие могут быть трудными. Возьмите извлечение внешнего контента. Вам нужно иметь дело с такими вариантами использования, как:

  • Сколько одновременных подключений использовать?
  • Сообщение об ошибке пользователю;
  • Прокси;
  • Параметры пользователя;
  • и т.п.

Причина, по которой я и другие коллективно поднимаем брови, заключается в том, что движок рендеринга сложен (и, как кто-то заметил, на его разработку ушли человеческие годы). Основные движки рендеринга:

  • Trident: разработан Microsoft для Internet Explorer;
  • Gecko: используется в Firefox;
  • Webkit: используется в Safari и Chrome 0–27;
  • KHTML: используется в среде рабочего стола KDE. Webkit произошел от KHTML несколько лет назад;
  • Elektra: используется в Opera 4-6;
  • Presto: используется в Opera 7-12;
  • Blink: используется в Chrome 28+, Opera 15+, вилке webkit;

Тройку лидеров следует считать основными движками рендеринга, используемыми сегодня.

Движки Javascript тоже сложны. Есть несколько из них, которые, как правило, привязаны к конкретному механизму рендеринга:

  • SpiderMonkey: используется в Gecko / Firefox;
  • TraceMonkey: заменит SpiderMonkey в Firefox 3.1 и представит JIT (точно в срок) компиляцию;
  • KJS: используется Konqueror, привязан к KHTML;
  • JScript: движок Javascript Trident, используемый в Internet Explorer;
  • JavascriptCore: используется в Webkit браузером Safari;
  • SquirrelFish: будет использоваться в Webkit и добавляет JIT, например TraceMonkey;
  • V8: движок Google Javascript, используемый в Chrome и Opera;
  • Opera (12.X и ниже) также использовала свою собственную.

И, конечно же, есть все элементы пользовательского интерфейса: навигация между страницами, история страниц, очистка временных файлов, ввод URL-адреса, автозаполнение URL-адресов и так далее.

Это большая работа.

Вы можете начать с хорошо сформированного и действительного XHTML, который должен быть проще, чем суп из тегов, с которым ваш браузер столкнется в реальной «жизни».

Затем вы должны найти способ приспособить настоящий HTML из Интернета к вашим потребностям.

Но не обманывайте себя: браузер - это не маленький проект.

Большинство современных веб-браузеров - гигантские звери и, вероятно, довольно плохо спроектированы, потому что они (и сама сеть) развивались довольно бессистемно.

Вам нужно начать с того, чтобы четко обозначить цели вашего проекта (и то, чего вы надеетесь достичь). Вы делаете это просто для развлечения или ожидаете, что другие люди будут использовать ваш браузер? Если вы ожидаете, что его будут использовать другие, что будет для них стимулом? Нереально ожидать, что вы разработаете новый браузер с нуля, который каждый сможет использовать в качестве замены Chrome, Safari, Firefox, IE, Opera и т. Д. Все эти проекты имеют 10-15-летний старт. вы, и к тому времени, когда вы их догоните, они будут еще на 10-15 лет впереди вас. Кроме того, за ними стоит гораздо больше человеческих ресурсов, и поэтому, если вы хотите, чтобы ваш проект был успешным, вам в какой-то момент понадобится эта человеческая сила.

Это причина того, что Apple и Google, крупные компании с большим количеством ресурсов, не начали с нуля. Даже Microsoft не начинала с нуля. Первоначальный IE был основан на Mosaic. Сегодня единственными значительными браузерами, которые были созданы с нуля, являются Opera , Konqueror и Lynx., которые, к сожалению, имеют ничтожную долю рынка. Давайте на время забудем о Lynx, поскольку это текстовый браузер и, по-видимому, единственная причина, по которой он все еще существует, заключается в том, что он обслуживает эту конкретную нишу. Opera, возможно, является одним из лучших браузеров, когда-либо созданных, и, тем не менее, у него никогда не было большой доли рынка, поэтому помните, что успех и инновации - это не одно и то же. KHTML - это движок Konqueror, который сам по себе так и не стал очень успешным, но является основой WebKit, который используют и Apple, и Google. Я думаю, можно было бы определенно возразить, что, если бы KHTML никогда не создавался, ни Safari, ни Chrome не существовало бы. Интересно, что и KHTML, и Opera были в основном созданы норвежскими программистами, работающими в одном здании в Осло.

Вам нужно смотреть на создание веб-браузера, как на создание операционной системы, потому что это, по сути, и есть браузер - это операционная система для запуска веб-приложений. Веб-браузер, как и операционная система, представляет собой очень сложную программу, состоящую из множества компонентов. Конечно, людям удалось создать новые операционные системы с нуля. На ум приходит Линус Торвальдс. Он сделал Linux, одну из самых успешных операционных систем за всю историю.

Конечно, вы сталкиваетесь с дополнительной проблемой, из-за которой создание нового успешного браузера сложнее, чем создание новой успешной ОС. Ожидается, что браузеры будут безупречно запускать весь унаследованный код, распространенный в сети. Теперь предположим, что Линусу Торвальдсу сказали, что его новая ОС не будет иметь значения, если она не будет полностью обратно совместима с UNIX или какой-либо существующей ОС. Я сомневаюсь, что он бы беспокоился, а Linux, вероятно, не существовало бы сегодня. На самом деле, конечно, единственная причина, по которой Linux стал популярным, заключалась в том, что он был хорошо спроектирован, а проект GNU мог создавать инструменты для переноса огромных объемов существующего кода в Linux. Без идеологической поддержки Linux со стороны GNU у него никогда не было бы шанса.

Итак, если вы действительно достаточно амбициозны (или безрассудны), чтобы попытаться создать новый успешный браузер, вам следует сосредоточиться на архитектуре и дизайне . Нет никаких практических причин создавать новый браузер с нуля, если вы не уверены, что можете каким-то образом улучшить дизайн существующих браузеров. Это означает, что вам необходимо достаточно ознакомиться с кодом WebKit и Gecko , чтобы понять принятые ими дизайнерские решения, но вам не следует пытаться копировать их дизайн, потому что в противном случае вы могли бы просто использовать их код.

Мое личное мнение (без проведения достаточных исследований) заключается в том, что современные браузеры недостаточно модульны. Если бы я собирался создать новый браузер, я бы нашел способ упростить замену элементов (например, заменить один движок JavaScript на другой) и дать пользователю гораздо больше контроля, чем в существующих браузерах. . Современные браузеры и веб-дизайнеры отняли у пользователя почти весь контроль. Почему я, пользователь, не могу указать веб-браузеру, как я хочу отображать контент, отображаемый на моем компьютере? Первоначальный HTML давал только рекомендации о том, как структурировать контент, и со временем новые стандарты стали все более и более догматичными, до такой степени, что пользователь теперь полностью зависит от веб-дизайнера. Привлекательность Linux заключалась в том, что он вернул контроль пользователю, и что «

Еще одна вещь, на которую я бы потратил время на исследование, - это принципы проектирования операционных систем. Создание хорошего браузера, по крайней мере теоретически, должно требовать тех же принципов, что и разработка хорошей ОС, особенно в отношении параллельных процессов, моделей безопасности и т. Д.

Наконец, после множества исследований, я думаю, именно здесь вам следует начать кодировать:

  1. Реконструировать мозаику , но с вашими собственными дизайнерскими идеями. Это также то, что я бы посоветовал, если вы делаете это просто для развлечения или для получения образовательной выгоды. Прочтите исходные спецификации HTML 1.0 и HTML 2.0, а также спецификации HTTP 1.1 и текущие спецификации URI и убедитесь, что ваш браузер соответствует всем этим спецификациям. Вы, конечно, можете загрузить существующее программное обеспечение, которое уже обрабатывает транспортные протоколы, соглашения URI и т. Д., Но если вы серьезно относитесь к разработке своего собственного браузера, я думаю, что это хорошее упражнение - делать эти вещи с нуля, так что вы получите хорошее представление о том, как все части головоломки сочетаются друг с другом. В конце шага 0 у вас должен быть браузер, который, по крайней мере, сопоставим с тем, что было в 90-е годы. Это хорошая первая веха. И вы действительно можете скачать оригинальную мозаику по адресуftp://ftp.ncsa.uiuc.edu/Mosaic/ и посмотрите, как он соотносится с вашим браузером. Это также хорошее упражнение, чтобы увидеть, как текущие веб-сайты отображаются в древнем браузере, таком как Mosaic.

  2. Добавьте поддержку DOM в свой браузер. Сначала сосредоточьтесь на W3C DOM Level 1 и Level 2, поскольку почти все современные браузеры полностью их поддерживают. Затем посмотрите на уровень 3 и уровень 4. Модель DOM чрезвычайно важна для веб-программирования, и поэтому, если вы собираетесь создать современный веб-браузер, весь дизайн должен учитывать это. Поскольку вы пишете браузер на C#, вы можете подумать о том, как можно использовать существующую объектную модель .NET в своих интересах.

  3. Посмотрите на существующие механизмы сценариев и посмотрите, сможете ли вы перенести их в свой проект. Я бы отговорил вас от написания собственного интерпретатора JavaScript не только потому, что это очень большой проект сам по себе, но и потому, что так много работы уже было вложено в оптимизацию компиляторов JS (например, V8). Поэтому, если вы не гуру в дизайне компиляторов, ваш ручной интерпретатор JS, вероятно, будет хуже того, что уже существует, даже если он безупречно следует спецификациям EMCAScript. Опять же, я думаю, что механизм сценариев должен быть чем-то, что в любом случае является полностью отдельным модулем от реального браузера, поэтому я думаю, что было бы гораздо полезнее иметь структуру, которая позволяет вам заменять любой механизм сценариев, а не создавать механизм сценариев. это работает только с вашим браузером.

  4. Посмотрите исходный код HTML / CSS / JS для 10-20 лучших веб-сайтов в Северной Америке (Google, Facebook, YouTube, Twitter, Wikipedia, Amazon, популярные платформы для ведения блогов и т. Д.) И настройте свой браузер так, чтобы он хорошо работал с этими сайтами. . Это несколько более легко решаемая проблема, чем создание браузера, который соответствует всем существующим стандартам (то, что современные браузеры все еще не делают идеально), и тем более создание браузера, который правильно отображает все веб-сайты в Интернете (никто не может сделай это). Люди будут жаловаться, что ваш браузер нарушает стандарты и тому подобное, но это не такая большая проблема, как люди, жалующиеся на то, что они не могут получить доступ к Google или Facebook через ваш браузер. Я не могу вспомнить ни одного браузера, который бы правильно соблюдал все (или даже большинство) стандарты в своем первом выпуске, поэтому я говорю, что даже не пытайтесь.

Звучит как действительно интересный проект, но он потребует от вас огромных усилий.

Это не легкая вещь, но с научной точки зрения, вы можете узнать так много от него.

Некоторые ресурсы, которые вы можете проверить:

Но, глядя на это с реалистичной точки зрения, огромные усилия, необходимые для написания кода с нуля, напомнили мне этот комикс:


(источник: geekherocomic.com )

Удачи :-)

Как уже говорили все, веб-браузер - это огромный проект. Вам нужно беспокоиться о tcp / ip и сокетах, рендеринге html, использовании css, создании модели DOM, выполнении javascript, работе с искаженной разметкой и кодом и обработке всех типов файлов, прежде чем вы сможете даже подумать обо всем, что люди ожидают от браузер (например, закладки, история, приватный просмотр, безопасность и т. д.). Это огромный проект.

При этом это можно сделать. Я предлагаю взглянуть на исходный код Firefox. Я знаю, что вы сказали, что хотите создать браузер с нуля, но было бы очень полезно сначала поучиться на проекте с открытым исходным кодом.

Я бы загрузил исходный код Firefox и медленно удалил его. Другими словами, я бы взял исходный код и удалил все функции закладок. Затем я бы удалил возможность обрабатывать аддоны. Затем я бы удалил весь код, касающийся сохранения файлов. Я буду продолжать этот процесс, пока не получу очень простой веб-браузер. Я бы просмотрел этот код.

Затем я начал строить свой собственный. Я использовал знания, полученные при разборке Firefox, и вкладывал их в создание нового браузера.

Целом много удачи вам!

... тогда начните беспокоиться о безопасности

(нефункциональные и сквозные проблемы, как правило, следует учитывать заранее :))

Это безумно амбициозный проект (особенно для разработчика-одиночки), но я бы хотел когда-нибудь заняться чем-нибудь - вы могли бы многому у него научиться.

Я мало что знаю о том, как работают протоколы (это то, что вам определенно нужно изучить), или о том, что происходит в браузере, но отличным местом для начала будет исходный код браузеров с открытым исходным кодом, в первую очередь Chrome и Fire Fox. Chrome - особенно хороший проект, поскольку они делают только то, с чего я ожидал, что вы начнете: хром и внутренняя часть браузера. Забудьте сначала о создании движка рендеринга - используйте Webkit или Gekko.

Вы имеете в виду, как писать собственный движок рендеринга?

Могу только пожелать удачи. На создание текущего поколения различных браузеров ушло много человеко-лет. Если вы хотите добиться большего успеха, чем любой из них, вам потребуются серьезные навыки. Если вам нужно спросить, с чего начать, вам, вероятно, придется потратить больше нескольких лет на учебу, прежде чем будет иметь смысл пытаться выполнить такую ​​задачу.

Тем не менее, вот несколько (очевидных) указателей:

  1. писать много кода, который выполняет мелочи, например, решает все проблемы projecteuler.net
  2. узнайте все, что вы можете о своем наборе инструментов и его стандартах сообщества
  3. написать намного больше кода
  4. получить полное представление о конечных автоматах
  5. напишите еще код
  6. узнать все о стеке tcp / ip и о том, как он используется для http
  7. узнать все, что можно о http
  8. изучить стандарты (html, xml, sgml, css)
  9. отпразднуйте свое 150-летие.
  10. приступить к работе над фактическим проектом браузера.

редактировать ниже здесь

Я не имел в виду, чтобы это было мотивирующим или демотивирующим, просто попыткой показать вам, что браузер - это действительно большой проект, и что действительно большие проекты требуют много размышлений. Прямая честность, приправленная юмором.

Я занимаюсь программированием более двух третей своей жизни, и мне нравится думать, что я довольно приличный программист, но было бы глупо с моей стороны думать, что у меня есть половина шансов написать приличный веб-браузер с нуля. .

Конечно, если это то, что вы хотите сделать, не позволяйте моему комментарию стоять у вас на пути. Вы, вероятно, можете сделать лучше, чем Internet Explorer.

очень амбициозный проект, но один разработчик не может сделать это в одиночку, вам нужна команда (менеджер проекта, тестировщики ...), и, возможно, вам стоит пересмотреть свой выбор языка. С # работает только в Windows (я знаю моно в Linux, но это не то же самое) в любом случае желаю вам удачи и буду рад пользоваться вашим браузером: D

У тебя действительно много свободного времени, не так ли? AFAIK, большинство браузеров были написаны на C++, не у всех пользователей установлена ​​платформа .NET на своих компьютерах, и если они это сделают, это может быть не та версия, которая вам нужна.

Это может занять годы, но в любом случае существует множество браузеров с открытым исходным кодом, FireFox, Google Chrome и т. Д., Вы можете начать с просмотра кода, удачи в этом :)