Перейти к основному содержимому

16 записей с тегом "ECMAScript"

Посмотреть все теги

Понимание спецификации ECMAScript, часть 4

· 6 мин. чтения
[Марья Хёльтта](https://twitter.com/marjakh), зритель спекулятивной спецификации

Все эпизоды

Тем временем в других частях Веба

Джейсон Орендорф из Mozilla опубликовал отличный подробный анализ синтаксических особенностей JS. Несмотря на различия в деталях реализации, все движки JS сталкиваются с одинаковыми проблемами, связанными с этими особенностями.

Понимание спецификации ECMAScript, часть 3

· 11 мин. чтения
[Марья Хёлтта](https://twitter.com/marjakh), наблюдатель за спекулятивными спецификациями

Все эпизоды

В этом эпизоде мы углубимся в определение языка ECMAScript и его синтаксис. Если вы не знакомы с контекстно-свободными грамматиками, сейчас самое время изучить основы, так как спецификация использует контекстно-свободные грамматики для определения языка. Ознакомьтесь с главой о контекстно-свободных грамматиках в "Crafting Interpreters" для доступного введения или со страницей Википедии для более математического определения.

Понимание спецификации ECMAScript, часть 2

· 10 мин. чтения
[Марья Хёльтта](https://twitter.com/marjakh), наблюдатель за спекулятивной спецификацией

Давайте ещё немного попрактикуемся в наших замечательных навыках чтения спецификации. Если вы ещё не посмотрели предыдущий эпизод, сейчас самое время это сделать!

Все эпизоды

Готовы ко второй части?

Весёлый способ узнать спецификацию — начать с функции JavaScript, о которой мы знаем, и узнать, как она описана.

Внимание! Этот эпизод содержит скопированные алгоритмы из спецификации ECMAScript состоянием на февраль 2020 года. Они со временем устареют.

Мы знаем, что свойства ищутся в цепочке прототипов: если объект не имеет свойства, которое мы пытаемся считать, мы поднимаемся по цепочке прототипов, пока не найдем его (или пока не найдем объект, у которого больше нет прототипа).

Например:

const o1 = { foo: 99 };
const o2 = {};
Object.setPrototypeOf(o2, o1);
o2.foo;
// → 99

Где определена проходка по прототипу?

Попробуем найти, где определено такое поведение. Хорошее место для начала — это список внутренних методов объекта.

Есть как [[GetOwnProperty]], так и [[Get]] — нас интересует версия, которая не ограничена только собственными свойствами, поэтому мы выбираем [[Get]].

К сожалению, тип спецификации описателя свойства также имеет поле [[Get]], поэтому при просмотре спецификации для [[Get]] нам нужно тщательно различать два независимых использования.

Дополнительный контент для "Понимание спецификации ECMAScript, часть 2"

· 2 мин. чтения
[Марья Хёлтта](https://twitter.com/marjakh), наблюдатель за спекулятивной спецификацией

Почему o2.foo является AssignmentExpression?

o2.foo не выглядит как AssignmentExpression, так как нет присваивания. Почему он является AssignmentExpression?

Спецификация на самом деле позволяет AssignmentExpression как аргумент и как правую часть присваивания. Например:

function simple(a) {
console.log('Аргумент был ' + a);
}
simple(x = 1);
// → Выводит “Аргумент был 1”.
x;
// → 1

…и…

x = y = 5;
x; // 5
y; // 5

o2.foo является AssignmentExpression, который ничего не присваивает. Это следует из следующих грамматических правил, каждое из которых выбирает "самый простой" случай до последнего:

AssignmentExpression не обязательно должен содержать присваивание, он также может быть просто ConditionalExpression:

AssignmentExpression : ConditionalExpression

(Есть и другие правила, здесь мы показываем только релевантное.)

ConditionalExpression не обязательно должен содержать условие (a == b ? c : d), он также может быть просто ShortcircuitExpression:

ConditionalExpression : ShortCircuitExpression

И так далее:

ShortCircuitExpression : LogicalORExpression

LogicalORExpression : LogicalANDExpression

LogicalANDExpression : BitwiseORExpression

BitwiseORExpression : BitwiseXORExpression

BitwiseXORExpression : BitwiseANDExpression

BitwiseANDExpression : EqualityExpression

EqualityExpression : RelationalExpression

RelationalExpression : ShiftExpression

Понимание спецификации ECMAScript, часть 1

· 8 мин. чтения
[Марья Хёльтта](https://twitter.com/marjakh), наблюдатель за спецификациями

Все эпизоды

В этой статье мы рассмотрим простую функцию в спецификации и попробуем понять её обозначения. Поехали!

Введение

Даже если вы знаете JavaScript, читать его языковую спецификацию, спецификацию языка ECMAScript, или просто спецификацию ECMAScript, может быть довольно сложно. По крайней мере, я так чувствовал, когда впервые начал её читать.

Более быстрые и функциональные API интернационализации

· 5 мин. чтения
[சத்யா குணசேகரன் (Сатья Гунасекаран)](https://twitter.com/_gsathya)

Спецификация API интернационализации ECMAScript (ECMA-402, или Intl) предоставляет ключевые функции, зависящие от локали, такие как форматирование дат, чисел, выбор формы множественного числа и сортировка. Команды Chrome V8 и Google Internationalization работали над добавлением новых функций в реализацию ECMA-402 в V8, при этом устраняя технические долги и улучшая производительность и совместимость с другими браузерами.

Ускорение spread-элементов

· 8 мин. чтения
Хай Дан и Георг Нейс

Во время своей трехмесячной стажировки в команде V8 Хай Дан работал над улучшением производительности [...array], [...string], [...set], [...map.keys()] и [...map.values()] (когда spread-элементы находятся в начале литерала массива). Он также сделал Array.from(iterable) намного быстрее. Эта статья объясняет некоторые подробности его изменений, которые включены в V8, начиная с версии v7.2.

Быстрее асинхронные функции и промисы

· 17 мин. чтения
Майя Армянова ([@Zmayski](https://twitter.com/Zmayski)), всегда-ожидающий предвосхититель, и Бенедикт Мойрер ([@bmeurer](https://twitter.com/bmeurer)), профессиональный гарантирующий производительность

Асинхронная обработка в JavaScript традиционно имела репутацию недостаточно быстрой. К тому же отладка живых JavaScript приложений — особенно серверов Node.js — является непростой задачей, особенно в случае асинхронного программирования. К счастью, времена меняются. В этой статье рассматриваются оптимизации асинхронных функций и промисов в V8 (и в некоторой степени в других движках JavaScript), а также описывается, как улучшился опыт отладки асинхронного кода.

Упорядочивание в V8

· 16 мин. чтения
Саймон Цюнд ([@nimODota](https://twitter.com/nimODota)), согласованный компаратор

Array.prototype.sort был одним из последних встроенных методов, реализованных на JavaScript с самохостингом в V8. Его портирование предоставило нам возможность экспериментировать с различными алгоритмами и стратегиями реализации, а затем наконец сделать его стабильным в V8 v7.0 / Chrome 70.

Улучшение производительности `DataView` в V8

· 8 мин. чтения
Тэотим Гроенс, <i lang="fr">учёный Data-Vue</i>, и Бенедикт Мойрер ([@bmeurer](https://twitter.com/bmeurer)), профессиональный специалист по производительности

DataViews — это один из двух возможных способов низкоуровневого доступа к памяти в JavaScript, другой способ — TypedArrays. До сегодняшнего дня DataViews были гораздо менее оптимизированы, чем TypedArrays в V8, что приводило к снижению производительности при выполнении задач, таких как графически интенсивные рабочие нагрузки или при декодировании/кодировании бинарных данных. Причины этого в основном исторические, например, тот факт, что asm.js выбрал TypedArrays вместо DataViews, что стимулировало движки сосредоточиться на производительности TypedArray.