Как работает Google V8 Engine (перевод)

внешний интерфейс JavaScript Google Vue.js V8

Как движок V8 выполняет JS, я уже видел внутреннюю историю технологии Webkit, но я просто прохожу мимо. Я не понимал этого глубоко, и вдруг я увидел эту статью и перевел ее.How does the Google V8 engine work?

Google V8Как работает двигатель? Это очень хороший вопрос, есть несколько официальных документов, которые можно объяснить.V8что сделано внутри. Я поделюсь с вами тем, что знаю (вы должны сами догадаться, какую часть я удалил), и множеством полезных адресов, которые помогут вам понять.

V8Есть два компилятора:

  • Очень простой и очень быстрый компилятор используется дляjsКомпилировать в простой, но очень медленный машинный код, называемыйfull-codegen.
  • Другой — очень сложный оптимизирующий компилятор в реальном времени, который компилирует высокопроизводительный исполняемый код, называемыйCrankshaft.

V8Внутри также используются некоторые нити:

  • Основной поток делает то, что вы хотите: загружает ваш код, компилирует его, выполняет.
  • Существует отдельный поток компиляции, который оптимизирует код во время выполнения основного потока.
  • ОдинprofilerПоток (не знаю, есть ли еще, но будет поток с такой же ответственностью), который используется для обнаружения того, какой метод потребляет много времени во время выполнения, так чтоCrankshaftЭтот код можно оптимизировать.
  • некоторые используются дляGCОбработка потоков (Примечание переводчика: вот некоторыеGCпотоков, для сборки мусора используется более одного потока).

Когда ваш код выполняется впервые,V8начать использоватьfull-codegen,full-codegenнапрямуюJSКод интерпретируется как механический код без какого-либо преобразования. Это позволяетV8Быстрое выполнение механического кода. Уведомление,V8Промежуточный байт-код не используется, поэтому обработка перевода не требуется.

Когда ваш код выполняется,profilerВ потоке достаточно данных, чтобы выяснить, какие методы необходимо оптимизировать. я не уверенV8Как выбрать, какой поток использовать для оптимизации, для простоты предположим, что он использует основной поток.

Основной поток начинает использоватьCrankshaftоптимизировать.JSСначала код компилируется в файл с именемHydrogenВысокоуровневое описание , которое представляет собой статическое представление графа потока управления с одним назначением. Большинство оптимизаций выполняется на этом уровне.

Во-первых, встраивание как можно большего количества кода делает оптимизацию более значимой. Затем выполните преобразование типов. Эта оптимизация удаляет обработку упаковки и распаковки, которую можно рассматривать как выполнение большого количества инструкций. Это означает, что если ваш код работает с целыми числами и не выполняет преобразование типов, например преобразование вstring,doubleЭти, то он будет работать быстро. На этом этапе очень важную роль будет играть встроенное кэширование, обеспечивающее суждение о типе. Как вы уже догадались, нам нужно быть осторожными с приведением типов: если вы ожидаете, что переменная будет целым числом, но позже она будет изменена на какой-то другой тип, тогда ваше предположение не сработает, и неизбежно произойдет перекомпиляция. Есть и другие оптимизации, такие какloop-invariant code motion(Примечание переводчика: Вроде бы речь идет о перемещении кода, который не изменяется в цикле, наружу, уменьшении количества кодов, выполняемых в каждом цикле), удалении мертвого кода (Примечание переводчика: Код, который не выполняется, также должен удалить, иначеV8Всегда приходится иметь дело с этими кодами, внося дополнительную нагрузку) и т.д.

однаждыHydrogen graphоптимизирован,Crankshaftпонизит его до низкоуровневого описания, называемогоLithium. Большинство изLithiumВыполнение на определенной архитектуре. Распределение регистров выполняется на этом уровне.

наконец,Lithiumкомпилируется в машинный код. Потом некоторые звонилиOSR (on-stack replacement) случилось. Помните, прежде чем мы начнем компилировать и оптимизировать метод, который требует много времени для выполнения, мы хотели бы сначала выполнить его. Не будем забывать, что мы просто замедлили выполнение и начали выполнять оптимизированный код. Вместо этого мы собираемся преобразовать все контексты, чтобы мы могли выбрать выполнение оптимизированного кода в середине выполнения. Я усложняю вам, ребята, напоминая, что среди других оптимизаций мы что-то встраиваем.V8Это не единственная виртуальная машина, но я нашел несколько довольно сумасшедших вещей. Есть некоторые механизмы защиты, называемые деоптимизацией, которые делают обратное и в некоторых гипотетических конкретных случаях обращают некоторый оптимизированный код вспять.

а также. Это часть компиляции/выполнения. я забыл упомянутьGC, хотя он короткий, потому что я мало что знаю об этом.

Для сбора мусора,V8Используется традиционный метод, а сборка мусора осуществляется посредством подсчета меток. Фаза маркировки должна быть остановленаJavaScriptвоплощать в жизнь. контролироватьGCстоимость, делая выполнение более стабильным,V8Используйте добавочную разметку. То есть вместо того, чтобы пытаться пометить все возможные объекты в куче, они обрабатывают часть кучи и возобновляют нормальное выполнение. СледующийGCУдалять ранее неутилизированную кучу при остановке выполнения кода. Это позволяет делать очень короткие паузы. Как упоминалось ранее, этап сканирования обрабатывается отдельным потоком.

posts tagged "v8"

Posts Tagged 'v8'

V8 Resources

thlorenz/v8-perf

docs.google.com/document...

f.itmarket.blogspot./2012/04/опт…

и тутисходный код