Как движок 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/опт…
и тутисходный код