Джеймс Миккенс выступил с докладом о своей статье Oakland IEEE S&P Pivot: быстрая синхронная изоляция мэшапов с использованием цепочек генераторов. Он является исследователем в MSR и в настоящее время приглашенным профессором в Массачусетском технологическом институте. Как обычно, я дам обзор его статьи на высоком уровне, и если вы сочтете ее интересной и захотите получить более подробную информацию, пожалуйста, обратитесь к его статье.

Для веб-страницы всегда существует проблема композиции. Важный вопрос заключается в том, почему мы должны изолировать библиотеки Javascript. Основная проблема в том, что прототипы изменчивы. Например, кто-то может изменить функции, такие как строка, содержащая функцию, выполнив следующие действия:

String.prototype.contains = function(){ return false; };

Теперь всякий раз, когда строковые вызовы содержат, они всегда будут возвращать false.

Джеймс разработал Pivot, систему изоляции коллажей с синхронными RPC и минимальным переписыванием исходного кода. Он накладывает поток и библиотеку RPC поверх postMessage() и фреймов. Каждая библиотека представляет собой фрейм, и при каждом вызове RPC Pivot приостанавливает вызывающий объект до тех пор, пока не будет получен ответ. В результате синхронные RPC обеспечивают повышение производительности на порядок по сравнению с предыдущими решениями по перезаписи.

Конструкция Pivot проста. Iframes используются в качестве изолирующих контейнеров. Каждая библиотека находится в отдельном фрейме, так что основная часть проверок безопасности остается на быстром C++, предоставляемом браузером. Затем Pivot использует минимальную перезапись для обеспечения синхронных RPC. Идея состоит в том, чтобы переписать вызов функции и возвраты + сайты вызовов, но не ссылки на свойства. Точнее, переписать ранее существовавшие возвращаемые значения функции (return retVal -> yield retVal). Каждая заглушка RPC дает специальное значение Pivot.RPC_YIELD. Наконец, Pivot переписывает сайты вызова функций. Затем он «приостанавливает» кадр при вызове RPC и возобновляет работу при возврате RPC с помощью функции генератора Javascript. Функция-генератор сохраняет свою запись активации при нескольких вызовах.

Одна маленькая деталь — отсрочка асинхронных событий. Например, что произойдет, если будет сгенерирован щелчок мыши, когда Pivot RPC находится в полете? Pivot поддерживает семантику атомарного обработчика. Пока RPC находится в работе, Pivot ставит в очередь прерывающие события. Когда обработчик завершает работу, Pivot отправляет события в очереди. Для получения более подробной информации, пожалуйста, обратитесь к его статье.

Еще одна деталь заключается в том, что им не нужно переписывать каждую функцию. Им нужно переписать доверенное ядро, которое делает синхронные RPC для сателлитов. Сателлиты не переписываются, потому что они не делают RPC. Это могут быть простые RPC-серверы, управляемые событиями.

Чтобы оценить систему, он создает mashup-приложение Shard и сравнивает его с Jigsaw. С точки зрения сквозной производительности Shard на Pivot в 12,6 раз быстрее, чем Shard на Jigsaw. Для более подробной оценки, пожалуйста, обратитесь к его статье.

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