Путешествие JavaScript-кода через движок V8

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

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

И так давайте рассмотрим более подробно каждый этап исполнения JavaScript-кода движком V8.

Начнем мы с первого этапа это собственно получение файла с кодом написанным на javaScript

Тут все довольно просто , мы просто загружаем файл с js
Тут все довольно просто , мы просто загружаем файл с js

Далее в дело вступает движок V8 который, парсит JavaScript код и преобразует его в абстрактное синтаксическое дерево AST(Abstract Syntax Tree). AST отражает структуру кода в иерархическом виде с синтаксическими элементами, такими как операторы, объявления переменных, выражения и т.д.

Далее AST подхватывает компилятор , который берет AST - дерево и преобразуется в байткод, который является более низкоуровневым представлением кода. Этот байткод может быть исполнен интерпретатором, который читает и выполняет байткод инструкция за инструкцией.

Несмотря на то , что наш код уже прошел столько этапов , этого не достаточно ведь байт-код это не машинный код. Давайте немного отойдем и вспомним что такое Байт код.

Байт-код является более высокоуровневым по сравнению с машинным кодом. Он предназначен для выполнения виртуальной машиной (например, Java Virtual Machine или виртуальной машиной JavaScript V8), а не напрямую аппаратным оборудованием.

Далее в работу вступает JIT-компиляция

JIT-компилятор принимает "горячий" (часто выполняемый) байткод и компилирует его в машинный код для улучшения производительности. Это позволяет программе работать быстрее, поскольку машинный код выполняется непосредственно процессором. Так как я рассказал о том что такое байт-код , думаю не стоит обделять вниманием и машинный код.

Машинный код — это низкоуровневый код, который исполняется напрямую аппаратным оборудованием процессора. Это последний этап в процессе преобразования кода перед его выполнением.

Я думал на этом закончить , но захотелось с вами поделиться тем , какие оптимизации выполняет JIT с нашим кодом (от исходного вида которого ничего не осталось).

  • Инлайнинг функций: Если функция вызывается часто, JIT-компилятор может встроить её код непосредственно в место вызова, чтобы избежать затрат времени на вызов функции.

  • Устранение избыточных операций: Компилятор может определить и удалить операции, которые не влияют на результат (например, вычисления, которые никогда не используются).

  • Типовая специализация: Компилятор делает предположения о типах данных и оптимизирует код под эти типы. Если предположения нарушаются (например, функция, которая всегда получала числа, вдруг получает строку), код может быть "деоптимизирован" и заново скомпилирован с менее специфичными оптимизациями.

  • Оптимизация циклов: Переупорядочивание и улучшение циклов для уменьшения количества инструкций и количества обращений к памяти.

  • Удаление мертвого кода: Код, который никогда не достижим во время исполнения, удаляется.

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

Заключение

Понимание того, как V8 превращает строки JavaScript в машинный код, может дать разработчикам преимущество при написании оптимизированного кода. В следующих разделах мы рассмотрим каждый этап процесса более подробно, чтобы вы могли понять, как наиболее эффективно взаимодействовать с этим мощным инструментом.

Источник: https://habr.com/ru/articles/772648/


Интересные статьи

Интересные статьи

Правдивый опус о провальном сезоне и недополученной прибыли глазами генерального директора Игоря Сергеевича и маркетолога Лидочки.
Путешествие от шифра Цезаря до RSA. Прикладная теория чисел.Во все времена люди пытались найти способ безопасной передачи информации, метод, при котором зашифрованное сообщение мог прочитать только то...
Привет, Хабр! Я Кристина — продакт-менеджер компании Selectel. В статье расскажу, как мы строим гипотезы и проверяем потенциальную полезность и выгоду от фичей до того, как на их реализацию будут по...
Переименовав недавно Яндекс.Такси в «Яндекс Go», разработчики приложения сделали невозможным его поиск через Spotlight по главному ключевому слову — «такси». Однако дело ...
За последние несколько лет в обучении с подкреплением (reinforcement learning, RL) произошли серьезные прорывы: от первого успешного его использования в обучении по сырым пикселям до обучения Ope...