С момента своего появления в браузерах, 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 в машинный код, может дать разработчикам преимущество при написании оптимизированного кода. В следующих разделах мы рассмотрим каждый этап процесса более подробно, чтобы вы могли понять, как наиболее эффективно взаимодействовать с этим мощным инструментом.

Комментарии (6)


  1. iliazeus
    09.11.2023 04:28
    +3

    Очень не хватает деталей и подробностей. Где именно, например, на вашей схеме Ignition, SparkPlug и TurboFan? Будет круто, если следующие статьи будут рассматривать устройство V8 более подробно.


    1. AlgoRhythm Автор
      09.11.2023 04:28
      -1

      я думаю, позже напишу еще одну статью про это все) а эта статья такая вводная . Поэтому и стоит уровнь простой


      1. dedmagic
        09.11.2023 04:28

        Видимо, Вы имели в виду "вводная".


        1. AlgoRhythm Автор
          09.11.2023 04:28

          да ????


  1. savostin
    09.11.2023 04:28
    +2

    Думал хотя бы до event loop погрузимся…


    1. AlgoRhythm Автор
      09.11.2023 04:28

      так , это же другая тема для разговора)
      в этой статье я верхнеуровнево рассмотрел , что происходит с кодом от загрузки ее в браузер и до исполнения , далее я думаю уже рассмотреть более детально конкретные этапе. Ну и про ассинхронность тоже готовлю статью