Вопрос: Что такое Node.js?
О: Node.js — это JavaScript, работающий на веб-сервере, основанный на движке Chrome V8 и обладающий такими функциями, как неблокирующий и управляемый событиями ввод-вывод.
В: Подождите, вы только что упомянули движок Chrome V8, что это такое и почему вы используете его вместо других движков?
О: Механизм JavaScript — это программа или интерпретатор, выполняющий код JavaScript. Механизм JavaScript может быть реализован как стандартный интерпретатор или как интерактивный компилятор, который компилирует JavaScript в байт-код в той или иной форме. Его рабочий процесс примерно таков:
Одним из них является движок Chrome V8, разработанный Google и написанный на C++, и его рабочий процесс почти такой же, как на картинке выше:
V8 преобразует код JavaScript в более эффективный машинный код (процессоры IA-32, x86-64, ARM или MIPS), чем другие механизмы JavaScript преобразуют его в байт-код или интерпретируют его. Он реализован компилятором JIT (Just-In-Time) и не генерирует байт-код или какой-либо промежуточный код. И используйте такие методы, как встраивание, формы, встроенные кэши и т. д., чтобы повысить производительность.
Q: Отлично, теперь я немного знаю, для чего хорош движок Chrome V8, но методы, которые вы перечислили, действительно поражают меня.
A: Например, формы и встроенные кэши используются для оптимизации загрузки свойств объекта.
В: А?
A: Спецификация ECMAScript в основном определяет все объекты как словари со строковыми значениями ключей, сопоставленными со свойствами свойств, где[[]]
Квадратные скобки — это то, как спецификация определяет свойства, которые не могут быть представлены непосредственно в JavaScript.
В: Он тоже так хранится в памяти?
A: Нет, нет, было бы пустой тратой места хранить это в памяти вот так. называть предметы одинаковой формыobject = { x: 7, y: 8 }
, имена их атрибутов совпадают, а в полном словаре значений атрибутов есть только[[value]]
разные.
Q: Это должно храниться отдельно, за исключением[[value]]
Все имена свойств и остальные свойства хранятся отдельно. И у него должно быть свойство, которое сообщает движку JavaScript, где искать конкретное значение.
A: Да, двигатель будетShape
Хранится отдельно, следующие JSObject просто магазины[[value]]
,Shape
есть одинOffset
Смещение, чтобы сообщить JavaScript, где искать конкретное значение:
Преимущество становится очевидным, когда есть несколько объектов одинаковой формы. Потому что им нужно только один раз сохранить свою форму и информацию об атрибутах ключ-значение!
В: Так оно и было, но какое отношение это имеет к встроенным кэшам?
О: Это очень важно. Фигуры в основном используются для реализации встроенных кэшей (ICs). Встроенные кэши являются одним из ключевых факторов быстрой работы JavaScript.
Вопрос:
A: Например, есть функция, которая получает свойство x от объекта, при выполнении в JSC (JavaScriptCore) будет сгенерирован следующий байт-код:
Встроенные кэши в первой инструкцииget_by_id
инструкция, состоящая из двух неинициализированных слотов.
при вызове функцииgetX({ x: 'a' })
Когда, как упоминалось ранее, объект{ x: 'a' }
Есть свойство, которое содержитx
Shape, Shape содержит свойства смещения x и другие свойства, при выполнении первой функции атрибут будет иметь значение Shape и offset, хранящееся во встроенных кэшах:
При последующих вызовах этой функции Inline Caches нужно только сравнить Shape, и если он такой же, как и раньше, ему нужно только загрузить значение свойства из смещения. Это намного быстрее, чем каждый поиск.
Вопрос: Очень интересно!
О: V8 сделал гораздо больше: в грядущей версии 7.2 время парсинга значительно сокращено, время загрузки сокращено, а скорость отклика улучшена:
В: Хорошо, давайте не будем говорить о V8, меня очень интересует неблокирующий и управляемый событиями ввод-вывод, о котором вы упоминали ранее.
А:......
Продолжение следует