Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ

Π Π°Π·Π±ΠΎΡ€ ΠΊΠΎΠ΄Π° ΠΈ построСниС синтаксичСских Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π² с PLY. ΠžΡΠ½ΠΎΠ²Ρ‹

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ PLY?

PLY β€” это Π°Π±Π±Ρ€Π΅Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° ΠΈΠ· ΠΏΠ΅Ρ€Π²Ρ‹Ρ… Π±ΡƒΠΊΠ² выраТСния: Python Lex-Yacc.
ЀактичСски, это ΠΏΠΎΡ€Ρ‚ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ lex ΠΈ yacc Π½Π° python Π² красивой ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ΅.
Π Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ply ΠΎΡ‡Π΅Π½ΡŒ просто ΠΈ ΠΏΠΎΡ€ΠΎΠ³ Π²Ρ…ΠΎΠ΄Π° для Π½Π°Ρ‡Π°Π»Π° использования практичСски Π½ΡƒΠ»Π΅Π²ΠΎΠΉ.
Написан ΠΎΠ½ Π½Π° чистом ΠΏΠΈΡ‚ΠΎΠ½Π΅ ΠΈ прСдставляСт ΠΈΠ· сСбя LALR(1) парсСр, Π½ΠΎ ΠΊΠΎΠΌΡƒ это интСрСсно?
Π― ΠΏΠΎ Π½Π°Ρ‚ΡƒΡ€Π΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊ (ΠΊΠ°ΠΊ ΠΈ большинсво ΠΈΠ· вас) поэтому пошли Π² Π±ΠΎΠΉ!

Π§Ρ‚ΠΎ Π±ΡƒΠ΄Π΅ΠΌ Π΄Π΅Π»Π°Ρ‚ΡŒ?

На сайтС Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ написания ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π°, поэтому ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ. А сдСлаСм Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π°Π²Ρ€ΠΎΠ΄Π΅ парсСра ΠΎΡ‡Π΅Π½ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ·ΠΊΠΎΠ³ΠΎ подмноТСства PHP πŸ™‚
Наша Π·Π°Π΄Π°Ρ‡Π° Π² ΠΊΠΎΠ½Ρ†Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ для Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‡Π΅Π½ΡŒ малСнький ΠΈ взят с ΠΏΠΎΡ‚ΠΎΠ»ΠΊΠ°. Но Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΊΠΎΠ΄Π° Π½ΡƒΠΆΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈ ΠΏΠΎΡ…ΠΎΠ΄Ρƒ ΠΌΡ‹ задСйствуСм Ρ‚Π°ΠΊΠΎΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ PLY ΠΊΠ°ΠΊ state.

Lex β€” это ΡˆΡ‚ΡƒΠΊΠ°, которая Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅Ρ‚ тСкст Π½Π° Π±Π°Π·ΠΎΠ²Ρ‹Π΅ элСмСнты языка. Ну ΠΈΠ»ΠΈ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΡƒΠ΅Ρ‚ тСкст Π² Π±Π°Π·ΠΎΠ²Ρ‹Π΅ элСмСнты. Как-Ρ‚ΠΎ Ρ‚Π°ΠΊ.

Π§Ρ‚ΠΎ ΠΌΡ‹ здСсь Π²ΠΈΠ΄ΠΈΠΌ, ΠΊΡ€ΠΎΠΌΠ΅ бСсполСзного ΠΊΠΎΠ΄Π°? Π’ΠΈΠ΄ΠΈΠΌ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ (Π±Π°Π·ΠΎΠ²Ρ‹Π΅ элСмСнты):
PHP_START β€” ‘ _. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹Π΅ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹.

ΠšΡΡ‚Π°Ρ‚ΠΈ, Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ это: LexToken(PHPFUNC,’echo’,5,59)?
PLY ΠΏΠ΅Ρ€Π΅Π΄ построСниСм Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ сортируСт рСгулярныС выраТСния ΠΏΠΎ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ ΠΈ Π² процСссС парсинга ΠΏΠΎΠ±Π΅ΠΆΠ΄Π°Π΅Ρ‚ длиннСйшСС. Π’ΠΎΡ‚ поэтому echo ΠΈ Π½Π΅ парсится ΠΊΠ°ΠΊ PHPECHO. Как это ΠΎΠ±ΠΎΠΉΡ‚ΠΈ? Π›Π΅Π³ΠΊΠΎ. ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ‚ΠΎΠΊΠ΅Π½Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.
Π’ΠΎΡ‚ Ρ‚Π°ΠΊ:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ echo возвращаСтся ΠΊΠ°ΠΊ Π½ΡƒΠΆΠ½ΠΎ. ΠšΡΡ‚Π°Ρ‚ΠΈ ΠΎ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π΅ TOKEN: вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΈΡΠ°Ρ‚ΡŒ рСгулярку Π² Π½Π°Ρ‡Π°Π»Π΅ Ρ‚Π΅Π»Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΌΠΎΠΆΠ½ΠΎ просто ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΅Ρ‘ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ°ΠΊ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€. Π§Ρ‚ΠΎ ΠΌΡ‹ ΠΈ сдСлали.

Π’ΠΎΡ‚. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ€ΠΎΠ΄Π΅ всС. Π”Π° Π½Π΅ всС.
НСплохо Π±Ρ‹ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ.
Π§Ρ‚ΠΎ ΠΆΠ΅, Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ ΠΌΠ°Π»Π΅Π½ΡŒΠΊΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² лСксСр:

Π’ΠΎΡ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ парсСру (parser.py).

Yacc β€” это ΡˆΡ‚ΡƒΠΊΠ° (парсСр), Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ ΠΈ описываСм ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈΡ… соСдинСния (Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ). ΠŸΠΎΡ…ΠΎΠ΄Ρƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ абстрактноС Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΈΠ»ΠΈ ΠΆΠ΅ сразу Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ (ΠΊΠ°ΠΊ это сдСлано Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€ΠΎΠΌ Π½Π° сайтС).
Π’ PLY для описания Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ сущСствуСт класс ply.yacc.
ΠžΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π³Ρ€Π°ΠΌΠ°Ρ‚ΠΈΠΊΡƒ Π² ply ΠΎΡ‡Π΅Π½ΡŒ просто ΠΈ это доставляСт Π΄Π°ΠΆΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ наслаТдСниС. Для описания Ρƒ нас снова ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ p_имяфункции, Π³Π΄Π΅ Π² doc-строках ΠΌΡ‹ ΠΈ описываСм эту ΡΠ°ΠΌΡƒΡŽ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ.
Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ для нашСго абстрактного ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° с php:

ВСкста написано ΡƒΠΆΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ, ΠΈ Ρ€Π°ΡΡΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π΄ΠΎΠ»Π³ΠΎ. Но для понимания основ ply.yacc достаточно Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€. А дальшС я ΡƒΠΆΠ΅ Π²Ρ‹Π»ΠΎΠΆΡƒ исходник парсСра.

Π˜Ρ‚Π°ΠΊ, Π²Ρ‹Π΄Ρ€Π°Π½Π½Ρ‹ΠΉ кусок ΠΈΠ· парсСра:

По сути ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π²Ρ‹ΡˆΠ΅ β€” это скомбинированноС (слитоС) ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ. ‘|’ ΠΊΠ°ΠΊ нСслоТно Π΄ΠΎΠ³Π°Π΄Π°Ρ‚ΡŒΡΡ β€” это Π˜Π›Π˜, Π½Ρƒ ΠΈΠ»ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Ρ‚ΠΎΠΊΠ΅Π½Π°.
ΠœΠ΅ΠΆΠ΄Ρƒ Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ΠΌ ΠΈ Π»Π΅Π²ΠΎΠΉ/ΠΏΡ€Π°Π²ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ обязатСлСн ΠΏΡ€ΠΎΠ±Π΅Π». Π’Π°ΠΊ Π»ΡŽΠ±ΠΈΡ‚ ply. Если правая Ρ‡Π°ΡΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ пустой, Ρ‚ΠΎ послС двоСточия Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ пишСм. Π’ΠΎΠΊΠ΅Π½Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ написаны большими Π±ΡƒΠΊΠ²Π°ΠΌΠΈ, Π° ΠΏΡ€Π°Π²ΠΈΠ»Π° малСнькими, Π±Π΅Π· прСфикса p_. Π’.Π΅. Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ использовались ΠΏΡ€Π°Π²ΠΈΠ»Π° p_str ΠΈ p_phpvar.

ΠšΡΡ‚Π°Ρ‚ΠΈ, ΠΈΠ½ΠΎΠ³Π΄Π° Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π΅Π½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ с Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°ΠΌΠΈ (тафтология, проститС):

Он Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌΡƒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρƒ ΠΊΠΎΠ΄Π°. ΠŸΡ€ΠΎΡΡ‚ΠΎ фломастСры Π΄Ρ€ΡƒΠ³ΠΈΠ΅. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ названия (ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ ΠΈΡ… Π½Π°Π΄ΠΎ Π² ΠΏΠΈΡ‚ΠΎΠ½Π΅), Π½ΠΎ прСфиксы ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Π΅ (str), Ρ‡Ρ‚ΠΎ ΠΈ заставляСт ply Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… вмСстС ΠΊΠ°ΠΊ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°.

Для удобства построСния Π΄Π΅Ρ€Π΅Π²Π° я использовал Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΡΡ‚Π΅Π½ΡŒΠΊΠΈΠΉ ΠΈ эффСктивный класс:

Он ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ Ρ…Ρ€Π°Π½ΠΈΡ‚ всС Π½ΡƒΠΆΠ½ΠΎΠ΅, ΠΈ структурируСт Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ Ρ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π Π°Π±ΠΎΡ‚Π° с абстрактными синтаксичСскими Π΄Π΅Ρ€Π΅Π²ΡŒΡΠΌΠΈ JavaScript

Π—Π°Ρ‡Π΅ΠΌ ΠΏΠ°Ρ€ΡΠΈΡ‚ΡŒ свой ΠΊΠΎΠ΄? НапримСр, для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ Π·Π°Π±Ρ‹Ρ‚Ρ‹ΠΉ console.log ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠΌ. А Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ссли Π²Π°ΠΌ Π½Π°Π΄ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ сигнатуру Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² сотнях Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ Π² ΠΊΠΎΠ΄Π΅? Бправятся Π»ΠΈ Ρ‚ΡƒΡ‚ рСгулярныС выраТСния? Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ возмоТности ΠΏΠ΅Ρ€Π΅Π΄ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ абстрактныС синтаксичСскиС Π΄Π΅Ρ€Π΅Π²ΡŒΡ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ

Под ΠΊΠ°Ρ‚ΠΎΠΌ β€” Π²ΠΈΠ΄Π΅ΠΎ ΠΈ тСкстовая Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠ° Π΄ΠΎΠΊΠ»Π°Π΄Π° ΠšΠΈΡ€ΠΈΠ»Π»Π° Π§Π΅Ρ€ΠΊΠ°ΡˆΠΈΠ½Π° (z6Dabrata) с ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ HolyJS 2018 Piter.

Об Π°Π²Ρ‚ΠΎΡ€Π΅
ΠšΠΈΡ€ΠΈΠ»Π» родился Π² МосквС, сСйчас ΠΆΠΈΠ²Π΅Ρ‚ Π² Нью-Π™ΠΎΡ€ΠΊΠ΅ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Firebase. ΠžΠ±ΡƒΡ‡Π°Π΅Ρ‚ Angular Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Google, Π½ΠΎ ΠΈ Π²ΠΎ всСм ΠΌΠΈΡ€Π΅. ΠžΡ€Π³Π°Π½ΠΈΠ·Π°Ρ‚ΠΎΡ€ самого большого Angular-ΠΌΠΈΡ‚Π°ΠΏΠ° Π² ΠΌΠΈΡ€Π΅ β€” AngularNYC (Π° Ρ‚Π°ΠΊΠΆΠ΅ VueNYC ΠΈ ReactNYC). Π’ свободноС ΠΎΡ‚ программирования врСмя увлСкаСтся Ρ‚Π°Π½Π³ΠΎ, ΠΊΠ½ΠΈΠ³Π°ΠΌΠΈ ΠΈ приятными бСсСдами.

НоТовка ΠΈΠ»ΠΈ Π΄Π΅Ρ€Π΅Π²ΠΎ?

НачнСм с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°: допустим, Π²Ρ‹ ΠΎΡ‚Π»Π°Π΄ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ»ΠΈ внСсСнныС измСнСния Π² git, послС Ρ‡Π΅Π³ΠΎ спокойно ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ»ΠΈΡΡŒ ΡΠΏΠ°Ρ‚ΡŒ. Π£Ρ‚Ρ€ΠΎΠΌ оказалось, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ»Π»Π΅Π³ΠΈ скачали сСбС ваши измСнСния ΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π²Ρ‹ Π½Π°ΠΊΠ°Π½ΡƒΠ½Π΅ Π·Π°Π±Ρ‹Π»ΠΈ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² консоль, ΠΎΠ½Π° Ρƒ Π½ΠΈΡ… выводится ΠΈ засоряСт Π²Ρ‹Π²ΠΎΠ΄. Π‘ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡŒ ΠΌΠ½ΠΎΠ³ΠΈΠ΅.

Π― написал 17 тСстов, ΠΏΡ‹Ρ‚Π°ΡΡΡŒ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ способы ΡΠ»ΠΎΠΌΠ°Ρ‚ΡŒ Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Π­Ρ‚ΠΎΡ‚ список Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ ΠΏΠΎΠ»Π½Ρ‹ΠΉ.

Π‘Π°ΠΌΡ‹ΠΉ простой тСст ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½.
А Ссли Π²Π΄Ρ€ΡƒΠ³ какая-Π»ΠΈΠ±ΠΎ функция содСрТит Π² своСм Π½Π°Π·Π²Π°Π½ΠΈΠΈ строку Β«console.logΒ»?

Π”ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ символ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ console.log Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Ρ‚ΡŒΡΡ Π² Π½Π°Ρ‡Π°Π»Π΅ слова.

ΠŸΡ€ΠΎΠΉΠ΄Π΅Π½ΠΎ лишь Π΄Π²Π° тСста, Π½ΠΎ Ρ‡Ρ‚ΠΎ Ссли console.log находится Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΈ Π΅Π³ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ?

ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡˆΠ΅ΠΌ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ парсСр Π½Π΅ Ρ‚Ρ€ΠΎΠ³Π°Π» ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ.

Π˜ΡΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Β«console.logΒ» ΠΈΠ· строк:

НС Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ символы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ тСстам:

НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ затСя оказалась Π½Π΅ совсСм простой, всС 17 тСстов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ рСгулярныС выраТСния, ΠΏΡ€ΠΎΠΉΡ‚ΠΈ ΠΌΠΎΠΆΠ½ΠΎ. Π’ΠΎΡ‚ Ρ‚Π°ΠΊ, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС, Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΊΠΎΠ΄ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ:

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ этот ΠΊΠΎΠ΄ Π½Π΅ ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ случаи, ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ довольно слоТно.

Рассмотрим, ΠΊΠ°ΠΊ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту Π·Π°Π΄Π°Ρ‡Ρƒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ АБД.

Как Π²Ρ‹Ρ€Π°Ρ‰ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π΄Π΅Ρ€Π΅Π²ΡŒΡ?

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹ получаСтся JSON-Ρ„Π°ΠΉΠ» Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ ΠΎΠΊΠΎΠ»ΠΎ 300 строк. Π˜ΡΠΊΠ»ΡŽΡ‡ΠΈΠΌ ΠΈΠ· ΠΈΡ… числа строки со слуТСбной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ. Нас интСрСсуСт Ρ€Π°Π·Π΄Π΅Π» body. ΠœΠ΅Ρ‚Π°ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ нас Ρ‚ΠΎΠΆΠ΅ Π½Π΅ интСрСсуСт. Π’ ΠΈΡ‚ΠΎΠ³Π΅ получаСтся ΠΎΠΊΠΎΠ»ΠΎ 100 строк. По ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊΡƒΡŽ структуру Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ для ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ body (ΠΎΠΊΠΎΠ»ΠΎ 300 строк) – это Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ.

Рассмотрим нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², ΠΊΠ°ΠΊ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ Π² ΠΊΠΎΠ΄Π΅ Π² синтаксичСском Π΄Π΅Ρ€Π΅Π²Π΅:

Π­Ρ‚ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π΅ΡΡ‚ΡŒ Numeric Literal, числовой Π»ΠΈΡ‚Π΅Ρ€Π°Π».

Π£ΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΠΎΠ΅ Π½Π°ΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ console.log. Π’ Π½Π΅ΠΌ Π΅ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ свойство.

Если log – это Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎΠ³Π΄Π° описаниС выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: Π΅ΡΡ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Π°, Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ – числовыС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя Ρƒ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ выраТСния Π΅ΡΡ‚ΡŒ имя – log.

Π›ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ Π±Ρ‹Π²Π°ΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ: числа, строки, рСгулярныС выраТСния, boolean, null.
ВСрнСмся ΠΊ Π²Ρ‹Π·ΠΎΠ²Ρƒ Β«console.logΒ»

Π­Ρ‚ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Π°, Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ Member Expression. Из Π½Π΅Π³ΠΎ понятно, Ρ‡Ρ‚ΠΎ Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° console Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΅ΡΡ‚ΡŒ свойство, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ называСтся log.

ΠžΠ±Ρ…ΠΎΠ΄ АБД

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΏΠΎΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с этой структурой Π² ΠΊΠΎΠ΄Π΅. Для ΠΎΠ±Ρ…ΠΎΠ΄Π° Π΄Π΅Ρ€Π΅Π²Π° Π±ΡƒΠ΄Π΅Ρ‚ использована Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° babel-traverse.

Π”Π°Π½Ρ‹ Ρ‚Π΅ ΠΆΠ΅ 17 тСстов. Π’Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ получаСтся ΠΏΡ€ΠΈ Π°Π½Π°Π»ΠΈΠ·Π΅ синтаксичСского Π΄Π΅Ρ€Π΅Π²Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ поискС Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ Β«console.logΒ»:

Π Π°Π·Π±Π΅Ρ€Π΅ΠΌ, Ρ‡Ρ‚ΠΎ здСсь написано. const ast = babylon.parse(code); Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ast парсим синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΈΠ· ΠΊΠΎΠ΄Π°. Π”Π°Π»Π΅Π΅ Π΄Π°Π΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ babel-parse это Π΄Π΅Ρ€Π΅Π²ΠΎ Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ. Π˜Ρ‰Π΅ΠΌ Π² Π½Π΅ΠΌ ΡƒΠ·Π»Ρ‹ ΠΈ свойства с ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ². ВыставляСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ hasConsoleLog Π² true, Ссли Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ сочСтаниС ΡƒΠ·Π»ΠΎΠ² ΠΈ ΠΈΡ… Π½Π°Π·Π²Π°Π½ΠΈΠΉ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ, Π±Ρ€Π°Ρ‚ΡŒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ ΡƒΠ·Π»ΠΎΠ², ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ², ΠΈΡΠΊΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Ρƒ Π½ΠΈΡ… Π΅ΡΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈ свойства, ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ названия этих свойств, Ρ‚ΠΈΠΏΡ‹ – это ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ.

ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡˆΠ΅ΠΌ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ с использованиСм babel-types:

ВрансформируСм АБД с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ babel-traverse

Для сокращСния Ρ‚Ρ€ΡƒΠ΄ΠΎΠ·Π°Ρ‚Ρ€Π°Ρ‚ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ console.log сразу удалялся ΠΈΠ· ΠΊΠΎΠ΄Π° β€” вмСсто сигнала ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π΅ΡΡ‚ΡŒ Π² ΠΊΠΎΠ΄Π΅.

Из Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ removeConsoleLog Ρƒ нас всС Π΅Ρ‰Π΅ возвращаСтся Π±ΡƒΠ»Π΅Π²ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠœΡ‹ замСняСм Π΅Π³ΠΎ Π²Ρ‹Π²ΠΎΠ΄ Π½Π° ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сгСнСрируСт babel-generator, Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:
hasConsoleLog => babelGenerator(ast).code

А Ссли Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ debugger?

На этот Ρ€Π°Π· для выполнСния Π·Π°Π΄Π°Ρ‡ΠΈ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ASTexplorer. Debugger относится ΠΊ Ρ‚ΠΈΠΏΡƒ ΡƒΠ·Π»ΠΎΠ² debugger statement. Нам Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ всю структуру, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это особый Π²ΠΈΠ΄ ΡƒΠ·Π»Π°, достаточно просто Π½Π°ΠΉΡ‚ΠΈ debugger statement. ΠœΡ‹ напишСм ΠΏΠ»Π°Π³ΠΈΠ½ для ESLint (Π½Π° ASTexplorer).

ASTexplorer устроСн Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΊΠΎΠ΄Π° слСва, Π° справа ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ΅ АБД. МоТно Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ, Π² ΠΊΠ°ΠΊΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π΅Π³ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ: JSON ΠΈΠ»ΠΈ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Π΄Ρ€Π΅Π²Π°.

Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ESLint, ΠΎΠ½ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ Π·Π° нас всю Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎ поиску Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ отдаст Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π½Π°ΠΉΡ‚ΠΈ Π² Π½Π΅ΠΌ строку debugger. Π’ Π΄Π°Π½Π½ΠΎΠΌ инструмСнтС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΎΠΉ парсСр АБД. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ ΠΈ самих АБД Π² JavaScript сущСствуСт нСсколько Π²ΠΈΠ΄ΠΎΠ². Π§Π΅ΠΌ-Ρ‚ΠΎ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ΅, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π·Π½Ρ‹Π΅ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Π»ΠΈ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ поиск debugger’а:

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ написанного ΠΏΠ»Π°Π³ΠΈΠ½Π°:

Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ debugger ΠΈΠ· ΠΊΠΎΠ΄Π°.

Π§Π΅ΠΌ Π΅Ρ‰Π΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ АБД

Π― Π»ΠΈΡ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ АБД для упрощСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Angular ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°ΠΌΠΈ. МоТно Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ, Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ интСрфСйс, ΠΌΠ΅Ρ‚ΠΎΠ΄, Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ ΠΈ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ Π΅Ρ‰Π΅. Π₯отя Ρ€Π΅Ρ‡ΡŒ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΈΠ΄Π΅Ρ‚ ΠΎ Javascript, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π² TypeScript Ρ‚ΠΎΠΆΠ΅ Π΅ΡΡ‚ΡŒ свои АБД, Ρ€Π°Π·Π½ΠΈΡ†Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠΎΠ² ΡƒΠ·Π»ΠΎΠ² ΠΈ структурС. Π’ Ρ‚ΠΎΠΌ ΠΆΠ΅ ASTExplorer ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π² качСствС языка TypeScript.

НСсколько ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ссылок для Babel

Бонус

Как Π΅Ρ‰Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ наш console.log Π² ΠΊΠΎΠ΄Π΅? Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π°ΡˆΡƒ IDE! Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ инструмСнта Β«Π½Π°ΠΉΡ‚ΠΈ ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒΒ», ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Π², Π² ΠΊΠ°ΠΊΠΈΡ… мСстах ΠΊΠΎΠ΄Π° ΠΈΡΠΊΠ°Ρ‚ΡŒ.
Π’Π°ΠΊΠΆΠ΅ Π² Intellij IDEA Π΅ΡΡ‚ΡŒ инструмСнт «структурный поиск», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π½Π°ΠΉΡ‚ΠΈ Π½ΡƒΠΆΠ½Ρ‹Π΅ мСста Π² ΠΊΠΎΠ΄Π΅, ΠΊ слову, ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ АБД.

24-25 ноября ΠšΠΈΡ€ΠΈΠ»Π» выступит Π½Π° московской HolyJS с Π΄ΠΎΠΊΠ»Π°Π΄ΠΎΠΌ Β«JavaScript *LOVES* binary dataΒ»: опустимся Π½Π° ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, покопаСмся Π² Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ *.gif-Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ разбСрСмся с ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΌΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°ΠΌΠΈ, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ Protobuf ΠΈΠ»ΠΈ Thrift. ПослС Π΄ΠΎΠΊΠ»Π°Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒΡΡ с ΠšΠΈΡ€ΠΈΠ»Π»ΠΎΠΌ ΠΈ ΠΎΠ±ΡΡƒΠ΄ΠΈΡ‚ΡŒ всС ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΠ΅ вопросы Π² дискуссионной Π·ΠΎΠ½Π΅.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ

Π‘ΠžΠ”Π•Π Π–ΠΠΠ˜Π•

НомСнклатура

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ

Π”Π΅Ρ€Π΅Π²ΡŒΡ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° основС ΠΈΠ·Π±ΠΈΡ€Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΊΡ€ΡƒΠ³ΠΎΠ²

Π”Π΅Ρ€Π΅Π²ΡŒΡ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ ΠΈΠ·Π±ΠΈΡ€Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΊΡ€ΡƒΠ³ΠΎΠ² (= Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ структуры Ρ„Ρ€Π°Π· ) Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΡƒΠ·Π»Ρ‹. Π’ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… ΡƒΠ·Π»Π°Ρ… ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ катСгориями Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ, Π° листовыС ΡƒΠ·Π»Ρ‹ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ. На ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π½ΠΈΠΆΠ΅ прСдставлСно Π΄Π΅Ρ€Π΅Π²ΠΎ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° основС ΠΈΠ·Π±ΠΈΡ€Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΊΡ€ΡƒΠ³ΠΎΠ²; ΠΎΠ½ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΡΠΈΠ½Ρ‚Π°ΠΊΡΠΈΡ‡Π΅ΡΠΊΡƒΡŽ структуру английского прСдлоТСния John hit the ball :

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ

Π”Π΅Ρ€Π΅Π²ΡŒΡ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° основС зависимостСй

ΠžΡΠ½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π½Π° зависимостях Π΄Π΅Ρ€Π΅Π²ΡŒΡ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ зависимостСй Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ всС ΡƒΠ·Π»Ρ‹ ΠΊΠ°ΠΊ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π½Π΅ ΠΏΡ€ΠΈΠ·Π½Π°ΡŽΡ‚ различия ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈ Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ катСгориями. Π’ срСднСм ΠΎΠ½ΠΈ ΠΏΡ€ΠΎΡ‰Π΅, Ρ‡Π΅ΠΌ Π΄Π΅Ρ€Π΅Π²ΡŒΡ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° основС ΠΈΠ·Π±ΠΈΡ€Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΊΡ€ΡƒΠ³ΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ содСрТат мСньшС ΡƒΠ·Π»ΠΎΠ². Π”Π΅Ρ€Π΅Π²ΠΎ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° основС зависимостСй для ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° прСдлоТСния выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ

Π’ этом Π΄Π΅Ρ€Π΅Π²Π΅ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ„Ρ€Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ (S, VP ΠΈ NP), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ Π°Π½Π°Π»ΠΎΠ³Π΅ Π½Π° основС ΠΈΠ·Π±ΠΈΡ€Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΊΡ€ΡƒΠ³ΠΎΠ². Как ΠΈ Π² Π΄Π΅Ρ€Π΅Π²Π΅ Π½Π° основС ΠΈΠ·Π±ΠΈΡ€Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΊΡ€ΡƒΠ³ΠΎΠ², структура участников признаСтся. Π›ΡŽΠ±ΠΎΠ΅ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ Π΄Π΅Ρ€Π΅Π²Π° являСтся составной Ρ‡Π°ΡΡ‚ΡŒΡŽ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, это основанноС Π½Π° зависимостях Π΄Π΅Ρ€Π΅Π²ΠΎ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΡ€ΠΈΠ·Π½Π°Π΅Ρ‚ ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‰Π΅Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π”ΠΆΠΎΠ½ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅, Π²Ρ‹Ρ€Π°ΠΆΠ°ΡŽΡ‰Π΅Π΅ мяч, ΠΊΠ°ΠΊ составныС части, ΠΊΠ°ΠΊ ΠΈ Π΄Π΅Ρ€Π΅Π²ΠΎ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° основС ΠΈΠ·Π±ΠΈΡ€Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΊΡ€ΡƒΠ³ΠΎΠ².

Π Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠ½Ρ‚ΠΈΠ½Π³Π΅Π½Ρ‚ΠΎΠΌ ΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒΡŽ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π°Π»Π΅ΠΊΠΎ ΠΈΠ΄ΡƒΡ‰ΠΈΠ΅ послСдствия. Вопрос ΠΎ Ρ‚ΠΎΠΌ, Π½ΡƒΠΆΠ½Π° Π»ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ синтаксичСская структура, связанная с Π΄Π΅Ρ€Π΅Π²ΡŒΡΠΌΠΈ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° основС ΠΈΠ·Π±ΠΈΡ€Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΊΡ€ΡƒΠ³ΠΎΠ², являСтся ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΎΠΌ споров.

ΠœΠ°Ρ€ΠΊΠ΅Ρ€Ρ‹ Ρ„Ρ€Π°Π·

ΠœΠ°Ρ€ΠΊΠ΅Ρ€Ρ‹ Ρ„Ρ€Π°Π· ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ прСдставлСны Π² Π²ΠΈΠ΄Π΅ Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π² (ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΎ Π΄Π΅Ρ€Π΅Π²ΡŒΡΡ… синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° основС ΠΈΠ·Π±ΠΈΡ€Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΊΡ€ΡƒΠ³ΠΎΠ² ), Π½ΠΎ вмСсто этого часто Π΄Π°ΡŽΡ‚ΡΡ Π² Π²ΠΈΠ΄Π΅ Β«Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобках», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ мСньшС мСста Π² памяти. НапримСр, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобках, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡƒ Π²Ρ‹ΡˆΠ΅ Π΄Π΅Ρ€Π΅Π²Ρƒ Π½Π° основС ΠΈΠ·Π±ΠΈΡ€Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΊΡ€ΡƒΠ³ΠΎΠ², ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

Как ΠΈ Π² случаС с Π΄Π΅Ρ€Π΅Π²ΡŒΡΠΌΠΈ, Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ построСниС Ρ‚Π°ΠΊΠΈΡ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ количСство ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ примСняСмой Ρ‚Π΅ΠΎΡ€ΠΈΠΈ ΠΈ ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π°Π²Ρ‚ΠΎΡ€ запроса Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ JS: абстрактныС синтаксичСскиС Π΄Π΅Ρ€Π΅Π²ΡŒΡ, парсинг ΠΈ Π΅Π³ΠΎ оптимизация

ВсС ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ JavaScript-ΠΊΠΎΠ΄ Π²Π΅Π±-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·Ρ€Π°ΡΡ‚Π°Ρ‚ΡŒΡΡ Π΄ΠΎ прямо-Ρ‚Π°ΠΊΠΈ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ². А Ρ‡Π΅ΠΌ большС Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° β€” Ρ‚Π΅ΠΌ дольшС Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ Π΅Π³ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ. Но ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ‚ΡƒΡ‚ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ сСти. ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° загрузится, Π΅Ρ‘ Π΅Ρ‰Ρ‘ Π½Π°Π΄ΠΎ Ρ€Π°ΡΠΏΠ°Ρ€ΡΠΈΡ‚ΡŒ, ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄, ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ. БСгодня ΠΌΡ‹ прСдставляСм Π²Π°ΡˆΠ΅ΠΌΡƒ вниманию ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ 14 части сСрии ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² ΠΎΠ± экосистСмС JavaScript. А ΠΈΠΌΠ΅Π½Π½ΠΎ, Ρ€Π΅Ρ‡ΡŒ ΠΏΠΎΠΉΠ΄Ρ‘Ρ‚ ΠΎ синтаксичСском Π°Π½Π°Π»ΠΈΠ·Π΅ JS-ΠΊΠΎΠ΄Π°, ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ строятся абстрактныС синтаксичСскиС Π΄Π΅Ρ€Π΅Π²ΡŒΡ, ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ программист ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° эти процСссы, добившись ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ скорости Ρ€Π°Π±ΠΎΡ‚Ρ‹ своих ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ

Как устроСны языки программирования

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎΠ± абстрактных синтаксичСских Π΄Π΅Ρ€Π΅Π²ΡŒΡΡ…, остановимся Π½Π° Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ устроСны языки программирования. Π’Π½Π΅ зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ язык Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅, Π²Π°ΠΌ всСгда приходится ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π΅ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ исходный ΠΊΠΎΠ΄ ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ Π΅Π³ΠΎ Π² Π½Π΅Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅, Ρ‡Ρ‚ΠΎ содСрТит ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для машин. Π’ Ρ€ΠΎΠ»ΠΈ Ρ‚Π°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚ Π»ΠΈΠ±ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρ‹, Π»ΠΈΠ±ΠΎ компиляторы. НСваТно, ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΌ языкС (JavaScript, Python, Ruby), ΠΈΠ»ΠΈ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΌ (C#, Java, Rust), ваш ΠΊΠΎΠ΄, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ собой ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ тСкст, всСгда Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ этап парсинга, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ β€” прСвращСния ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ тСкста Π² структуру Π΄Π°Π½Π½Ρ‹Ρ…, которая называСтся абстрактным синтаксичСским Π΄Π΅Ρ€Π΅Π²ΠΎΠΌ (Abstract Syntax Tree, AST).

АбстрактныС синтаксичСскиС Π΄Π΅Ρ€Π΅Π²ΡŒΡ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π°ΡŽΡ‚ структурированноС прСдставлСниС исходного ΠΊΠΎΠ΄Π°, ΠΎΠ½ΠΈ, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΈΠ³Ρ€Π°ΡŽΡ‚ Π²Π°ΠΆΠ½Π΅ΠΉΡˆΡƒΡŽ Ρ€ΠΎΠ»ΡŒ Π² сСмантичСском Π°Π½Π°Π»ΠΈΠ·Π΅, Π² Ρ…ΠΎΠ΄Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ компилятор провСряСт ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… конструкций ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ использования ΠΈΡ… элСмСнтов. ПослС формирования AST ΠΈ выполнСния ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ эта структура ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для гСнСрирования Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ машинного ΠΊΠΎΠ΄Π°.

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ абстрактных синтаксичСских Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π²

АбстрактныС синтаксичСскиС Π΄Π΅Ρ€Π΅Π²ΡŒΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°Ρ… ΠΈ компиляторах. Они, Π² ΠΌΠΈΡ€Π΅ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠ², ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ ΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… областях. Один ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΠΈΡ… примСнСния β€” статичСский Π°Π½Π°Π»ΠΈΠ· ΠΊΠΎΠ΄Π°. БтатичСскиС Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΈΠΌ ΠΊΠΎΠ΄. Однако, нСсмотря Π½Π° это, ΠΈΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ структуру ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ инструмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΠΊΠΎΠ΄Π΅ часто Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠ΅ΡΡ структуры. ΠžΡ‚Ρ‡Ρ‘Ρ‚Ρ‹ Ρ‚Π°ΠΊΠΎΠ³ΠΎ инструмСнта ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ Π² Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π΅, позволят ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°. Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ это ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΠ»ΡŒΠ·ΡƒΡΡΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ сравнСниСм строк, Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ окаТСтся вСсьма ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΌ, возмоТности Π΅Π³ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ. На самом Π΄Π΅Π»Π΅, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ инструмСнт, Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ собствСнный парсСр для JavaScript. БущСствуСт мноТСство опСнсорсных Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ совмСстимы со спСцификациСй ECMAScript. НапримСр β€” Esprima ΠΈ Acorn. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ инструмСнты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π² Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ парсСры, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ, Π² Ρ€Π°Π±ΠΎΡ‚Π΅ с абстрактными синтаксичСскими Π΄Π΅Ρ€Π΅Π²ΡŒΡΠΌΠΈ.

АбстрактныС синтаксичСскиС Π΄Π΅Ρ€Π΅Π²ΡŒΡ, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ транспиляторов. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π²Ρ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ транспилятор, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π½Π° Python Π² ΠΊΠΎΠ΄ Π½Π° JavaScript. ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ основан Π½Π° ΠΈΠ΄Π΅Π΅, Π² соотвСтствии с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ транспилятор для создания абстрактного синтаксичСского Π΄Π΅Ρ€Π΅Π²Π° Π½Π° основС Python-ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, прСобразуСтся Π² ΠΊΠΎΠ΄ Π½Π° JavaScript. ВСроятно, Ρ‚ΡƒΡ‚ Π²Ρ‹ Π·Π°Π΄Π°Π΄ΠΈΡ‚Π΅ΡΡŒ вопросом ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ‚Π°ΠΊΠΎΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Всё Π΄Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ абстрактныС синтаксичСскиС Π΄Π΅Ρ€Π΅Π²ΡŒΡ β€” это всСго лишь Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ способ прСдставлСния ΠΊΠΎΠ΄Π° Π½Π° Π½Π΅ΠΊΠΎΠ΅ΠΌ языкС программирования. ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΊΠΎΠ΄ прСобразуСтся Π² AST, ΠΎΠ½ выглядит ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ тСкст, ΠΏΡ€ΠΈ написании ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‚ язык. ПослС парсинга этот ΠΊΠΎΠ΄ прСвращаСтся Π² Π΄Ρ€Π΅Π²ΠΎΠ²ΠΈΠ΄Π½ΡƒΡŽ структуру, которая содСрТит Ρ‚Ρƒ ΠΆΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎ ΠΈ исходный тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΎΡ‚ исходного ΠΊΠΎΠ΄Π° ΠΊ AST, Π½ΠΎ ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΠ² абстрактноС синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ Π² тСкстовоС прСдставлСниС ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ΠŸΠ°Ρ€ΡΠΈΠ½Π³ JavaScript-ΠΊΠΎΠ΄Π°

ΠŸΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ строятся абстрактныС синтаксичСскиС Π΄Π΅Ρ€Π΅Π²ΡŒΡ. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ JavaScript-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:

ΠŸΠ°Ρ€ΡΠ΅Ρ€ создаст абстрактноС синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ схСматично прСдставлСно Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ рисункС.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ

АбстрактноС синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ это β€” ΡƒΠΏΡ€ΠΎΡ‰Ρ‘Π½Π½ΠΎΠ΅ прСдставлСниС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹ парсСра. НастоящСС абстрактноС синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ выглядит Π³ΠΎΡ€Π°Π·Π΄ΠΎ слоТнСС. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС наша главная Ρ†Π΅Π»ΡŒ β€” ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ прСдставлСниС ΠΎ Ρ‚ΠΎΠΌ, Π²ΠΎ Ρ‡Ρ‚ΠΎ, Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, прСвращаСтся исходный ΠΊΠΎΠ΄ ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½. Если Π²Π°ΠΌ интСрСсно Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊ выглядит Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ΅ абстрактноС синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ β€” Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ сайтом AST Explorer. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ AST для Π½Π΅ΠΊΠΎΠ΅Π³ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° JS-ΠΊΠΎΠ΄Π°, Π΅Π³ΠΎ достаточно ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΏΠΎΠ»Π΅ Π½Π° страницС.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚ΡƒΡ‚ Ρƒ вас Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ вопрос ΠΎ Ρ‚ΠΎΠΌ, Π·Π°Ρ‡Π΅ΠΌ программисту Π·Π½Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ JS-парсСр. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², ΠΏΠ°Ρ€ΡΠΈΡ‚ΡŒ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠΎΠ΄ β€” это Π·Π°Π΄Π°Ρ‡Π° Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°. Π’ ΠΊΠ°ΠΊΠΎΠΌ-Ρ‚ΠΎ смыслС Π²Ρ‹ ΠΏΡ€Π°Π²Ρ‹. На рисункС Π½ΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠ΅ΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ извСстным Π²Π΅Π±-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… шагов Π² процСссС выполнСния JS-ΠΊΠΎΠ΄Π°.

ΠŸΡ€ΠΈΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ΡΡŒ ΠΊ этому рисунку, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Ρ‚Π°ΠΌ ΠΊΠΎΠ΅-Ρ‡Ρ‚ΠΎ интСрСсноС.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ

Π’Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ JS-ΠΊΠΎΠ΄Π°

Π’ΠΈΠ΄ΠΈΡ‚Π΅? Если Π½Π΅Ρ‚ β€” посмотритС Π΅Ρ‰Ρ‘ Ρ€Π°Π·. БобствСнно говоря, Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Ρ‘Ρ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ, Π² срСднСм, Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ тратят 15-20% Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° парсинг JS-ΠΊΠΎΠ΄Π°. И это β€” Π½Π΅ Π½Π΅ΠΊΠΈΠ΅ условныС Π΄Π°Π½Π½Ρ‹Π΅. ΠŸΠ΅Ρ€Π΅Π΄ Π²Π°ΠΌΠΈ β€” статистичСскиС свСдСния ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π²Π΅Π±-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Π°ΠΊ ΠΈΠ»ΠΈ ΠΈΠ½Π°Ρ‡Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ JavaScript. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π² 15% ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π²Π°ΠΌ Π½Π΅ Ρ‚Π°ΠΊΠΈΠΌ ΡƒΠΆ ΠΈ большим, Π½ΠΎ, ΠΏΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, это ΠΌΠ½ΠΎΠ³ΠΎ. Π’ΠΈΠΏΠΈΡ‡Π½ΠΎΠ΅ одностраничноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 0.4 Мб JavaScript-ΠΊΠΎΠ΄Π°, Π° Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°ΡΠΏΠ°Ρ€ΡΠΈΡ‚ΡŒ этот ΠΊΠΎΠ΄ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρƒ Π½Π°Π΄ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 370 мс. ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² этом Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ ΡΡ‚Ρ€Π°ΡˆΠ½ΠΎΠ³ΠΎ. И Π΄Π°, само ΠΏΠΎ сСбС это Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ. Однако Π½Π΅ стоит Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ это β€” лишь врСмя, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½ΡƒΠΆΠ½ΠΎ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΈ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² AST. Бюда Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ врСмя, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, ΠΈΠ»ΠΈ врСмя, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½ΡƒΠΆΠ½ΠΎ Π½Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π°Π΄Π°Ρ‡, ΡΠΎΠΏΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ страницы, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” Π·Π°Π΄Π°Ρ‡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ HTML ΠΈ CSS ΠΈ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π° страницы. ΠŸΡ€ΠΈΡ‡Ρ‘ΠΌ, Ρ€Π΅Ρ‡ΡŒ Ρ‚ΡƒΡ‚ ΠΈΠ΄Ρ‘Ρ‚ лишь ΠΎ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ…. Π’ случаС с ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹ΠΌΠΈ систСмами всё Π΅Ρ‰Ρ‘ Ρ…ΡƒΠΆΠ΅. Π’ частности, врСмя парсинга ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΊΠΎΠ΄Π° Π½Π° ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… устройствах ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π² 2-5 Ρ€Π°Π· большС, Ρ‡Π΅ΠΌ Π½Π° Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠ½Ρ‹Ρ…. ВзглянитС Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ рисунок.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ

ВрСмя парсинга 1 Мб JS-ΠΊΠΎΠ΄Π° Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… устройствах

Π—Π΄Π΅ΡΡŒ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ врСмя, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для Ρ€Π°Π·Π±ΠΎΡ€Π° 1 Мб JS-ΠΊΠΎΠ΄Π° Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΈ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠ½Ρ‹Ρ… устройствах.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π²Π΅Π±-прилоТСния постоянно ΡƒΡΠ»ΠΎΠΆΠ½ΡΡŽΡ‚ΡΡ, Π½Π° сторону ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° пСрСносится Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ всё большСго количСства Π·Π°Π΄Π°Ρ‡. НаправлСно всё это Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ощущСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΎΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π²Π΅Π±-сайтами, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚ΡŒ эти ощущСния ΠΊ Ρ‚Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΈΡΠΏΡ‹Ρ‚Ρ‹Π²Π°ΡŽΡ‚, взаимодСйствуя с Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ прилоТСниями. НСслоТно Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ Ρ‚ΠΎ, насколько сильно всё это воздСйствуСт Π½Π° Π²Π΅Π±-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹. Для этого достаточно ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ инструмСнты Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°, Π·Π°ΠΉΡ‚ΠΈ Π½Π° ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ соврСмСнный сайт ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, сколько Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ тратится Π½Π° парсинг ΠΊΠΎΠ΄Π°, Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ, ΠΈ Π½Π° всё ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅, происходящСС Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ ΠΏΡ€ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ΅ страницы ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ

Анализ сайта с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ инструмСнтов Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅

К Π½Π΅ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Π΅ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ Π½Π΅ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ инструмСнтами. Однако, это Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Π΅ вСрсии сайтов Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π’ΡƒΡ‚ Π½Π°ΠΌ Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ ΠΏΡ€ΠΈΠ΄ΡƒΡ‚ инструмСнты Π²Ρ€ΠΎΠ΄Π΅ DeviceTiming. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ DeviceTiming ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ врСмя, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для парсинга ΠΈ выполнСния скриптов Π² управляСмых окруТСниях. Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ это благодаря ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΡŽ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… скриптов Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ΅ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° страница загруТаСтся с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… устройств, Ρƒ нас появляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ локально ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ врСмя парсинга ΠΈ выполнСния ΠΊΠΎΠ΄Π°.

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ парсинга ΠΈ JS-Π΄Π²ΠΈΠΆΠΊΠΈ

JS-Π΄Π²ΠΈΠΆΠΊΠΈ Π΄Π΅Π»Π°ΡŽΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ³ΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π½Π΅Π½ΡƒΠΆΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ процСссы ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠΎΠ΄Π°. Π’ΠΎΡ‚ нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ².

Π”Π²ΠΈΠΆΠΎΠΊ V8 ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ скриптов ΠΈ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°. Под ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС понимаСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ систСма занимаСтся парсингом скриптов, Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‰ΠΈΡ…ΡΡ асинхронно, ΠΈ скриптов, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΎ, Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, начиная это Π΄Π΅Π»Π°Ρ‚ΡŒ с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π½Π°Ρ‡Π°Π»Π° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΊΠΎΠ΄Π°. Π­Ρ‚ΠΎ Π²Π΅Π΄Ρ‘Ρ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ парсинг Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ практичСски ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ с Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ скрипта, Ρ‡Ρ‚ΠΎ Π΄Π°Ρ‘Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 10% ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ Π½Π° ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΡƒ страниц ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅.

JavaScript-ΠΊΠΎΠ΄ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ компилируСтся Π² Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ посСщСнии страницы. Π­Ρ‚ΠΎΡ‚ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄, ΠΎΠ΄Π½Π°ΠΊΠΎ, тСряСтся послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ страницу. ΠŸΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ это ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ скомпилированный ΠΊΠΎΠ΄ сильно зависит ΠΎΡ‚ состояния ΠΈ контСкста систСмы Π²ΠΎ врСмя компиляции. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ Π² Chrome 42 появилась ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°. Благодаря этому Π½ΠΎΠ²ΡˆΠ΅ΡΡ‚Π²Ρƒ скомпилированный ΠΊΠΎΠ΄ хранится локально, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ возвращаСтся Π½Π° ΡƒΠΆΠ΅ ΠΏΠΎΡΠ΅Ρ‰Ρ‘Π½Π½ΡƒΡŽ страницу, для ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ Π΅Ρ‘ ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ, парсинг ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ скриптов. Π­Ρ‚ΠΎ позволяСт Chrome ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 40% Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° Π·Π°Π΄Π°Ρ‡Π°Ρ… парсинга ΠΈ компиляции. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² случаС с ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹ΠΌΠΈ устройствами, это Π²Π΅Π΄Ρ‘Ρ‚ ΠΊ экономии заряда ΠΈΡ… аккумуляторов.

Π”Π²ΠΈΠΆΠΎΠΊ Carakan, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ примСнялся Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ Opera ΠΈ ΡƒΠΆΠ΅ довольно Π΄Π°Π²Π½ΠΎ Π·Π°ΠΌΠ΅Π½Ρ‘Π½ Π½Π° V8, ΠΌΠΎΠ³ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ компиляции ΡƒΠΆΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Ρ… скриптов. ΠŸΡ€ΠΈ этом Π½Π΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эти скрипты Π±Ρ‹Π»ΠΈ Π±Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ страницС ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π±Ρ‹Π»ΠΈ Π±Ρ‹ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ с ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π°. Π­Ρ‚Π° Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ, Π½Π° самом Π΄Π΅Π»Π΅, вСсьма эффСктивна ΠΈ позволяСт ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ шага компиляции. Она полагаСтся Π½Π° Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ сцСнарии повСдСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊ люди Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с Π²Π΅Π±-рСсурсами. А ΠΈΠΌΠ΅Π½Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ слСдуСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ дСйствий, работая с Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, загруТаСтся ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠΎΠ΄.

Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ SpiderMonkey, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π² FireFox, Π½Π΅ занимаСтся ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ всСго подряд. Он ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ систСму ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°, которая подсчитываСт количСство Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ скрипта. На основС этих ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ участки ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ β€” Ρ‚Π΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ приходится максимальная Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ°.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΡ… ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°ΠΌ ΠΈ вовсС Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. Π’Π°ΠΊ, МасСй Бтачовяк, Π²Π΅Π΄ΡƒΡ‰ΠΈΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° Safari, Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Safari Π½Π΅ занимаСтся ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ скомпилированного Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π»Π°ΡΡŒ, Π½ΠΎ ΠΎΠ½Π° Π΄ΠΎ сих ΠΏΠΎΡ€ Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ гСнСрация ΠΊΠΎΠ΄Π° Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΌΠ΅Π½Π΅Π΅ 2% ΠΎΠ±Ρ‰Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

Π­Ρ‚ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π΅ Π²Π»ΠΈΡΡŽΡ‚ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π½Π° парсинг исходного ΠΊΠΎΠ΄Π° Π½Π° JS. Π’ Ρ…ΠΎΠ΄Π΅ ΠΈΡ… примСнСния дСлаСтся всё Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹, Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… случаях, ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ этот шаг. Каким Π±Ρ‹ быстрым Π½ΠΈ Π±Ρ‹Π» парсинг, ΠΎΠ½, всё ΠΆΠ΅, Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя, Π° ΠΏΠΎΠ»Π½ΠΎΠ΅ отсутствиС парсинга β€” это, ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ, ΠΏΡ€ΠΈΠΌΠ΅Ρ€ идСальной ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π‘ΠΎΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅

Как ΠΌΡ‹ выяснили Π²Ρ‹ΡˆΠ΅, Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ свСсти Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² парсингС скриптов ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΡƒ, Π½ΠΎ совсСм ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ Π½Π΅Π³ΠΎ нСльзя, поэтому ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅. На самом Π΄Π΅Π»Π΅, для этого ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ всСго. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΡ‘ΠΌ JS-ΠΊΠΎΠ΄Π°, входящСго Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Код малСнького ΠΎΠ±ΡŠΡ‘ΠΌΠ°, готовящий страницу ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅, ΠΌΠΎΠΆΠ½ΠΎ быстрСС Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ, Π΄Π° ΠΈ Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, вСроятнСС всСго, Π·Π°ΠΉΠΌΡ‘Ρ‚ мСньшС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‡Π΅ΠΌ Ρƒ ΠΊΠΎΠ΄Π° Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±ΡŠΡ‘ΠΌΠ½ΠΎΠ³ΠΎ.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΡ‘ΠΌ ΠΊΠΎΠ΄Π°, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ Π½Π° страницу Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π΅ΠΉ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Π° Π½Π΅ Π½Π΅ΠΊΠΎΠ΅Π³ΠΎ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ³ΠΎ куска ΠΊΠΎΠ΄Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ всё, Π½ΡƒΠΆΠ½ΠΎΠ΅ для Π²Π΅Π±-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² Ρ†Π΅Π»ΠΎΠΌ. Π’Π°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ PRPL ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ³Π°Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ ΠΊΠΎΠ΄Π°. Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ зависимости ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Π΅ΡΡ‚ΡŒ Π»ΠΈ Π² Π½ΠΈΡ… Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΠ΅, Ρ‚Π°ΠΊΠΎΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ лишь ΠΊ Π½Π΅ΠΎΠΏΡ€Π°Π²Π΄Π°Π½Π½ΠΎΠΌΡƒ Ρ€Π°Π·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Ρ‹. На самом Π΄Π΅Π»Π΅, Ρ‚ΡƒΡ‚ ΠΌΡ‹ Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΠ»ΠΈ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‚Π΅ΠΌΡƒ, Π΄ΠΎΡΡ‚ΠΎΠΉΠ½ΡƒΡŽ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π°. ВСрнёмся ΠΊ парсингу.

Π˜Ρ‚Π°ΠΊ, Ρ†Π΅Π»ΡŒ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² обсуТдСнии ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ ΠΏΠΎΠΌΠΎΡ‡ΡŒ парсСру быстрСС Π΄Π΅Π»Π°Ρ‚ΡŒ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π’Π°ΠΊΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚. Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ JS-парсСры ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ эвристичСскиС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, понадобится Π»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΈΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ скорСС, ΠΈΠ»ΠΈ Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅. ΠžΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° этих прСдсказаниях, парсСр Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°, примСняя Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΆΠ°Π΄Π½ΠΎΠ³ΠΎ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° (eager parsing), Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° (lazy parsing). ΠŸΡ€ΠΈ ΠΏΠΎΠ»Π½ΠΎΠΌ Π°Π½Π°Π»ΠΈΠ·Π΅ Ρ€Π°Π·Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ скорСС. Π’ Ρ…ΠΎΠ΄Π΅ этого процСсса выполняСтся Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ‚Ρ€Ρ‘Ρ… основных Π·Π°Π΄Π°Ρ‡: построСниС AST, созданиС ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ областСй видимости ΠΈ поиск синтаксичСских ошибок. Π›Π΅Π½ΠΈΠ²Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ·, с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΊΠ° Π½Π΅ Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² компиляции. Π—Π΄Π΅ΡΡŒ Π½Π΅ создаётся AST ΠΈ Π½Π΅ выполняСтся поиск ошибок. ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ лишь создаётся иСрархия областСй видимости, Ρ‡Ρ‚ΠΎ позволяСт ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² сравнСнии с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ скорСС.

На самом Π΄Π΅Π»Π΅, концСпция это Π½Π΅ новая. Π”Π°ΠΆΠ΅ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠ΅ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ Π²Ρ€ΠΎΠ΄Π΅ IE9 ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ ΠΊ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, хотя, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, соврСмСнныС систСмы ΡƒΡˆΠ»ΠΈ Π΄Π°Π»Π΅ΠΊΠΎ Π²ΠΏΠ΅Ρ€Ρ‘Π΄.

Π Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‚Ρƒ этих ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ². ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρƒ нас имССтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ JS-ΠΊΠΎΠ΄:

Как ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΊΠΎΠ΄ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² парсСр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт Π΅Π³ΠΎ синтаксичСский Π°Π½Π°Π»ΠΈΠ· ΠΈ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ AST. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ парсСр прСдставляСт ΠΊΠΎΠ΄, состоящий ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… основных частСй (Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ foo ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒ внимания Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ):

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π·Π±ΠΎΡ€Π° ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π±Π΅Π· примСнСния ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, настоящий парсСр сформируСт структуру, Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‰ΡƒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ схСму.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π·Π±ΠΎΡ€Π° ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° с ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ

Π’ Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠΉ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ слоТного, Π½ΠΎ Π΅Ρ‘ практичСская рСализация β€” Π·Π°Π΄Π°Ρ‡Π° Π½Π΅ ΠΈΠ· Π»Ρ‘Π³ΠΊΠΈΡ…. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ рассмотрСли ΠΎΡ‡Π΅Π½ΡŒ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π°, Π½Π° самом Π΄Π΅Π»Π΅, ΠΏΡ€ΠΈ принятии Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎ Ρ‚ΠΎΠΌ, Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ Π½Π΅ΠΊΠΈΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° вострСбован Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π½ΡƒΠΆΠ½ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈ Ρ†ΠΈΠΊΠ»Ρ‹, ΠΈ условныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. Π’ Ρ†Π΅Π»ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ парсСру Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ всё, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

Π’ΠΎΡ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, вСсьма распространённый ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π² JavaScript:

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ соврСмСнных JS-парсСров Ρ€Π°ΡΠΏΠΎΠ·Π½Π°ΡŽΡ‚ этот ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½, ΠΎΠ½ для Π½ΠΈΡ… являСтся сигналом Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄, располоТСнный Π²Π½ΡƒΡ‚Ρ€ΠΈ модуля, Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

А Ρ‡Ρ‚ΠΎ Ссли Π±Ρ‹ парсСры всСгда использовали Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ синтаксичСский Π°Π½Π°Π»ΠΈΠ·? Π­Ρ‚ΠΎ, ΠΊ соТалСнию, Π½Π΅ самая Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ идСя. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅, Ссли Π½Π΅ΠΊΠΈΠΉ ΠΊΠΎΠ΄ Π½Π°Π΄ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ скорСС, ΠΌΡ‹ столкнёмся с Π·Π°ΠΌΠ΅Π΄Π»Π΅Π½ΠΈΠ΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ систСмы. ΠŸΠ°Ρ€ΡΠ΅Ρ€ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ Π»Π΅Π½ΠΈΠ²ΠΎΠ³ΠΎ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°, послС Ρ‡Π΅Π³ΠΎ Ρ‚ΡƒΡ‚ ΠΆΠ΅ примСтся Π·Π° ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ скорСС. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 50% замСдлСнию Π² сравнСнии с ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° парсСр сразу приступаСт ΠΊ ΠΏΠΎΠ»Π½ΠΎΠΌΡƒ Ρ€Π°Π·Π±ΠΎΡ€Ρƒ самого Π²Π°ΠΆΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΠΊΠΎΠ΄Π° с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ особСнностСй Π΅Π³ΠΎ Ρ€Π°Π·Π±ΠΎΡ€Π°

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ происходит Π² Π½Π΅Π΄Ρ€Π°Ρ… парсСров, ΠΏΡ€ΠΈΡˆΠ»ΠΎ врСмя ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌ ΠΏΠΎΠΌΠΎΡ‡ΡŒ. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ синтаксичСский Π°Π½Π°Π»ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ производился Π² Π½ΡƒΠΆΠ½ΠΎΠ΅ Π½Π°ΠΌ врСмя. Π’ΡƒΡ‚ сущСствуСт ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ парсСров. Он выраТаСтся Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π² скобки. Вакая конструкция практичСски всСгда сообщаСт парсСру ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½Π°Π΄ΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π±Π΅Π·ΠΎΡ‚Π»Π°Π³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. Если парсСр ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ скобку, сразу послС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ слСдуСт объявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ½ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ приступит ΠΊ синтаксичСскому Π°Π½Π°Π»ΠΈΠ·Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΌΠΎΡ‡ΡŒ парсСру, примСняя этот ΠΏΡ€ΠΈΡ‘ΠΌ ΠΏΡ€ΠΈ описании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ скорСС.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρƒ нас имССтся функция foo :

Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² этом Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΊΠΎΠ΄Π° Π½Π΅Ρ‚ явного указания Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ планируСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ лишь Π΅Ρ‘ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ синтаксичСский Π°Π½Π°Π»ΠΈΠ·. Однако ΠΌΡ‹ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ эта функция понадобится Π½Π°ΠΌ ΠΎΡ‡Π΅Π½ΡŒ скоро, поэтому ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΠ±Π΅Π³Π½ΡƒΡ‚ΡŒ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΏΡ€ΠΈΡ‘ΠΌΡƒ.

Для Π½Π°Ρ‡Π°Π»Π° сохраним Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ:

ПослС Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠ³ΠΎ измСнСния парсСр ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ синтаксичСский Π°Π½Π°Π»ΠΈΠ·. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ это ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ, достаточно ΠΎΠ΄Π½ΠΎΠΉ нСбольшой Π΄Π΅Ρ‚Π°Π»ΠΈ. Π€ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½Π°Π΄ΠΎ Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² скобки:

ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ нСпросто Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ для этого Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ Ρ‚ΠΎ, Π² ΠΊΠ°ΠΊΠΈΡ… случаях парсСр Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ синтаксичСский Π°Π½Π°Π»ΠΈΠ·, Π° Π² ΠΊΠ°ΠΊΠΈΡ… β€” ΠΏΠΎΠ»Π½Ρ‹ΠΉ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, для этого Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя Π½Π° принятиС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎ Ρ‚ΠΎΠΌ, нуТдаСтся Π»ΠΈ конкрСтная функция Π² ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ быстрой готовности ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΈΠ»ΠΈ Π½Π΅Ρ‚.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Π°ΠΌ, навСрняка, Π½Π΅ захочСтся Π²Π·Π²Π°Π»ΠΈΠ²Π°Ρ‚ΡŒ Π½Π° сСбя всю эту Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΌΠ΅Π½Π΅ Π²Π°ΠΆΠ½ΠΎ Ρ‡Π΅ΠΌ всё Ρ‚ΠΎ, ΠΎ Ρ‡Ρ‘ΠΌ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ сказано, ΠΊΠΎΠ΄, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π±ΡƒΠ΄Π΅Ρ‚ слоТнСС Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ. Π’ этой ситуации Π½Π°ΠΌ Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΏΡ€ΠΈΠΉΡ‚ΠΈ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Π²Ρ€ΠΎΠ΄Π΅ Optimize.js. Π˜Ρ… основная Ρ†Π΅Π»ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ исходного ΠΊΠΎΠ΄Π° Π½Π° JS. Они Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ статичСский Π°Π½Π°Π»ΠΈΠ· ΠΊΠΎΠ΄Π° ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‚ Π΅Π³ΠΎ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ скорСС, Π±Ρ‹Π»ΠΈ Π±Ρ‹ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² скобки, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ займётся ΠΈΡ… Ρ€Π°Π·Π±ΠΎΡ€ΠΎΠΌ ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΎΠΉ ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ.

Π˜Ρ‚Π°ΠΊ, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΠ΅ΠΌ, Π½ΠΈ ΠΎ Ρ‡Ρ‘ΠΌ особо Π½Π΅ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°ΡΡΡŒ, ΠΈ Ρƒ нас имССтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°:

Π’Ρ€ΠΎΠ΄Π΅ ΠΈ Ρ‚ΡƒΡ‚ всё Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, ΠΊΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π» Ρ€Π°Π½ΡŒΡˆΠ΅. Однако Ссли ΠΏΡ€ΠΈΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒΡΡ, окаТСтся Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΅-Ρ‡Π΅Π³ΠΎ Π² этом ΠΌΠΈΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ исходной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚.

ΠœΠΈΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΡƒΠ±Ρ€Π°Π» скобки, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΎ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ объявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, помСстив Π² Π½Π°Ρ‡Π°Π»ΠΎ строки Π²ΠΎΡΠΊΠ»ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π·Π½Π°ΠΊ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ парсСр Π΄Π°Π½Π½ΡƒΡŽ строчку пропустит, Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π° с использованиСм Π»Π΅Π½ΠΈΠ²ΠΎΠ³ΠΎ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, систСмС придётся Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ· сразу послС Π»Π΅Π½ΠΈΠ²ΠΎΠ³ΠΎ. Всё это ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ Π²ΠΎΡ‚ ΠΌΠΈΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Ρ‡Π΅ΠΌ Π΅Π³ΠΎ исходный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈΡˆΠ»ΠΎ врСмя Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎΠ± инструмСнтах Π²Ρ€ΠΎΠ΄Π΅ Π²Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΠΎΠ³ΠΎ Optimize.js. Если ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΌΠΈΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Optimize.js, Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ получится ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

Π­Ρ‚ΠΎ ΡƒΠΆΠ΅ большС ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ. ΠœΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΈ ΠΌΠΈΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ, ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΊΠΎΠ΄Π°. ВСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ мСньшС мСста Π½Π° дискС, Π° парсСру понятно, ΠΊΠ°ΠΊΠΈΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ скорСС, Π° ΠΊΠ°ΠΊΠΈΠ΅ β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΡƒ Π»Π΅Π½ΠΈΠ²ΠΎΠ³ΠΎ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°.

ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ компиляция

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° JS-ΠΊΠΎΠ΄Π° ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅ β€” Π΄Π΅Π»ΠΎ, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π΅Π΅ Π½Π΅ΠΌΠ°Π»Ρ‹Ρ… систСмных рСсурсов. ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ всё это Π½Π° сСрвСрС? Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ, ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ, Π½Π΅ΠΆΠ΅Π»ΠΈ ΠΏΡ€ΠΈΠ½ΡƒΠΆΠ΄Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΡƒΡŽ систСму ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ исходный ΠΊΠΎΠ΄. На самом Π΄Π΅Π»Π΅, эта Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сСйчас обсуТдаСтся, Π² частности, вопрос Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π»ΠΈ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π½Ρ‹Π΅ JS-Π΄Π²ΠΈΠΆΠΊΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Ρ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ выполнСния ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ скомпилированных скриптов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ ΠΎΡ‚ Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ΅ ΠΊΠΎΠ΄Π° ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ. Π’ Ρ†Π΅Π»ΠΎΠΌ, идСя Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρƒ нас Π±Ρ‹Π» Π½Π΅ΠΊΠΈΠΉ сСрвСрный инструмСнт, ΡƒΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ достаточно ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ ΠΏΠΎ сСти ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ. Π­Ρ‚ΠΎ даст Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ сокращСниС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ Π²Π΅Π±-страниц ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅. И хотя выглядит ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ довольно ΡΠΎΠ±Π»Π°Π·Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π° самом Π΄Π΅Π»Π΅, Π½Π΅ всё Ρ‚Π°ΠΊ просто. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊΠΎΠ΄Π° ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅ Π½Π° сСрвСрС ΠΌΠΎΠΆΠ΅Ρ‚ произвСсти ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ эффСкт, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΡ‘ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, вСроятно, возрастёт, ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² подписывании ΠΊΠΎΠ΄Π° ΠΈ Π² Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ для Ρ†Π΅Π»Π΅ΠΉ обСспСчСния бСзопасности. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, JS-Π΄Π²ΠΈΠΆΠΊΠΈ Ρ€Π°Π·Π²ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² ΡƒΠΆΠ΅ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π²ΡˆΠ΅ΠΌΡΡ руслС, Π² частности, ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² V8 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π°Π΄ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°ΠΌΠΈ Π΄Π²ΠΈΠΆΠΊΠ°, Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹ΠΌΠΈ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ парсинга. ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ ΠΊ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ Π½Π° сСрвСрС ΡƒΠΆΠ΅ Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒ ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ.

Π‘ΠΎΠ²Π΅Ρ‚Ρ‹ ΠΏΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ

Π’ΠΎΡ‚ нСсколько Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ:

Π˜Ρ‚ΠΎΠ³ΠΈ

Автор этого ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π² Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ, которая занимаСтся Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ систСмы SessionStack, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠΉ для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ΠΈ записи Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ происходит Π½Π° Π²Π΅Π±-страницах, Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΡ‘ΠΌΡ‹ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π°Ρ‡Π°Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅Π΄Π°Π²Π½ΠΎ. Π­Ρ‚ΠΎ позволяСт ΠΈΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠ΄ прилоТСния быстрСС загруТался ΠΈ готовился ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅. Π§Π΅ΠΌ быстрСС это происходит β€” Ρ‚Π΅ΠΌ приятнСС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с систСмой. ΠŸΠΎΠΆΠ°Π»ΡƒΠΉ, обСспСчСниС удобства Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ β€” это ΠΎΠ΄Π½Π° ΠΈΠ· Π·Π°Π΄Π°Ρ‡, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ стрСмятся Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ любого Π²Π΅Π±-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΈ Ρ‚ΠΎ, ΠΎ Ρ‡Ρ‘ΠΌ шла Ρ€Π΅Ρ‡ΡŒ Π² этом ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π΅, Π²ΠΏΠΎΠ»Π½Π΅ способно ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π² Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ этой Π·Π°Π΄Π°Ρ‡ΠΈ.

Π£Π²Π°ΠΆΠ°Π΅ΠΌΡ‹Π΅ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ! ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ ваши Π²Π΅Π±-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ скорости Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ Ρ€Π°Π·Π±ΠΎΡ€Π° ΠΈΡ… JavaScript-ΠΊΠΎΠ΄Π°?

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *