πŸš€βš™οΈ Визуализируя JavaScript. Π§Π°ΡΡ‚ΡŒ 1/7: ядро JavaScript [ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄]

mari_banana

Mari Kalyuzhna

Posted on December 6, 2023

πŸš€βš™οΈ Визуализируя JavaScript. Π§Π°ΡΡ‚ΡŒ 1/7: ядро JavaScript [ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄]

ΠšΡ€Π°Ρ‚ΠΊΠ°Ρ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡ процСсса ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ скриптов Π΄Π²ΠΈΠΆΠΊΠΎΠΌ JS

ΠšΡ€Π°Ρ‚ΠΊΠ°Ρ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡ процСсса ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ скриптов Π΄Π²ΠΈΠΆΠΊΠΎΠΌ JS

Π”Π°Π½Π½Ρ‹ΠΉ тСкст являСтся ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠΌ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ πŸš€βš™οΈ JavaScript Visualized: the JavaScript Engine авторства Lydia Hallie. Π’ процСссС Π°Π΄Π°ΠΏΡ‚Π°Ρ†ΠΈΠΈ Π½Π° русский язык я ΠΏΠΎΠΏΡ‹Ρ‚Π°Π»Π°ΡΡŒ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΡΡ‚ΠΈΠ»ΡŒ Π°Π²Ρ‚ΠΎΡ€Π°.

Π‘Ρ‚Π°Ρ‚ΡŒΡ являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ сСрии ΠΈΠ· 7-ΠΌΠΈ тСкстов, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Лидия доступно, с ΠΆΠΈΠ²Ρ‹ΠΌΠΈ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡΠΌΠΈ ΠΈ ΡŽΠΌΠΎΡ€ΠΎΠΌ, раскрываСт ΠΎΠ΄Π½ΠΈ ΠΈΠ· самых Π±Π°Π·ΠΎΠ²Ρ‹Ρ… ΠΈ, вмСстС с Ρ‚Π΅ΠΌ, слоТных для понимания ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΉ ΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² JavaScript.

ВступлСниС

JavaScript ΠΎΡ‡Π΅Π½ΡŒ ΠΊΡ€ΡƒΡ‚ (ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΠΌΠΎΠΉ взгляд). Но ΠΊΠ°ΠΊ, спроситС Π’Ρ‹, машина ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ пишСм? Нам, JavaScript Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ приходится ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π΅Π»ΠΎ нСпосрСдствСнно с компиляторами. Однако, Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ Π±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ прСдставлСния ΠΎΠ± устройствС ядра JavaScript ΠΈ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π² Π½Ρ‘ΠΌ наш human-friendly ΠΊΠΎΠ΄ обрабатываСтся ΠΈ прСобразуСтся Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. πŸ₯³

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅! Π”Π°Π½Π½Ρ‹ΠΉ пост, Π² основном, опираСтся Π½Π° Π΄Π²ΠΈΠΆΠΎΠΊ V8, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π² Node.js ΠΈ Chromium-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ….

Π˜Ρ‚Π°ΠΊ. Π§Ρ‚ΠΎ ΠΆΠ΅ происходит β€œΠ·Π° кулисами”?

Π­Ρ‚Π°ΠΏ 1. ΠŸΠΎΡ‚ΠΎΠΊ Π±Π°ΠΉΡ‚ΠΎΠ²

ΠŸΠ°Ρ€ΡΠ΅Ρ€ HTML сталкиваСтся с тэгом script с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ источника. Код ΠΈΠ· этого источника Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ ΠΈΠ· сСти, кэша ΠΈΠ»ΠΈ установлСнного сСрвис Π²ΠΎΡ€ΠΊΠ΅Ρ€Π° (service worker). ΠžΡ‚Π²Π΅Ρ‚ΠΎΠΌ Π½Π° запрос являСтся скрипт, прСдставлСнный Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±Π°ΠΉΡ‚ΠΎΠ². Π—Π°Π±ΠΎΡ‚Π° ΠΎΠ± этом ΠΏΠΎΡ‚ΠΎΠΊΠ΅ поручаСтся ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΎΠ±ΡƒΡ‡Π΅Π½Π½ΠΎΠΌΡƒ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±Π°ΠΉΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ :)

1 || Π‘ΠΊΡ€ΠΈΠΏΡ‚ загруТаСтся Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±Π°ΠΉΡ‚ΠΎΠ² Π² ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ UTF-16 ΠΈΠ· сСти, кэша ΠΈΠ»ΠΈ Π²ΠΎΡ€ΠΊΠ΅Ρ€Π° ΠΈ пСрСдаётся Π² Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±Π°ΠΉΡ‚ΠΎΠ²

1 || Π‘ΠΊΡ€ΠΈΠΏΡ‚ загруТаСтся Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±Π°ΠΉΡ‚ΠΎΠ² Π² ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ UTF-16 ΠΈΠ· сСти, кэша ΠΈΠ»ΠΈ Π²ΠΎΡ€ΠΊΠ΅Ρ€Π° ΠΈ пСрСдаётся Π² Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±Π°ΠΉΡ‚ΠΎΠ²

Π­Ρ‚Π°ΠΏ 2. Π”Π΅ΠΊΠΎΠ΄Π΅Ρ€ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±Π°ΠΉΡ‚ΠΎΠ²

Π”Π΅ΠΊΠΎΠ΄Π΅Ρ€ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±Π°ΠΉΡ‚ΠΎΠ² создаёт ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ Π½Π° основС ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΠ²ΡˆΠ΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π’Π°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 0066 прСобразуСтся Π² f, 0075Β β€” Π²Β u, 006eΒ β€” Π² n, 0063Β β€” Π² c, 0074Β β€” Π² t, 0069Β β€” Π² i,Β 006fΒ β€” Π²o, Π° 006e прСвратится Π²Β n с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠΌ. ΠšΠ°ΠΆΠ΅Ρ‚ΡΡ, здСсь Π±Ρ‹Π»ΠΎ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово function! Π’ JavaScript это ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… слов. Π˜Ρ‚Π°ΠΊ Ρ‚ΠΎΠΊΠ΅Π½ Π±Ρ‹Π» создан ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ Π² парсСр (ΠΈ прСпарсСр, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΊΠ° Π½Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΎ Π² ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡΡ…, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ вСрнёмся ΠΊ этому ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ ΠΏΠΎΠ·ΠΆΠ΅). ΠŸΠΎΡ…ΠΎΠΆΠ°Ρ ΡΡƒΠ΄ΡŒΠ±Π° постигаСт ΠΈ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ символы Π²ΠΎ входящСм ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π±Π°ΠΉΡ‚ΠΎΠ².

2 || Π”Π΅ΠΊΠΎΠ΄Π΅Ρ€ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±Π°ΠΉΡ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ Π±Π°ΠΉΡ‚Ρ‹ Π² Ρ‚ΠΎΠΊΠ΅Π½Ρ‹. Π’ΠΎΠΊΠ΅Π½Ρ‹ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² парсСр

2 || Π”Π΅ΠΊΠΎΠ΄Π΅Ρ€ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±Π°ΠΉΡ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ Π±Π°ΠΉΡ‚Ρ‹ Π² Ρ‚ΠΎΠΊΠ΅Π½Ρ‹. Π’ΠΎΠΊΠ΅Π½Ρ‹ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² парсСр

Π­Ρ‚Π°ΠΏ 3. ΠŸΠ°Ρ€ΡΠ΅Ρ€ ΠΈ АбстрактноС БинтаксичСскоС Π”Π΅Ρ€Π΅Π²ΠΎ

Π―Π΄Ρ€ΠΎ Π΄Π²ΠΈΠΆΠΊΠ° Π½Π° самом Π΄Π΅Π»Π΅ состоит Π°ΠΆ ΠΈΠ· Π΄Π²ΡƒΡ… парсСров: прСпарсСра (pre-parser) ΠΈ парсСра (parser). Π’ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ°Ρ… ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π²Π΅Π±-сайта, Π΄Π²ΠΈΠΆΠΎΠΊ стараСтся Π½Π΅ ΠΏΠ°Ρ€ΡΠΈΡ‚ΡŒ ΠΊΠΎΠ΄, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π΅Ρ‚ нСобходимости сразу, прямо сСйчас. ΠŸΡ€Π΅ΠΏΠ°Ρ€ΡΠ΅Ρ€ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован ΠΏΠΎΠ·ΠΆΠ΅, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ парсСр Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π°Π΄ ΠΊΠΎΠ΄ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ΅Π½ β€œΠ·Π΄Π΅ΡΡŒ ΠΈ сСйчас”!

НапримСр, Ссли какая-Ρ‚ΠΎ функция вызываСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ, Π½Π΅Ρ‚ Π½ΡƒΠΆΠ΄Ρ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эту Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ сайта. А Π²ΠΎΡ‚, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ событиС ΠΊΠ»ΠΈΠΊΠ° ΠΏΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ΅, Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ Ρ‚Π΅ΠΌ самым ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ρ‚ΠΎΠ³Π΄Π° парсСр ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π΅Ρ‘.

ΠŸΠ°Ρ€ΡΠ΅Ρ€ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΡƒΠ·Π»Ρ‹ (Π½ΠΎΠ΄Ρ‹), основанныС Π½Π° Ρ‚ΠΎΠΊΠ΅Π½Π°Ρ…, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΈΠ· Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±Π°ΠΉΡ‚ΠΎΠ². Из этих ΡƒΠ·Π»ΠΎΠ² формируСтся АбстрактноС БинтаксичСскоС Π”Π΅Ρ€Π΅Π²ΠΎ (Abstract Syntax Tree, AST). 🌳

3 || ΠŸΠ°Ρ€ΡΠ΅Ρ€ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΡƒΠ·Π»Ρ‹, основанныС Π½Π° Ρ‚ΠΎΠΊΠ΅Π½Π°Ρ…, ΠΈ создаёт АбстрактноС БинтаксичСскоС Π”Π΅Ρ€Π΅Π²ΠΎ

3 || ΠŸΠ°Ρ€ΡΠ΅Ρ€ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΡƒΠ·Π»Ρ‹, основанныС Π½Π° Ρ‚ΠΎΠΊΠ΅Π½Π°Ρ…, ΠΈ создаёт АбстрактноС БинтаксичСскоС Π”Π΅Ρ€Π΅Π²ΠΎ

Π­Ρ‚Π°ΠΏ 4. Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€

НаконСц, Π² Π΄Π΅Π»ΠΎ вступаСт ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€! Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Ρ‡Π΅Ρ€Π΅Π· AST, ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ΄, основанный Π½Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΡ‚ AST. ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΊΠΎΠ΄ сгСнСрирован ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ, АбстрактноС БинтаксичСскоС Π”Π΅Ρ€Π΅Π²ΠΎ удаляСтся, очищая ΠΏΠ°ΠΌΡΡ‚ΡŒ. Π˜Ρ‚Π°ΠΊ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ, с Ρ‡Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ наша машина (ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€/Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½ ΠΈ Ρ‚.Π΄.)! πŸŽ‰

4 || Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ проходится ΠΏΠΎ AST (АбстрактноС БинтаксичСскоС Π”Π΅Ρ€Π΅Π²ΠΎ) ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ΄

4 || Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ проходится ΠΏΠΎ AST (АбстрактноС БинтаксичСскоС Π”Π΅Ρ€Π΅Π²ΠΎ) ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ΄

Π­Ρ‚Π°ΠΏ 5. ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ компилятор

Π₯отя Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ быстрый, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ быстрСС. По ΠΌΠ΅Ρ€Π΅ выполнСния этого Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° гСнСрируСтся информация. Он ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, часто Π»ΠΈ повторяСмся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ дСсятки Ρ€Π°Π·: ΠΏΡ€ΠΈΡˆΠ»ΠΎ врСмя Π΅Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Π»Π° Π΅Ρ‰Π΅ быстрСС! πŸƒπŸ½β€β™€οΈ

Π‘Π°ΠΉΡ‚-ΠΊΠΎΠ΄ вмСстС с Ρ„ΠΈΠ΄Π±Π΅ΠΊΠΎΠΌ сгСнСрированного Ρ‚ΠΈΠΏΠ° отправляСтся ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌΡƒ компилятору. ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ компилятор ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ ΠΈ фидбэк Ρ‚ΠΈΠΏΠ° ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π° ΠΈΡ… основС высокооптимизированный ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. πŸš€

5 || Байт–код ΠΈ Ρ„ΠΈΠ΄Π±Π΅ΠΊ Ρ‚ΠΈΠΏΠ° ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ компилятор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ высоко ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄

5 || Байт–код ΠΈ Ρ„ΠΈΠ΄Π±Π΅ΠΊ Ρ‚ΠΈΠΏΠ° ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ компилятор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ высоко ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄

ΠŸΡ€ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π΄Π²ΠΈΠΆΠΊΠ° с динамичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ

JavaScript β€” это динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ язык, Π° это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠ³ΡƒΡ‚ постоянно ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ. Π‘Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, Ссли Π±Ρ‹ Π΄Π²ΠΈΠΆΠΊΡƒ JavaScript ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π°, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ случаи, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π²ΠΈΠΆΠΎΠΊ Π²ΠΈΠ΄Π΅Π» Ρ€Π°Π½ΡŒΡˆΠ΅ ΠΏΡ€ΠΈ запускС Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°. Если ΠΌΡ‹ Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ использовали ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ снова ΠΈ снова Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π» ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ процСсс. Однако, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ JavaScript являСтся динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ, ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ Π²Π΅Ρ€Π½Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Если это ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½, ΠΈ Π΄Π²ΠΈΠΆΠΎΠΊ вСрнСтся ΠΊ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ сгСнСрированного Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°.

Допустим, опрСдСлСнная функция вызываСтся 100 Ρ€Π°Π· ΠΈ Π΄ΠΎ сих ΠΏΠΎΡ€ всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π»Π° ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ΡΡ , Ρ‡Ρ‚ΠΎ ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ Π²Π΅Ρ€Π½Π΅Ρ‚ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ 101-ΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅.

Допустим, Ρƒ нас Π΅ΡΡ‚ΡŒ нСкоторая функция sum, которая (Π΄ΠΎ сих ΠΏΠΎΡ€) всСгда Π²Ρ‹Π·Ρ‹Π²Π°Π»Π°ΡΡŒ с числовыми значСниями Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·:

function sum(a, b) {
    return a + b
}

sum(1, 2)
Enter fullscreen mode Exit fullscreen mode

Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ Π²Π΅Ρ€Π½Ρ‘Ρ‚ число 3! Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π²Ρ‹Π·ΠΎΠ²Π΅ΠΌ Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π΄Π²ΠΈΠΆΠΎΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π΅Ρ‘ снова с двумя числовыми значСниями.

Если это ΠΏΡ€Π°Π²Π΄Π°, динамичСский поиск Π½Π΅ трСбуСтся, ΠΈ ΠΌΠΎΠΆΠ½ΠΎ просто ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, Ссли ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΌ, вмСсто ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ машинного ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΊ исходному Π±Π°ΠΉΡ‚ΠΎΠ²ΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ.

НапримСр, ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ строку вмСсто числа. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ JavaScript являСтся динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ошибок!

function sum(a, b) {
    return a + b
}

sum('1', 2)
Enter fullscreen mode Exit fullscreen mode

Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС, число 2 Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΎ Π² строку, ΠΈ вмСсто числа 3 функция Π²Π΅Ρ€Π½Π΅Ρ‚ строку "12". Π”Π²ΠΈΠΆΠΎΠΊ JavaScript возвращаСтся ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° ΠΈ обновляСт ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ связь ΠΎ Ρ‚ΠΈΠΏΠ΅.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

НадСюсь, этот пост Π±Ρ‹Π» ΠΏΠΎΠ»Π΅Π·Π΅Π½ для вас! ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, остаётся Π΅Ρ‰Ρ‘ ΠΌΠ½ΠΎΠ³ΠΎ частСй ядра JS, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я Π½Π΅ раскрыла Π² этом ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π΅ (JS heap, стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², ΠΈ Ρ‚.Π΄.), ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… я расскаТу ΠΏΠΎΠ·ΠΆΠ΅! Π― ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ Π²Π°ΠΌ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ исслСдования, Ссли Π²Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΠ΅Ρ‚Π΅ΡΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌΠΈ особСнностями JavaScript. V8 ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ исходный ΠΊΠΎΠ΄ ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π½ΡƒΡŽ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ!Β πŸ€–

ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ссылки: V8 DocsΒ ||Β V8 GithubΒ ||Β Chrome University 2018: Life Of A Script

Π ΠΎΠ»ΠΈΠΊ Π½Π° YouTube Π½Π° английском, Π³Π΄Π΅ Лидия Π΅Ρ‰Ρ‘ Π±ΠΎΠ»Π΅Π΅ наглядно Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ устройство Π΄Π²ΠΈΠΆΠΊΠ° JavaScript:

Understanding the V8 JavaScript Engine



Lydia Hallie Π² соцсСтях: TwitterΒ ||Β InstagramΒ ||Β GitHubΒ ||Β LinkedIn || Website

P.S. Автор использовала Keynote для создания Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΉ ΠΈ записСй экрана.

P.P.S. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΡΡ‚Π°Ρ‚ΡŒΡΡ… Π±ΡƒΠ΄ΡƒΡ‚ рассмотрСны Ρ‚Π°ΠΊΠΈΠ΅ ΡˆΡ‚ΡƒΠΊΠΈ, ΠΊΠ°ΠΊ ΠŸΠΎΠ΄Π½ΡΡ‚ΠΈΠ΅ (hoisting), Π¦ΠΈΠΊΠ» событий (event loop), ΠΎΠ±Π»Π°ΡΡ‚ΡŒ дСйствия (scope chain), ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ½ΠΎΠ΅ наслСдованиС (prototypal inheritance), Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ (generators ans iterators), промисы (promises) ΠΈ async/await

πŸ’– πŸ’ͺ πŸ™… 🚩
mari_banana
Mari Kalyuzhna

Posted on December 6, 2023

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related