Хром понимает скомпилированный JavaScript?
Вместо того, чтобы V8 компилировал JavaScript на лету и затем выполнял его, разве нельзя просто предварительно скомпилировать JavaScript, а затем встроить машинный код в страницу вместо встраивания JavaScript в страницу?
2 ответа
Насколько я понимаю, движок V8 JavaScript все равно компилируется в машинный код, так почему бы просто не сделать это заранее?
Согласно спецификации W3C HTML5 Scripting, нет основанной на стандартах причины, по которой браузер не может поддерживать машинный код с помощью специальных type
атрибуты (как в Chrome для языка дартс):
Ниже перечислены строки типа MIME, которые должны распознавать пользовательские агенты, и языки, на которые они ссылаются:
"application/ecmascript" "application/javascript" ...
Пользовательские агенты могут поддерживать другие типы MIME для других языков...
В настоящее время ни один браузер не реализовал такую функцию.
Я подозреваю, что основной недостаток такого подхода заключается в том, что для каждой архитектуры чипа потребуется версия машинного кода сценария, специально скомпилированного для него. Это означает, что для поддержки трех архитектур страница должна будет включать скомпилированный скрипт три раза. (И это должно быть включено в четвертый раз, как обычный JavaScript, как запасной вариант для архитектур, которые вы не включили, или для браузеров, которые не могут / не поддерживают скомпилированный код.) Это может значительно увеличить размер страница с данными, которые в основном бесполезны. Казалось бы, увеличение времени загрузки значительно компенсирует или полностью перевешивает время, которое вы экономите на компиляции.
Компромиссное решение, не зависящее от архитектуры, такое как байт-код, кажется довольно плохим: вам все равно нужно дважды включить скрипт (один раз для байт-кода, один раз обычно для сценариев, которые его не поддерживают), и вам нужно выполнить некоторую обработку во время выполнения на байт-код, чтобы превратить его в машинный код.
Проблема множественных включений с резервированием - именно поэтому другие языки сценариев не попали в веб-среду: для того, чтобы быть полезной, им потребовалась бы скоординированная поддержка между поставщиками. Google пытается с Dart, но еще неизвестно, какую степень успеха они видят.
Обратите внимание, что Chrome кэширует скомпилированные версии сценариев, поэтому сценарий необходимо скомпилировать только один раз, а затем скомпилированный код кэшируется для повторного использования, когда пользователь повторно посещает страницу.
Существует две основные проблемы с доставкой машинного кода в Интернете:
- Переносимость Ни один сервер не может позволить себе предоставить соответствующий машинный код для всех возможных системных архитектур (существующих и будущих). Например, V8 уже поддерживает 10 различных архитектур процессоров.
- Безопасность Ни один клиент не может позволить себе запускать случайный машинный код на своей машине, не зная, можно ли ему доверять.
Чтобы решить (1), вам, как правило, нужно кросс-компилировать машинный код, который является более сложным и дорогостоящим, чем компиляция с языка высокого уровня. Для решения (2) вам необходимо проверить полученный вами машинный код, который является более сложным и дорогостоящим, чем компиляция языка высокого уровня.
Машинный код также имеет тенденцию быть намного больше, чем высокоуровневый код, поэтому существует проблема пропускной способности.
Теперь JavaScript не может быть особенно хорошим выбором языка высокого уровня. Но это то, с чем мы застряли как язык Интернета.