WebKit или рассказ о том, как инженеры Apple подружились с "белочкой"

WebKit - двигатель брузера Safari. "Движок". Фактически, WebKit и есть Safari, так как все остальное, что в ней есть, по большому счету, всего лишь "система жизнеобеспечения": пользовательский интерфейс, утилиты и всякие прочие "удобства".

WebKit - движок с открытым исходным кодом, охотно используемый не только Apple, но и другими разработчиками Интернет-броузеров. Компоненты WebKit , WebCore и JavaScriptCore, классовые библиотеки на С++, и без проблем работают на большинстве компьютерных платформ.

Исходный код открыт на условиях LGPL, то есть, любой из компонентов, или все компоненты сразу, в неизменном или измененном виде, можно использовать в проектах любого назначения (в том числе, коммерческих), с одним условием. Оно простое, и довольно необременительное: библиотеки, или их производные, должны быть открытым исходным кодом на условиях лицензии LGPL.

Маковские разработчики могут делать с WebKit все, что угодно, без каких-либо ограничений. WebKit входит в состав "публичных" фреймворков (динамических библиотек особой структуры), поставляющихся с каждой копией Mac OS X, с июня 2003 года. Это оболочка вокруг WebCore и JavaScriptCore, и, по моему, это один из самых ярких и удачных примеров использования Objective-C. Об этом - во второй части, в "WebKit : вид изнутри".

А на днях, начались пробы нового претендента на роль интерпретатора JavaScript в WebKit. У претендента забавное имя (SquirrelFish, то есть, рыба-белка), и неплохие данные...

Это та самая "белочка" из заголовка. А вы что подумали?

1. Здравствуй, Белочка!

Едва ли среди читателей найдется хоть один, никогда и ничего не слышавший про JavaScript. На всякий случай...

JavaScript - язык, на котором программируются сценарии поведения web-страниц. В web-страницах для этой цели используются и другие языки, но лишь один из них поддерживается всеми современными броузерами на всех платформах, мобильных и компьютерных. И это именно JavaScript (не путать с Java, они "однофамильцы", и сходство у них чисто внешнее).

Быстрота и безошибочность интерпретатора JavaScript, встроенного в web-движок, не менее важны для броузера, чем скорость и качество отрисовки web-страниц на экране компьютера. В январе 2003 года, при большом стечении народа, выступая на открытии Mac World '03, Джобс объявил не просто "еще один броузер", но "самый быстрый броузер".

С тех пор, разработчикам WebKit просто некуда деваться. Чтобы выдавать эту самую скорость "на гора", тратятся неимоверные объемы человеко-часов, как на самой Apple, так и за ее пределами. Проект ведь с открытым исходным кодом, и это очень интересный и перспективный проект. Им увлеченно и самоотверженно занимается целое сообщество ("http://webkit.org/").

Некуда деваться и тем из них, кто занят JavaScriptCore. Их успехи несомненны: в Safari 3.1, скорость обработки скриптов (script по-английски "сценарий", так принято называть программы на JavaScript и других языках сценариев), по сравнению с Safari 3.0, заметно выросла. Релизам WebKit, вошедшим в состав официальных версий Safari, присваивается тот же номер версии. То есть, WebKit 3.1 в разы быстрее 3.0.

Пока неизвестно, каким будет номер следующей версии WebKit, 3.2 или 4.0. Но есть все основания полагать, что сценарии на JavaScript она будет понимать даже еще быстрее.


Эмблема Squirrel Fish.

30 мая сего года, производительность "белочки", нового интерпретатора JavaScript, сравнили с производительностью официальных версий WebKit. И этот SquarrelFish, местами еще совсем сырой, не оптимизированный, без доброй половины средств повышения производительности, легко и непринужденно, положил своих "предков" на обе лопатки. Что же будет, когда его приведут в "штатное" состояние?


Результаты SunSpider JavaScript benchmark. Чем полоска длиннее, тем лучше..

Причина столь неприличного роста - в применении достаточно нетрадиционных подходов к организации работы интерпретаторов. Повышение эффективности интерпретаторов, в конце прошлого века, стало темой нескольких исследований, результаты которых опубликованы. Выводы, к которым пришли исследователи, использованы в конструкции SquirrelFish. И опыт разработчиков языка Lua 5.0.

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

В совместной работе ученых из Trinity College Дублинского университета, во главе с профессором Дэвидом Грэггом, и ученых из института языков программирования Венского университета, возглавляемых профессором Антоном Эртль, был разрешен давний спор о том, какие интерпретаторы эффективнее: те, которые используют в своей работе стэк, или регистровые. Доказано, что регистровые интерпретаторы на 25-30% производительнее, при прочих равных условиях. Не верите?

Вот ссылка: "http://www.sagecertification.org/events/vee05/full_papers/p153-yunhe.pdf".

Разработка нового интерпретатора началась примерно два месяца назад. Он дебютировал во внутренней сборке с номером r33979, в середине мая.

WebKit следует путем "Think Different". Интерпретаторы других web-движков "учат" возможности скриптов 4-го поколения, позволяющие ускорить отработку скриптов, которые переписаны с учетом этих новых возможностей. Разработчики WebKit с этим не спешат.

А как же конкурентоспособность? Чарльз Ин опубликовал результаты сравнения SquirrelFish с Tamarin. Tamarin - JavaScript-движок, использующий все новейшие достижения. Он использует технологию JIT (компиляция "на лету"), здорово повышающую скорость. Кроме того, он поддерживает такие возможности скриптов 4-го поколения, как аннотация типов (Type annotation).

Tamarin используется в Flash 9, и будет использован в следующей версии Firefox.

И вот что получилось:


Время исполнения тестов SunSpider, и хотя это противоречит "законам гравитации", SquirrelFish опережает Tamarin во всех тестах. В последнем - не на много. Это когда против "белочки" используется сразу оба козыря: и JIT, и Type Annotations.

Если интересуют подробности, они здесь: "http://www.satine.org/archives/2008/06/03/squirrelfish-is-faster-than-tamarin/"

Еще одно...

Один из ведущих разработчиков SquirrelFish, Кэмерон Зварик (Cameron Zwarich) сравнил билд r34318 WebKit с движками броузеров-конкурентов. На выполнение серии тестов, WebKit потратил 2248 мс, Firefox 3.0 RC1 - в 1.46 раз больше (3288 мс), а Opera Snapshot 4844 выполняла их целых 6012 мс, дольше в 2.67 раз...

Команда разработчиков WebKit не слишком спешит связываться с "четвертым поколением" скриптов, так как они все еще не утверждены в качестве официального стандарта, и даже после того, как это случится, подавляющее большинство сценариев на абсолютном большинстве сайтов, в течении достаточно долгого времени, не будет использовать эти самые средства...

Пока это ни к чему (а маркетинг и "хайп"?), и кроме того, поддержку этих свойств несложно добавить в любую минуту. Ускорение же ядра движка - это и правда достижение.

2. Safari и WebKit, другие достижения

В мире десятки броузеров, число их пользователей приближается к полутора миллиардам. Видимо, броузеры - самый распространенный вид компьютерных программ. По состоянию на май 2008 года, 6.25% из общего числа используемых в мире броузеров - Safari. Только два броузера популярнее: Internet Explorer (около 75%) и Firefoх(чуть больше 17%).

Броузерами, которые много лет назад лидировали (Netscape Navigator), и просто очень хорошими броузерами (Opera, например), каждым в отдельности пользуется менее одного процента от общего числа пользователей.

Трехлучевая звезда, эмблема концерна Даймлер-Бенц, олицетворяет три стихии, покоренные инженерами концерна: воздух, вода и суша. Safari тоже покоряет три стихии: Mac OS X, Windows, и iPhone OS.

И кажется почти невероятным, что впервые мы услышали о Safari 7 января 2003 года. Первый официальный релиз Safari вышел 23 июня того же года. Менее чем через год, Safari стал третьим по популярности броузером в мире (Microsoft Internet Explorer 95.4%, Firefox 2.37%, Safari 0.67%, Opera 0.51% и Netscape Navigator 0.32% - так в середине 2004 года выглядела пятерка лидеров).

WebKit, движок Safari, еще популярнее. Разработчики компьютерных и мобильных броузеров охотно и с большим успехом используют его в своих проектах.

Больше всего меня поразила информация о том, что в проекте K Desktop Environment (KDE), в следующей его большой версии, планируется использовать WebKit. Дело в том, что именно в рамках этого проекта был разработан броузер Konqueror, и его движки KHTML и KJS. WebKit - их потомок.

О происхождении WebKit мы обязательно поговорим. Чуть позже.

"Внутренние" релизы Safari и Opera, соответственно, 26 и 28 марта 2008 года, стали первыми броузерами в мире, выполнившими тест Acid-3 полностью.

То, что каждый броузер отображает те же самые web-страницы по разному, в 90-е казалось неизбежным. Многие именно из-за этого мирились с монополией Microsoft Internet Explorer, потому что иначе воцарилась бы анархия, и все стало бы еще хуже...

Тесты Acid 1.3 разработаны именно для проверки совместимости броузеров с глобальными стандартами, то есть, как раз для предотвращения анархии.

Броузеров снова много, но свобода, как выяснилось, совсем не страшной. Никто, как оказалось, и не собирался писать нестандартные и неумелые броузеры. Даже странно, что об этом аспекте никто не подумал, живописуя раздрай, неизбежный в случае крушения MS Explorer.

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

Современные броузеры, как правило, корректно работают практически с любыми web-страницами. В том числе, с многими из тех, которые допускают к своему контенту только избранных, как правило, Internet Explorer и Firefox. Иногда в этом списке вообще только Explorer. Именно для того, чтобы иметь возможность читать такие страницы, многие продолжают пользоваться IE.

Поскольку "привратник" сделан, как и многое другое в некоторых системах, через одно хорошо известное место, нормальные броузеры, и Safari входит в их число, научились маскироваться под другие броузеры. И... очень часто, без малейших проблем, преспокойно открывать такие страницы, и работать с ними.

Все современные броузеры полностью справляются с тестом Acid-1. Это первый уровень стандартизации. По состоянию на май 2008, лишь 6 процентов официально выпущенных броузеров выполняют Acid-2 полностью. Первым из них был броузер с движком WebKit. Это был Safari 2.0.2, выпущенный 31 октября 2005 года.

Внутренний билд WebKit справился с этим тестом одним из первых, весной 2005. Вы не поверите, но до сих пор, когда уже разрабатывается еще более сложный тест Acid-4, с тестом Acid-2 не справляется ни один из официальных релизов Internet Explorer (только бета-версии Internet Explorer 8.0), и ни одна из официальных версий Firefox (тоже только беты).

Ни одна официальная версия ни одного официально выпущенного броузера в мире, по состоянию на все тот же май 2008 года, не справляется с тестом Acid-3 на все 100%. Safari 3.1.1 (билд 525.20) и Opera 9.5 хоть и справляются с этим тестом лучше остальных, но все равно не на 100%.

3. Происхождение WebKit

Когда перед командой программистов встает какая-то непростая задача, всегда есть выбор. Даже не выбор. Это уже традиция. Профессионал, скрепя сердце, и зажмурившись от ужаса, возьмется за проработку сложной и узкоспециальной темы только тогда, когда точно и достоверно выяснит, что решение подобных задач, увы, не выложено где-то в Сети, и другого выхода нет.

Это обычная, общеинженерная практика. Ее главный принцип очень прост: "если и изобретать велосипед, то только используя весь накопленный человечеством опыт, доступный для изучения".

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

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

Условие только одно (если исходники проекта распространяются на условиях лицензии LGPL): заимствованная бесплатная часть обязательно должна сохранить свой статус. То есть, остаться бесплатной и открытой, на условиях LGPL. Если открытый проект используется в неизменном виде, достаточно указать URL места, где лежат исходники.

Если проект подвергся переработке "под себя", необходимо открыть и его. И не просто открыть, а обеспечить к нему бесперебойный и бесплатный доступ. И пусть идущим после повезет еще больше. Все очень честно и справедливо.

И все всё понимают. Только Apple почему-то иногда обвиняют в том, что она следует обычной инженерной практике. Например в том, что WebKit был "содран" с движка броузера Konqueror (KHTML+KJS).

В ноябре 2000 года, на сайте Apple, в разделе "Требуются", появилось несколько вакансий. От соискателей требовалось хорошее владение Интернет-технологиями, опыт разработки web-движков, и тому подобные качества. Иными словами, в конце 2000 года было принято решение о разработке собственного броузера.

В работе команды принимал активное участие лично Джобс. Изучив доступные варианты, инженеры компании остановили свой выбор на web-движке с открытым исходным кодом, KHTML/KJS, который, по их мнению, был лучшим.

В начале 2001 (точная дата мне неизвестна), инженеры Apple создали собственную ветку в проектах KHTML и KJS, переименовали свой вариант библиотек в WebCore и JavaScriptCore, и, сохранив все достоинства оригинала, переписали их "набело".

Движок отныне умещался всего в 140 000 строк предельно чистого исходного кода, педантично следовал всем интернет-стандартам, и работал лучше оригинала. И не убеждайте меня в том, что дизайн библиотек - дело десятое.

Едва ли это то, что принято называть научным термином "передрать"...

О том, что представляет из себя надстроенный над компонентами на С++ "центр управления", или "собственно WebKit", я с большим удовольствием и подробно расскажу во второй части. Верьте мне, WebKit стоит этого.

7 января 2003 года, Safari 0.98, и WebKit 0.98 внутри него, объявленный Джобсом как "самый быстрый в мире броузер", оказался в руках пользователей. Не все и не всегда шло гладко. C дистрибутивом Mac OS 10.3 "Пантера" поставлялось сразу два броузера, Safari и Internet Explorer. Как когда-то Explorer и Netscape. В Mac OS 10.4 "Тигр" был уже только Safari 2.0. А про Safari третьего поколения вы и сами все знаете.

Если нет - скачайте его на сайте Apple, и попробуйте. Safari 3.1 работает и в Mac OS X, и в Windows, и в iPhone OS. Слухи про Safari для "юниксов" вполне могут оказаться правдой. Приятной охоты!

Первое время, открытым был только исходный код компонент WebCore и JavaScriptCore. В WebKit используются некоторые элементы, раскрывать которые не входило в намерения Apple. Но в 2005 году исходники WebKit были открыты.

Тайны, которые Apple предпочла не раскрывать, остались скрытыми от глаз. В основном, это исходные коды интерфейсных элементов, которые доступны программистам в Mac OS X (для использования), а программистам на других платформах так или иначе приходится искать другие средства отображения.

Подробнее о том, чем живет сообщество добровольных разработчиков WebKit, почитать исходные коды, может быть даже оставить свой след (а то и попасть на местную "доску почета"), можно посетив сайт этого сообщества, расположенный по адресу: "http://webkit.org/".

Если, взяв за основу WebKit, например, в варианте с надстройкой на С++, и как следует потрудившись, вы напишете сверхдвижок 22-го века, а потом, на его основе - супер-пупер web-броузер с неземными возможностями... будет здорово.

Продолжение следует...

Источник: Олег Свиргстин