В качестве первого вопроса рассмотрим, что должен реализовать современный браузер (некоторые браузеры переносят часть этой работы на службы операционной системы):
- Несколько анализаторов: XML, HTML, JavaScript,CSS, как минимум.
- Не менее четырех отдельных систем макетов (блочная модель CSS, flexbox, SVG, MathML).
- Как минимум одна графическая библиотека;для кроссплатформенных браузеров это необходимо для каждой платформы (насколько я знаю, IE9 + просто использует системную библиотеку Direct2D; Safari на Mac просто использует Quartz).
- Высокопроизводительная виртуальная машина с JIT,сборщик мусора, немного стандартной библиотеки (постоянно растет; см. типизированные массивы и различные другие недавние функции JavaScript).
- Реализация DOM, включая различные вещи, такие как специфичные для HTML и SVG-специфические интерфейсы DOMи т. д.
- Средства обработки аудио и видео (опять же Safari на Mac и IE выгружают их в операционную систему).
- Средства обработки изображений с поддержкой как минимум JPG / GIF / PNG,Опять же, некоторые браузеры могут загружать части этого в операционную систему.
- Библиотека для преобразования потоков байтов в символы Unicode.Опять же, иногда это может быть выгружено в операционную систему, а иногда нет.
- Для кроссплатформенных браузеров - своего рода слой переносимости, который абстрагирует отдельные биты платформы.
- Редактор HTMLс транзакциями и программируемым API;думаю, contenteditable.
- текстовый редактор для textareas.Некоторым из этого можно поделиться с редактором HTML, например.
- Средство проверки орфографии, которое может выгружаться или не выгружаться в ОС.
- Сетевая библиотека, поддерживающая HTTP, возможно SPDY, возможно FTPи, возможно, несколько других протоколов.Опять же, это может или не может быть выгружен в ОС.
- Криптографическая библиотека для обработки SSL и различных других криптографических нужд.Опять же, это может или не может быть выгружено в ОС.
- По крайней мере одна реализация базы данных (sqlite, кажется, популярен).
- Различный код для реального пользовательского интерфейса и еще много чего.
- Склейте код для обработки взаимодействий между ними: код, который управляет вызовами назад и вперед между JavaScript и DOM, код, который управляет повторным вычислением информации о стиле и компоновке при изменении DOM, код, который обрабатывает такие вещи, как
document.write
вставка строк изJavaScript во входной поток парсера и так далее.Обратите внимание, что количество кода клея, как правило, квадратично по количеству взаимодействующих модулей.
Возможно, мне не хватает нескольких вещей, но это не в моей голове.
В дополнение к этому, по крайней мере, у Gecko и WebKit есть библиотеки шаблонов для таких вещей, как строки и массивы (потому что у стандартных библиотек C ++ есть различные недостатки).
Для остальных ... на данный момент много "совместимость хаков "на самом деле являются частью веб-стандартов.Так что вы не можете их точно избежать.Ваш сценарий говорит о JavaScript и HTML, но не о SVG, MathML или CSS.Если вы на самом деле имеете в виду только HTML и JavaScript, но не CSS или все остальное, то вы, очевидно, можете вырезать кучу кода.Если вы включите все это, а также аудио и видео возможности HTML5 и хотите, чтобы ваш браузер работал хорошо, то я сомневаюсь, что вы можете сделать его намного меньше.