Как стать автором
Обновить

Комментарии 3

Целая статья строится вокруг поливания грязью Senior Frontend Developer AxemaFr
Что сложного было дополнить или уточнить? Зачем было тыкать человека носом, если статья была далеко не поверхностной?


Переход на личности -- это плохо. Не делайте так

image

Как раз и приведены факты, которые доказывают обратное — в полном соответствии с вашей пирамидой. Про личность AxemaFr упомянуто только то, что он Senior Frontend Developer — ровно то, что он сам про себя указал в профиле. Где вы видите «поливание грязью»?

Тем кто будет читать эти материалы и пытаться вынести для себя что-то из комментариев к байт коду.


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


Иными словами — не в коем случае не стоит воспринимать реализацию логики из комментариев как ту, которая реализована внутри v8. Потому что последствия этого могут вам стоить многократного просева производительности.


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


Например код:
ThrowReferenceErrorIfHole [0]


Описан как:
if (a === undefined) throw("ReferenceError: %s is not defined", const[0])


Что совершенно неправильно.


ThrowReferenceErrorIfHole — это проверка ссылки на предмет того используется ли она в TDZ или нет. То есть это ситуация когда компилятор не может точно установить, сейчас эта ссылка используется уже после момента инициализации или до, то есть нет возможности точно предсказать находится ли сейчас этот кусок кода в TDZ или не находится.


И возвращение undefined является следствием этой проверки, а не тем что стало причиной.


То есть код вида


{
  const func = () => param1;
  let param1 = 1;
  func();
}

Совершенно валиден, не смотря на то что param1 инициализируется после объявления кложуры. Но, в этой ситуации компилятор на момент сборки кложуры func не может точно знать когда func будет вызываться, то есть нет строгой детерминированности относительно param1.


В силу чего компилятор вынужден ставить обязательную проверку ThrowReferenceErrorIfHole


LdaImmutableCurrentContextSlot [2]
ThrowReferenceErrorIfHole [0]
Return 

И такой код может выполняться в разы медленнее чем код вида


let a;
( a === undefined ) && ( a = 1 );

который будет преобразован в байткод:


LdaUndefined 
Star r1
TestUndefined 
JumpIfFalse Label1
LdaSmi [1]
Star r1
Label1:

Что радикально отличается от ThrowReferenceErrorIfHole и по обьему работы и по предсказательной силе для будущих оптимизаций.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий