Как движок 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
Удалять ранее неутилизированную кучу при остановке выполнения кода. Это позволяет делать очень короткие паузы. Как упоминалось ранее, этап сканирования обрабатывается отдельным потоком.
f.itmarket.blogspot./2012/04/опт…
и тутисходный код