Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы

JIT для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы

ΠŸΡ€Π΅Π΄ΠΏΠΎΡΡ‹Π»ΠΊΠ°

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΡΠ»Ρ‹ΡˆΠ°Π»ΠΈ ΠΎ компиляторах JIT ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹Π΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ языки Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ, сравнимой с Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ. Однако ΠΌΠ°Π»ΠΎ ΠΊΡ‚ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ JIT, ΠΈ Π΅Ρ‰Ρ‘ мСньшС людСй ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΈΡΠ°Ρ‚ΡŒ свои собствСнныС компиляторы.

Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, Π±Π°Π·ΠΎΠ²Ρ‹Π΅ знания ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ… компилятора ΠΌΠΎΠ³ΡƒΡ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅Π³ΠΎ Π½Π° этом ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ обСспСчСнии.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ посСтим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ JIT-острова ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄Π°ΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ компилятор ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ!

Π‘ Ρ‡Π΅Π³ΠΎ ΠΌΡ‹ Π½Π°Ρ‡Π½Ρ‘ΠΌ

Зная Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ основы, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ компилятор ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΊΠ°ΠΊΠΎΠΌ-Ρ‚ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, исходный ΠΊΠΎΠ΄) Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΈΠ»ΠΈ Ρ‚Π°ΠΊΠΎΠΌ ΠΆΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ (ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄). JIT-компиляторы Π½Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

Π˜Ρ… Π΄Π΅Π»Π°Π΅Ρ‚ особСнными Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π΅ Π΄ΠΎ запуска ΠΊΠΎΠ΄Π° (ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, gcc, clang ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅), Π° Β«Just-In-TimeΒ» (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ прямо ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ скомпилированного ΠΊΠΎΠ΄Π°).

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ собствСнного JIT-компилятора, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ язык Π²Π²ΠΎΠ΄Π° для Π½Π΅Π³ΠΎ. Учитывая Top Github Languages for 2013 ( ΡΡ‚Π°Ρ‚ΡŒΡ написана Π² 2013 Π³ΠΎΠ΄Ρƒ, β€” ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€.), JavaScript каТСтся Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΎΠΌ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΅Π³ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ подмноТСства с ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎΠΉ сСмантикой. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ JIT-компилятор Π² самом JavaScript. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°Π·Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ META-META!

Наш компилятор Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ исходный ΠΊΠΎΠ΄ JavaScript Π² качСствС Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ (ΠΈ сразу ΠΆΠ΅ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ) ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ для ΠΎΡ‡Π΅Π½ΡŒ популярной ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ X64. Π₯отя для людСй Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с тСкстовым прСдставлСниСм довольно ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ компилятора ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ стрСмятся ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ нСсколько ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… прСдставлСний (Intermediate Representations ΠΈΠ»ΠΈ сокращённо IR) Π΄ΠΎ создания ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ машинного ΠΊΠΎΠ΄Π°.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ пишСм ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΉ компилятор, для нас достаточно ΠΎΠ΄Π½ΠΎΠ³ΠΎ IR, ΠΈ для этого я Π²Ρ‹Π±Ρ€Π°Π» aбстрактноС синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ (AST).

НапримСр, этот ΠΊΠΎΠ΄: obj.method(42) Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ AST (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ esprima.parse(«. «) ):

ΠœΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄

ПодвСдСм ΠΈΡ‚ΠΎΠ³: Ρƒ нас Π΅ΡΡ‚ΡŒ исходный ΠΊΠΎΠ΄ JavaScript ( сдСлано), Π΅Π³ΠΎ AST ( сдСлано), ΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ для Π½Π΅Π³ΠΎ.

Если Π²Ρ‹ ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с ассСмблСром, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ эту Π³Π»Π°Π²Ρƒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½Π° содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ ΠΏΠΎ этой Ρ‚Π΅ΠΌΠ΅. Однако, Ссли Π²Ρ‹ Π½ΠΎΠ²ΠΈΡ‡ΠΎΠΊ Π² этом, Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π³Π»Π°Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ тяТСлым, Ссли Π½Π΅ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ сначала Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ основы. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, поТалуйста, ΠΎΡΡ‚Π°Π²Π°ΠΉΡ‚Π΅ΡΡŒ с Π½Π°ΠΌΠΈ, это Π½Π΅ Π·Π°ΠΉΠΌΠ΅Ρ‚ слишком ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ!

АссСмблСр являСтся блиТайшим тСкстовым прСдставлСниСм Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ваш процСссор ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΈ с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Учитывая, Ρ‡Ρ‚ΠΎ процСссор выполняСт ΠΊΠΎΠ΄ ΠΏΡƒΡ‚Π΅ΠΌ чтСния ΠΈ запуска инструкций ΠΎΠ΄Π½ΠΎΠΉ Π·Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ, Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‡Ρ‚ΠΈ каТдая строка Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π° ассСмблСрС прСдставляСт собой ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ:

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Ρƒ процСссоров достаточно рСгистров для хранСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Π½ΠΎ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ситуациях Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ для хранСния/Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… (ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΈΠΌ):

Π•ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΌΠ½ΠΎΠ³ΠΎ нюансов программирования Π½Π° Ρ‚Π°ΠΊΠΎΠΌ Π½ΠΈΠ·ΠΊΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅, ΠΈ, ΠΊ соТалСнию, я Π½Π΅ Π±ΡƒΠ΄Ρƒ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΈΡ… здСсь. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, поТалуйста, ΠΈΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ я Π΄Π°Π» Π²Π°ΠΌ ΠΎΡ‡Π΅Π½ΡŒ повСрхностноС описаниС, ΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ происходит, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ слоТнСС.

Знания, упомянутыС Π²Ρ‹ΡˆΠ΅, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ достаточными для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π°.

ГСнСрация ΠΊΠΎΠ΄Π°

Полная рСализация JavaScript β€” довольно слоТная Π·Π°Π΄Π°Ρ‡Π°, поэтому Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΉ арифмСтичСский Π΄Π²ΠΈΠΆΠΎΠΊ (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ Π·Π°Π±Π°Π²Π½Ρ‹ΠΌ, ΠΊΠ°ΠΊ Π΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π΄ΠΎ ΠΏΠΎΠ»Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ·ΠΆΠ΅!).

Π‘Π°ΠΌΡ‹ΠΉ Π»ΡƒΡ‡ΡˆΠΈΠΉ ΠΈ самый простой способ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это: ΠΎΠ±ΠΎΠΉΡ‚ΠΈ AST с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ поиска Π² Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ, создавая ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°. Π’Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒΡΡ вопросом, ΠΊΠ°ΠΊ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π² Ρ‚Π°ΠΊΠΎΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΌ Π² прямой Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ языкС, ΠΊΠ°ΠΊ JavaScript. Π’ΠΎΡ‚ Π³Π΄Π΅ я ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒ вас с jit.js.

Π­Ρ‚ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для node.js (фактичСски, Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° C++), способный Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ сходный с ассСмблСром синтаксис:

Π”Π°Π²Π°ΠΉΡ‚Π΅ напишСм это

ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ:

ВсС эти ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ для Ρ†Π΅Π»Ρ‹Ρ… чисСл, поэтому Π½Π΅ ΠΎΠΆΠΈΠ΄Π°ΠΉΡ‚Π΅, Ρ‡Ρ‚ΠΎ нашС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ‚Π°ΠΊΠΈΠΌΠΈ значСниями, ΠΊΠ°ΠΊ 0.5, 0.66666 ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

Π’ΠΎΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ с коммСнтариями, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΌΠΈ, Ρ‡Ρ‚ΠΎ Π² Π½Ρ‘ΠΌ происходит:

Бпасибо, Ρ‡Ρ‚ΠΎ Π΄ΠΎΡ‡ΠΈΡ‚Π°Π»ΠΈ Π΄ΠΎ этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°! Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π· я расскаТу ΠΎ ΠΊΡƒΡ‡Π΅ ΠΈ опСрациях с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ!

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

Как Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с JIT

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… систСмах для быстрого поиска ΠΏΠΎ Π±ΠΎΠ»ΡŒΡˆΠΎΠΌΡƒ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΌΡƒ массиву ΠΌΡ‹ Π² Badoo ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ JIT. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ интСрСсная ΠΈ Π½Π΅ самая извСстная Ρ‚Π΅ΠΌΠ°. И, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ Π΄ΠΎΡΠ°Π΄Π½ΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, я ΠΏΠ΅Ρ€Π΅Π²Π΅Π» ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ Элая БСндСрски ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ JIT ΠΈ ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

РаньшС я ΡƒΠΆΠ΅ ΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π» Π²Π²ΠΎΠ΄Π½ΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΏΠΎ libjit для программистов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с JIT. Π₯отя Π±Ρ‹ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ. Π’ Ρ‚ΠΎΠΌ постС я совсСм ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎ описал JIT, Π° Π² этом сдСлаю ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΎΠ±Π·ΠΎΡ€ JIT ΠΈ дополню Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ, ΠΊΠΎΠ΄ Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ JIT

JIT – это Π°ΠΊΡ€ΠΎΠ½ΠΈΠΌ ΠΎΡ‚ β€œJust In Time” ΠΈΠ»ΠΈ, Ссли ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π° русский, β€œΠ½Π° лСту”. Π­Ρ‚ΠΎ Π½Π°ΠΌ Π½ΠΈ ΠΎ Ρ‡Π΅ΠΌ Π½Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΈ Π·Π²ΡƒΡ‡ΠΈΡ‚ Ρ‚Π°ΠΊ, Π±ΡƒΠ΄Ρ‚ΠΎ ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ. МнС каТСтся, это описаниС JIT большС всСго ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° ΠΏΡ€Π°Π²Π΄Ρƒ:

Если какая-Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²ΠΎ врСмя своСго исполнСния создаСт ΠΈ выполняСт ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ исполняСмый ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ Π±Ρ‹Π» Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° дискС, – это JIT.

Но ΠΎΡ‚ΠΊΡƒΠ΄Π° ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ это Π½Π°Π·Π²Π°Π½ΠΈΠ΅? К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Π”ΠΆΠΎΠ½ Айкок ΠΈΠ· унивСрситСта ΠšΠ°Π»Π³Π°Ρ€ΠΈ написал ΠΎΡ‡Π΅Π½ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠ½ΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ β€œΠšΡ€Π°Ρ‚ΠΊΠ°Ρ история JIT”, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ рассматриваСт JIT-Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ с историчСской Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния. Будя ΠΏΠΎ ΡΡ‚Π°Ρ‚ΡŒΠ΅, ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ исполнСния ΠΊΠΎΠ΄Π° Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ появилось Π² 1960 Π³ΠΎΠ΄Ρƒ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΏΡ€ΠΎ LISP, написанной McCarthy. Π’ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Π°Ρ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΡ‚Π°Ρ‚ΡŒΡ Вомсона ΠΎΡ‚ 1968 Π³ΠΎΠ΄Π° ΠΏΡ€ΠΎ рСгулярныС выраТСния) этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ совсСм ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½ (рСгулярныС выраТСния ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π½Π° Π»Π΅Ρ‚Ρƒ).

Π‘Π°ΠΌ ΠΆΠ΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ JIT Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ появился Π² ΠΊΠ½ΠΈΠ³Π°Ρ… ΠΏΠΎ Java ДТСймса Гослинга. Айкок Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Гослинг пСрСнял этот Ρ‚Π΅Ρ€ΠΌΠΈΠ½ ΠΈΠ· области ΠΏΡ€ΠΎΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΎΠ³ΠΎ производства ΠΈ Π½Π°Ρ‡Π°Π» Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ€Π°Π½Π½ΠΈΡ… 90-Ρ…. Если Π²Π°ΠΌ интСрСсны подробности, Ρ‚ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΡΡ‚Π°Ρ‚ΡŒΡŽ Айкока. А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ всС описанноС Π²Ρ‹ΡˆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅.

JIT: сгСнСрируйтС ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈ запуститС Π΅Π³ΠΎ

МнС каТСтся, Ρ‡Ρ‚ΠΎ JIT ΠΏΡ€ΠΎΡ‰Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ссли сразу Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π½Π° Π΄Π²Π΅ Ρ„Π°Π·Ρ‹:

ΠŸΠ΅Ρ€Π²Π°Ρ Ρ„Π°Π·Π° – это 99% всСй слоТности JIT. Но Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя это самая банальная Ρ‡Π°ΡΡ‚ΡŒ процСсса: это ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ компилятор. Π¨ΠΈΡ€ΠΎΠΊΠΎ извСстныС компиляторы, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ gcc ΠΈ clang/llvm, Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΡƒΡŽΡ‚ исходники ΠΈΠ· C/C++ Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. Π”Π°Π»ΡŒΡˆΠ΅ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ сохраняСтся Π² Ρ„Π°ΠΉΠ», Π½ΠΎ Π½Π΅Ρ‚ смысла Π½Π΅ ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π΅Π³ΠΎ Π² памяти (Π½Π° самом Π΄Π΅Π»Π΅ ΠΈ Π² gcc, ΠΈ Π² clang/llvm Π΅ΡΡ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ возмоТности для сохранСния ΠΊΠΎΠ΄Π° Π² памяти для использования Π΅Π³ΠΎ Π² JIT). Но Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΡΡ„ΠΎΠΊΡƒΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ„Π°Π·Π΅.

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ сгСнСрированного ΠΊΠΎΠ΄Π°

Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ систСмы ΠΎΡ‡Π΅Π½ΡŒ ΠΈΠ·Π±ΠΈΡ€Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Π²ΠΎ врСмя Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π’Ρ€Π΅ΠΌΠ΅Π½Π° Π΄ΠΈΠΊΠΎΠ³ΠΎ Π·Π°ΠΏΠ°Π΄Π° Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΈΡΡŒ с появлСниСм Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС Π²Ρ‹ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΡ€Π°Π²Π° Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ куски памяти процСсса. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π² β€œΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌβ€ Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π½Π° ΠΊΡƒΡ‡Π΅, Π½ΠΎ Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π΄Π΅Π»Π΅Π½ Π½Π° ΠΊΡƒΡ‡Π΅, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ явно Π½Π΅ попросив ΠΎΠ± этом ОБ.

Π― надСюсь, всСм понятно, Ρ‡Ρ‚ΠΎ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ – это просто Π΄Π°Π½Π½Ρ‹Π΅, Π½Π°Π±ΠΎΡ€ Π±Π°ΠΉΡ‚ΠΎΠ². Как Π²ΠΎΡ‚ это, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Для ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ эти Ρ‚Ρ€ΠΈ Π±Π°ΠΉΡ‚Π° – просто Ρ‚Ρ€ΠΈ Π±Π°ΠΉΡ‚Π°, Π° для ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ – Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ прСдставлСниС Π²Π°Π»ΠΈΠ΄Π½ΠΎΠ³ΠΎ x86-64 ΠΊΠΎΠ΄Π°:

ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ этот ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ. Но ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Π³ΠΎ исполняСмым ΠΈ, собствСнно, ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ?

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° ΠΊΠΎΠ΄

Π”Π°Π»ΡŒΡˆΠ΅ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π° для POSIX-совмСстимой UNIX ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы (Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Linux). На Π΄Ρ€ΡƒΠ³ΠΈΡ… ОБ (Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Windows) ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ Π² дСталях, Π½ΠΎ Π½Π΅ Π² ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅. Π£ всСх соврСмСнных ОБ Π΅ΡΡ‚ΡŒ ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ API для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ самоС.

Π‘Π΅Π· Π»ΠΈΡˆΠ½ΠΈΡ… прСдисловий посмотрим, ΠΊΠ°ΠΊ динамичСски ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² памяти ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΅Π΅. Π­Ρ‚Π° функция ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ сдСлана ΠΎΡ‡Π΅Π½ΡŒ простой. Π’ C ΠΎΠ½Π° выглядит Ρ‚Π°ΠΊ:

Π’ΠΎΡ‚ пСрвая ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° (ΠΏΠΎΠ»Π½Ρ‹ΠΉ исходник вмСстС с Makefile доступСн Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ):

Π’Ρ€ΠΈ основных этапа, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ выполняСт этот ΠΊΠΎΠ΄:

ΠŸΡ€ΠΎΡˆΡƒ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ этап Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° кусок памяти с ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€Π°Π²Π° Π½Π° исполнСниС. Π‘Π΅Π· Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΏΡ€Π°Π² Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠ²Π΅Π» Π±Ρ‹ ΠΊ ошибкС ОБ (скорСС всСго, ошибкС сСгмСнтирования). Π­Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΡ‹ Π²Ρ‹Π΄Π΅Π»ΠΈΠΌ m ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ malloc, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выдСляСт RW ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π½ΠΎ Π½Π΅ X.

ΠžΡ‚Π²Π»Π΅Ρ‡Π΅ΠΌΡΡ Π½Π° ΠΌΠΈΠ½ΡƒΡ‚ΠΊΡƒ: heap, malloc ΠΈ mmap

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ ΠΎΡ‚ mmap β€œΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈΠ· кучи”, Π½Π΅ ошибка, ΠΏΠΎ ΠΌΠΎΠ΅ΠΌΡƒ мнСнию, ΠΈ я ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ ΠΈ дальшС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ это Π½Π°Π·Π²Π°Π½ΠΈΠ΅.

Заботимся ΠΎ бСзопасности

Π£ ΠΊΠΎΠ΄Π° Π²Ρ‹ΡˆΠ΅ Π΅ΡΡ‚ΡŒ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Π°Ρ ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° Π² Π±Π»ΠΎΠΊΠ΅ RWX-памяти, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ выдСляСт – Ρ€Π°ΠΉ для эксплоитов. Π”Π°Π²Π°ΠΉΡ‚Π΅ Π±ΡƒΠ΄Π΅ΠΌ Ρ‡ΡƒΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ отвСтствСнными. Π’ΠΎΡ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄:

Π§Ρ‚ΠΎ насчСт malloc?

Подводя ΠΈΡ‚ΠΎΠ³ΠΈ

Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ Π½Π°Ρ‡ΠΈΠ½Π°Π»Π°ΡΡŒ с ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΎΠ±Π·ΠΎΡ€Π° JIT, Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅ΠΌ, ΠΊΠΎΠ³Π΄Π° Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ β€œJIT”, ΠΈ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»Π°ΡΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ дСмонстрируСт, ΠΊΠ°ΠΊ динамичСски Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ кусок машинного ΠΊΠΎΠ΄Π° ΠΈΠ· памяти. Π’Π΅Ρ…Π½ΠΈΠΊΠΈ, прСдставлСнныС Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ – это ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚ΠΎ, ΠΊΠ°ΠΊ дСлаСтся JIT Π² настоящих JIT-систСмах (LLVM ΠΈΠ»ΠΈ libjit). ΠžΡΡ‚Π°Π΅Ρ‚ΡΡ всСго лишь β€œΠΏΡ€ΠΎΡΡ‚Π°Ρβ€ Ρ‡Π°ΡΡ‚ΡŒ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ машинного ΠΊΠΎΠ΄Π° ΠΈΠ· ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ прСдставлСния.

LLVM содСрТит Π² сСбС ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ компилятор, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ C ΠΈ C++-ΠΊΠΎΠ΄ (Ρ‡Π΅Ρ€Π΅Π· LLVM IR) Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π° Π»Π΅Ρ‚Ρƒ ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ. Libjit Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅: ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ бэкСндом для компилятора. Моя вводная ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΠΎ libjit дСмонстрируСт, ΠΊΠ°ΠΊ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Но JIT – это Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰ΠΈΠΉ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚. Π‘ΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° Π»Π΅Ρ‚Ρƒ ΠΌΠΎΠΆΠ½ΠΎ для структур Π΄Π°Π½Π½Ρ‹Ρ…, рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ Π΄Π°ΠΆΠ΅ для доступа ΠΊ C ΠΈΠ· Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… языков. Π― покопался Π² Π°Ρ€Ρ…ΠΈΠ²Π°Ρ… своСго Π±Π»ΠΎΠ³Π° ΠΈ нашСл ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠ΅ ΠΎ JIT Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π²ΠΎΡΡŒΠΌΠΈΠ»Π΅Ρ‚Π½Π΅ΠΉ давности. Она ΠΎ Perl-ΠΊΠΎΠ΄Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Perl-ΠΊΠΎΠ΄ Π½Π° Π»Π΅Ρ‚Ρƒ (ΠΈΠ· XML-Ρ„Π°ΠΉΠ»Π° с описаниСм), Π½ΠΎ идСя Ρ‚Π° ΠΆΠ΅ самая.

Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ я ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ JIT Π²Π°ΠΆΠ½ΠΎ, раздСляя Π΄Π²Π΅ Ρ„Π°Π·Ρ‹. Для Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ„Π°Π·Ρ‹ (ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ я описал Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅) рСализация довольно банальна ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ стандартныС API ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. Для ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ„Π°Π·Ρ‹ возмоТностСй бСсконСчноС количСство. И Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π² Π½Π΅ΠΉ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ счСтС, зависит ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚Π΅.

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

Как Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ JIT-компиляторы

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы

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

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±Π°Π·ΠΎΠ²ΠΎΠ΅ прСдставлСниС ΠΎ JIT-компиляторах, ΠΏΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ эту ΡΡ‚Π°Ρ‚ΡŒΡŽ.

Π― часто Π±ΡƒΠ΄Ρƒ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π°, вСроятно, Π΅ΡΡ‚ΡŒ ΠΈ Π² ΠΊΠ°ΠΊΠΎΠΌ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΌ компиляторС. Π₯отя я Π½Π΅ всСгда ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽ, Π΅ΡΡ‚ΡŒ Π»ΠΈ эта оптимизация Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ JIT (ΠΈΠ½ΠΎΠ³Π΄Π° всё Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ), Π½ΠΎ Ссли знаю Ρ‚ΠΎΡ‡Π½ΠΎ, Ρ‚ΠΎ ΡƒΠΊΠ°ΠΆΡƒ Π½Π° это. Π― Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Π³Π΄Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π° оптимизация, Π½ΠΎ это Π½Π΅ Ρ‚ΠΎΡ‡Π½ΠΎ, вСдь ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Π΄Π°Π½ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠœΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ ΠΎΠ±Ρ‰ΠΈΠ΅ упрощСния, Π½ΠΎ Π½Π΅ большС, Ρ‡Π΅ΠΌ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… постов.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Π²Π΅Ρ…ΠΈ

(ΠœΠ΅Ρ‚Π°)трассировка

LuaJIT ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ трассировку (tracing). Pypy выполняСт мСтатрассировку, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ систСму для гСнСрирования ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠ² трассировки ΠΈ JIT. Pypy ΠΈ LuaJIT β€” это Π½Π΅ ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠ²Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Python ΠΈ Lua, Π° ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹. Π― Π±Ρ‹ ΠΎΡ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΠΎΠ²Π°Π» LuaJIT ΠΊΠ°ΠΊ ΡˆΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅ Π±Ρ‹ΡΡ‚Ρ€ΡƒΡŽ, ΠΈ ΠΎΠ½Π° сама сСбя описываСт ΠΊΠ°ΠΊ ΠΎΠ΄Π½Ρƒ ΠΈΠ· самых быстрых динамичСских языковых Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ β€” ΠΈ я этому Π±Π΅Π·ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΎΡ‡Π½ΠΎ Π²Π΅Ρ€ΡŽ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ трассировку, Ρ†ΠΈΠΊΠ» ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ ΠΈΡ‰Π΅Ρ‚ «горячиС» Ρ†ΠΈΠΊΠ»Ρ‹ (концСпция «горячСго» ΠΊΠΎΠ΄Π° ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π° для всСх JIT-компиляторов!). Π—Π°Ρ‚Π΅ΠΌ компилятор «трассируСт» Ρ†ΠΈΠΊΠ», записывая исполняСмыС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ для компилирования Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ машинного ΠΊΠΎΠ΄Π°. Π’ LuaJIT компиляция выполняСтся Π½Π° основС трасс с ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΌ прСдставлСниСм, ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌ Π½Π° инструкции, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎ для LuaJIT.

Как трассировка Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² Pypy

Pypy Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Ρ‚Ρ€Π°ΡΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ послС 1619 исполнСний ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Ρ‰Ρ‘ послС 1039 исполнСний, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΊΠΎΠ»ΠΎ 3000 исполнСний Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° Π½Π°Ρ‡Π°Π»Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ быстрСС. Π­Ρ‚ΠΈ значСния Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄Π±ΠΈΡ€Π°Π»ΠΈΡΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ Pypy, ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π² ΠΌΠΈΡ€Π΅ компиляторов ΠΌΠ½ΠΎΠ³ΠΈΠ΅ константы ΠΏΠΎΠ΄Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΠ΄ΡƒΠΌΠ°Π½Π½ΠΎ.

ДинамичСскиС языки Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½ΡΡŽΡ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ. НиТСпривСдённый ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ статичСски ΡƒΠ΄Π°Π»Ρ‘Π½ Π±ΠΎΠ»Π΅Π΅ строгим языком, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ False всСгда Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΎΠΆΠ½Ρ‹ΠΌ. Однако Π² Python 2 этого нСльзя Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° исполнСния.

Для любой Ρ€Π°Π·ΡƒΠΌΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ это условиС всСгда Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΎΠΆΠ½Ρ‹ΠΌ. К соТалСнию, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ False ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ, ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π² Ρ†ΠΈΠΊΠ»Π΅, Π΅Π³ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π³Π΄Π΅-Ρ‚ΠΎ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ мСстС. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Pypy ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Β«Π·Π°Ρ‰ΠΈΡ‚Π½ΠΈΠΊΠ°Β». Если Π·Π°Ρ‰ΠΈΡ‚Π½ΠΈΠΊ Π½Π΅ справляСтся, JIT возвращаСтся ΠΊ Ρ†ΠΈΠΊΠ»Ρƒ интСрпрСтирования. Π—Π°Ρ‚Π΅ΠΌ Pypy с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΎΠΉ константы (200), которая называСтся trace eagerness, Ρ€Π΅ΡˆΠ°Π΅Ρ‚, Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ остаток Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° Ρ†ΠΈΠΊΠ»Π°. Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄ΠΏΡƒΡ‚ΡŒ называСтся мостом (bridge).

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Pypy прСдоставляСт эти константы ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Π² Ρ…ΠΎΠ΄Π΅ исполнСния наряду с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ Ρ€Π°Π·Π²Ρ‘Ρ€Ρ‚ΠΊΠΈ (unrolling), Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Ρ†ΠΈΠΊΠ»Π°, ΠΈ ΠΈΠ½Π»Π°ΠΉΠ½ΠΈΠ½Π³Π°! И Π²Π΄ΠΎΠ±Π°Π²ΠΎΠΊ ΠΎΠ½ прСдоставляСт Ρ…ΡƒΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ компилирования.

Погоди, Ρ‚Ρ‹ ΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ» ΠΏΡ€ΠΎ мСтатрассировку!

ИдСю мСтатрассировки ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ «напиши ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€, ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈ компилятор бСсплатно!Β», ΠΈΠ»ΠΈ Β«ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈ свой ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Π² JIT-компилятор!Β». ΠŸΠΈΡΠ°Ρ‚ΡŒ компилятор Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ, ΠΈ Ссли ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ бСсплатно, Ρ‚ΠΎ идСя крутая. Pypy «содСрТит» ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ ΠΈ компилятор, Π½ΠΎ Π² Π½Ρ‘ΠΌ Π½Π΅Ρ‚ явной Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ компилятора.

Π’ Pypy Π΅ΡΡ‚ΡŒ инструмСнт RPython (созданный для Pypy). Π­Ρ‚ΠΎ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ для написания ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠ². Π•Π³ΠΎ язык относится ΠΊ разновидности Python ΠΈ обСспСчиваСт ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ. На этом языкС ΠΈ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€. Π―Π·Ρ‹ΠΊ Π½Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для программирования Π½Π° Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Python, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π΅ содСрТит стандартных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈΠ»ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ². Π›ΡŽΠ±Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π° RPython являСтся ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ Python-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ. Код Π½Π° RPython транспилируСтся Π² Π‘, Π° Π·Π°Ρ‚Π΅ΠΌ компилируСтся. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, мСтакомпилятор Π½Π° этом языкС сущСствуСт Π² Π²ΠΈΠ΄Π΅ скомпилированной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Π‘.

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

ΠšΠΎΡ€ΠΎΡ‡Π΅, «компилятор» Π² Pypy ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ваш ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€, поэтому Pypy ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ мСтакомпилятором. Он ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ исполняСтС, сколько ΠΏΡƒΡ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°.

Если я Π·Π°ΠΏΡƒΡ‰Ρƒ этот горячий Ρ†ΠΈΠΊΠ»:

Врассы ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Но компилятор β€” Π½Π΅ ΠΊΠ°ΠΊΠΎΠΉ особСнный ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΎΠ½ встроСн Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ρ†ΠΈΠΊΠ» ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² JVM

Π― Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ мСсяца писал Π½Π° языкС TruffleRuby Π½Π° основС Graal, ΠΈ влюбился Π² Π½Π΅Π³ΠΎ.

Hotspot (Π½Π°Π·Π²Π°Π½Π° Ρ‚Π°ΠΊ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΈΡ‰Π΅Ρ‚ горячиС Ρ‚ΠΎΡ‡ΠΊΠΈ) β€” это Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина, поставляСмая со стандартными инсталляциями Java. Π’ Π½Π΅ΠΉ содСрТится нСсколько компиляторов для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠ³ΠΎ компилирования. Кодовая Π±Π°Π·Π° Hotspot Π² 250 000 строк ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Π°, Π² Π½Π΅ΠΉ Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ сборщика мусора. Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΠΊΠ° ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ справляСтся с JIT-компиляциСй, Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ°Ρ… ΠΎΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π΅ Ρ…ΡƒΠΆΠ΅ C++ impls (ΠΏΠΎ этому ΠΏΠΎΠ²ΠΎΠ΄Ρƒ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ сра споров, ΠΏΠΎΠ³ΡƒΠ³Π»ΠΈΡ‚Π΅). Π₯отя Hotspot Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ трассировку, ΠΎΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄: ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚. Π£ этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π½Π΅Ρ‚ своСго названия, ΠΎΠ½ Π±Π»ΠΈΠΆΠ΅ всСго ΠΊ JIT Π½Π° основС ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² (оптимизация ΠΏΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ), ΠΈΠ»ΠΈ ΠΊ ΠΌΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠΌΡƒ JIT.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² Hotspot стратСгии Π²Π΄ΠΎΡ…Π½ΠΎΠ²ΠΈΠ»ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… JIT-компиляторов, структур языковых Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин, ΠΈ особСнно Javascript-Π΄Π²ΠΈΠΆΠΊΠΎΠ². Π’Π°ΠΊΠΆΠ΅ Hotspot ΠΏΠΎΡ€ΠΎΠ΄ΠΈΠ»Π° Π²ΠΎΠ»Π½Ρƒ Ρ‚Π°ΠΊΠΈΡ… JVM-языков, ΠΊΠ°ΠΊ Scala, Kotlin, JRuby ΠΈ Jython. JRuby ΠΈ Jython β€” Π·Π°Π±Π°Π²Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ruby ΠΈ Python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ исходный ΠΊΠΎΠ΄ Π² JVM-Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΌ исполняСт Hotspot. ВсС эти ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΡƒΡΠΊΠΎΡ€ΡΡŽΡ‚ языки Python ΠΈ Ruby (Ruby большС, Ρ‡Π΅ΠΌ Python) Π±Π΅Π· Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ всСго инструмСнтария, ΠΊΠ°ΠΊ Π² случаС с Pypy. Π•Ρ‰Ρ‘ Hotspot ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Π° Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° являСтся JIT для ΠΌΠ΅Π½Π΅Π΅ динамичСских языков (хотя тСхничСски ΠΎΠ½Π° прСдставляСт собой JIT для JVM-Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π°, Π° Π½Π΅ для Java).

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы

GraalVM β€” это JavaVM с Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΊΠΎΠ΄Π° Π½Π° Java. Она ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒ любой JVM-язык (Java, Scala, Kotlin ΠΈ Ρ‚.Π΄.). На Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Native Image, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с AOT-ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ Ρ‡Π΅Ρ€Π΅Π· Substrate VM. Π—Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ доля Scala-сСрвисов Twitter Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° Graal, Ρ‡Ρ‚ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ качСствС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, ΠΈ ΠΊΠΎΠ΅ Π² Ρ‡Ρ‘ΠΌ ΠΎΠ½Π° Π»ΡƒΡ‡ΡˆΠ΅ JVM, хотя ΠΈ написана Π½Π° Java.

И это Π΅Ρ‰Ρ‘ Π½Π΅ всё! GraalVM Ρ‚Π°ΠΊΠΆΠ΅ прСдоставляСт Truffle: Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ языков с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ создания AST-ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠ² (Abstract Syntax Tree). Π’ Truffle Π½Π΅Ρ‚ явного шага, ΠΊΠΎΠ³Π΄Π° создаСтся JVM-Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄, ΠΊΠ°ΠΊ Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ языкС JVM. CΠΊΠΎΡ€Π΅Π΅, Truffle просто Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ‰Π°Ρ‚ΡŒΡΡ с Graal для создания машинного ΠΊΠΎΠ΄Π° нСпосрСдствСнно с ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ частичной ΠΎΡ†Π΅Π½ΠΊΠΎΠΉ. РассмотрСниС частичной ΠΎΡ†Π΅Π½ΠΊΠΈ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ ΡΡ‚Π°Ρ‚ΡŒΠΈ, Ссли Π²ΠΊΡ€Π°Ρ‚Ρ†Π΅: этот ΠΌΠ΅Ρ‚ΠΎΠ΄ исповСдуСт Ρ„ΠΈΠ»ΠΎΡΠΎΡ„ΠΈΡŽ мСтатрассировки «напиши ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€, ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈ компилятор бСсплатно!Β», Π½ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ Π½Π΅ΠΉ ΠΈΠ½Π°Ρ‡Π΅.

TruffleJS β€” Truffle-рСализация Javascript, которая ΠΎΠΏΠ΅Ρ€Π΅ΠΆΠ°Π΅Ρ‚ Π΄Π²ΠΈΠΆΠΎΠΊ V8 ΠΏΠΎ ряду ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, Ρ‡Ρ‚ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ впСчатляСт, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ V8 разрабатывался Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ Π»Π΅Ρ‚ дольшС, Google Π²Π»ΠΎΠΆΠΈΠ»Π° Π² Π½Π΅Π³ΠΎ ΠΊΡƒΡ‡Ρƒ Π΄Π΅Π½Π΅Π³ ΠΈ сил, Π½Π°Π΄ Π½ΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ ΠΎΡ„ΠΈΠ³Π΅Π½Π½Ρ‹Π΅ спСциалисты. TruffleJS Π½Π΅ Β«Π»ΡƒΡ‡ΡˆΠ΅Β» V8 (ΠΈΠ»ΠΈ любого Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ JS-Π΄Π²ΠΈΠΆΠΊΠ°) ΠΏΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Ρƒ ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠ΅Π², Π½ΠΎ это Π·Π½Π°ΠΊ Π½Π°Π΄Π΅ΠΆΠ΄Ρ‹ для Graal.

НСоТиданно ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Π΅ стратСгии JIT-компилирования

Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ C

По ряду ΠΏΡ€ΠΈΡ‡ΠΈΠ½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ C-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ. Бамая очСвидная ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ API Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ особСнностСй Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π‘-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π»Π΅Π³Ρ‡Π΅, ΠΊΠΎΠ³Π΄Π° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ написан Π½Π° Π‘, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ JRuby Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π‘-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, Π½ΠΎ Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ API для Java-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ. Π’ Pypy Π½Π΅Π΄Π°Π²Π½ΠΎ появилась Π±Π΅Ρ‚Π°-вСрсия ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π‘-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ, хотя Π² Π΅Ρ‘ работоспособности я Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½ Π² связи с Π·Π°ΠΊΠΎΠ½ΠΎΠΌ Π₯Π°ΠΉΡ€Π°ΠΌΠ°. LuaJIT ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π‘-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, Π² Ρ‚ΠΎΠΌ числС ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΠΈΡ‡ΠΈ Π² своих Π‘-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΡ… (LuaJIT β€” просто офигСнная ΡˆΡ‚ΡƒΠΊΠ°!)

Graal Ρ€Π΅ΡˆΠ°Π΅Ρ‚ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Sulong, Π΄Π²ΠΈΠΆΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π° GraalVM исполняСт LLVM-Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄, прСобразуя Π΅Π³ΠΎ Π² язык Truffle. LLVM β€” это Π½Π°Π±ΠΎΡ€ инструмСнтов, ΠΈ Π½Π°ΠΌ достаточно Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π‘ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² LLVM-Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ (Ρƒ Julia Ρ‚ΠΎΠΆΠ΅ Π΅ΡΡ‚ΡŒ LLVM-бэкСнд!). Π­Ρ‚ΠΎ странно, Π½ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π·ΡΡ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ язык с Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ сорокалСтнСй историСй, ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ! ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ совсСм Π½Π΅ Ρ‚Π°ΠΊ быстро, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ скомпилированный Π‘, Π½ΠΎ Π·Π°Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ нСсколько прСимущСств.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы

LLVM-Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ ΡƒΠΆΠ΅ довольно Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ JIT ΠΊ этому ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠΌΡƒ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡŽ Π½Π΅ Ρ‚Π°ΠΊ нСэффСктивно, ΠΊΠ°ΠΊ ΠΊ Π‘. Π§Π°ΡΡ‚ΡŒ расходов Π½Π°ΠΌ возмСщаСтся Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ вмСстС с ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ Ruby-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π° ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π‘-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΌΡ‹ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ смоТСм. ВсС эти удалСния Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² памяти, ΠΈΠ½Π»Π°ΠΉΠ½ΠΈΠ½Π³ΠΈ, удалСния ΠΌΡ‘Ρ€Ρ‚Π²Ρ‹Ρ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠ΄Π° ΠΈ ΠΏΡ€ΠΎΡ‡Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΊ ΠΊΠΎΠ΄Ρƒ Π½Π° Π‘ ΠΈ Ruby, вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊ Π½Π° Π‘ ΠΈΠ· Ruby-ΠΊΠΎΠ΄Π°. По Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ Π‘-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ TruffleRuby Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ быстрСС Π‘-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ CRuby.

Π§Ρ‚ΠΎΠ±Ρ‹ эта систСма Ρ€Π°Π±ΠΎΡ‚Π°Π»Π°, Π²Π°ΠΌ слСдуСт Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Truffle являСтся ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ нСзависимым ΠΎΡ‚ языка, ΠΈ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы Π½Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π‘, Java ΠΈΠ»ΠΈ Π»ΡŽΠ±Ρ‹ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ языком Π²Π½ΡƒΡ‚Ρ€ΠΈ Graal Π±ΡƒΠ΄ΡƒΡ‚ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹.

Π‘ΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ Graal Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Sulong являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΈΡ… ΠΏΠΎΠ»ΠΈΠ³Π»ΠΎΡ‚-возмоТностСй, Ρ‡Ρ‚ΠΎ обСспСчиваСт Π²Ρ‹ΡΠΎΠΊΡƒΡŽ Π²Π·Π°ΠΈΠΌΠΎΠ·Π°ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ языков. Π­Ρ‚ΠΎ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ для компилятора, Π½ΠΎ Π΅Ρ‰Ρ‘ ΠΈ Π΄ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько языков Π² ΠΎΠ΄Π½ΠΎΠΌ Β«ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈΒ».

ВСрнёмся ΠΊ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ, ΠΎΠ½ быстрСС

ΠœΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ JIT содСрТат Π² сСбС ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ ΠΈ компилятор, ΠΈ Ρ‡Ρ‚ΠΎ для ускорСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΎΠ½ΠΈ пСрСходят ΠΎΡ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° ΠΊ компилятору. Pypy создаёт мостики для ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ, хотя с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Graal ΠΈ Hotspot это дСоптимизация. ΠœΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π½Π΅ ΠΎ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Ρ€Π°Π·Π½Ρ‹Ρ… понятиях, Π½ΠΎ ΠΏΠΎΠ΄ Π΄Π΅ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ понимаСтся Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΊ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ Π² качСствС ΡΠΎΠ·Π½Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, Π° Π½Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ нСизбСТностСй динамичСского языка. Hotspot ΠΈ Graal Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π΄Π΅ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ, особСнно Graal, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρƒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π΅ΡΡ‚ΡŒ Тёсткий ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ компиляциСй, ΠΈ ΠΈΠΌ Π½ΡƒΠΆΠ½ΠΎ Π΅Ρ‰Ρ‘ большС контроля Π½Π°Π΄ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Ρ€Π°Π΄ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ (ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ, скаТСм, с Pypy). Π’Π°ΠΊΠΆΠ΅ дСоптимизация ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² JS-Π΄Π²ΠΈΠΆΠΊΠ°Ρ…, ΠΎ Ρ‡Ρ‘ΠΌ я Π±ΡƒΠ΄Ρƒ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°ΡΡΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΡ‚ Π½Π΅Ρ‘ зависит Ρ€Π°Π±ΠΎΡ‚Π° JavaScript Π² Chrome ΠΈ Node.js.

Π§Ρ‚ΠΎΠ±Ρ‹ быстро ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΄Π΅ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ, Π²Π°ΠΆΠ½ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² максимально быстром ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ компилятором ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ. ΠŸΡ€ΠΈ самой Π½Π°ΠΈΠ²Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ придётся Β«Π΄ΠΎΠ³ΠΎΠ½ΡΡ‚ΡŒΒ» компилятор, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΄Π΅ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ слоТности связаны с Π΄Π΅ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ асинхронных ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Graal создаёт Π½Π°Π±ΠΎΡ€ Ρ„Ρ€Π΅ΠΉΠΌΠΎΠ² ΠΈ сопоставляСт Π΅Π³ΠΎ со сгСнСрированным ΠΊΠΎΠ΄ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ бСзопасных состояний (safepoints) ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Java-ΠΏΠΎΡ‚ΠΎΠΊ встанСт Π½Π° ΠΏΠ°ΡƒΠ·Ρƒ ΠΈ скаТСт: Β«ΠŸΡ€ΠΈΠ²Π΅Ρ‚, сборщик мусора, ΠΌΠ½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ?Β», Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходов. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ довольно Π³Ρ€ΡƒΠ±ΠΎ, Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ достаточно быстро, Ρ‡Ρ‚ΠΎΠ±Ρ‹ дСоптимизация оказалась Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ стратСгиСй.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы

Аналогично ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ с мостиками Π² Pypy, Π΄Π΅ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ партизанский ΠΏΠ°Ρ‚Ρ‡ΠΈΠ½Π³ (monkey patching) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ элСгантнСС, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ добавляСм Π΄Π΅ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π½Π΅ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π·Π°Ρ‰ΠΈΡ‚Π½ΠΈΠΊ Ρ‚Π΅Ρ€ΠΏΠΈΡ‚ Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ, Π° ΠΊΠΎΠ³Π΄Π° примСняСтся партизанский ΠΏΠ°Ρ‚Ρ‡ΠΈΠ½Π³.

Π”Π°ΠΆΠ΅ Π½Π΅ посмотрСв Π½Π° скомпилированныС инструкции, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΊΠ°ΠΊ эта дСоптимизация ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ ΠΎΠ±ΡŠΡ‘ΠΌ ΠΊΠΎΠ΄Π°.

Π’ TruffleRuby дСоптимизируСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ³ΠΎΠ½ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ Ρ‚Ρ€Π°Ρ‚ΠΈΠΌ Π½Π° это рСсурсы ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.

WET-ΠΊΠΎΠ΄ β€” быстрый ΠΊΠΎΠ΄. Инлайнинг ΠΈ OSR

ΠžΡ‚Π²Π΅Ρ‚, Π΄Ρ€ΡƒΠ³ ΠΌΠΎΠΉ, кроСтся Π² Π·Π°ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ Π² стСкС (on-stack replacement, OSR). Инлайнинг β€” это мощная оптимизация компилятора (Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ JIT), ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°ΡŽΡ‚ Π±Ρ‹Ρ‚ΡŒ функциями, Π° содСрТимоС пСрСдаётся Π² мСста Π²Ρ‹Π·ΠΎΠ²Π°. JIT-компиляторы для увСличСния скорости ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ½Π»Π°ΠΉΠ½ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ измСнСния ΠΊΠΎΠ΄Π° Π² Ρ…ΠΎΠ΄Π΅ исполнСния (ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ языки ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ½Π»Π°ΠΉΠ½ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ статичСски).

Инлайнинг нСвСроятно эффСктивСн! Π― запустил Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ с ΠΏΠ°Ρ€ΠΎΠΉ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π½ΡƒΠ»Π΅ΠΉ, ΠΈ ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½ΠΎΠΌ ΠΈΠ½Π»Π°ΠΉΠ½ΠΈΠ½Π³Π΅ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π» Π²Ρ‡Π΅Ρ‚Π²Π΅Ρ€ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы

Π₯отя эта ΡΡ‚Π°Ρ‚ΡŒΡ посвящСна JIT, ΠΈΠ½Π»Π°ΠΉΠ½ΠΈΠ½Π³ эффСктивСн ΠΈ Π² ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… языках. ВсС LLVM-языки Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ ΠΈΠ½Π»Π°ΠΉΠ½ΠΈΠ½Π³, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΈ LLVM Ρ‚ΠΎΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ это Π΄Π΅Π»Π°Ρ‚ΡŒ, хотя Julia ΠΈΠ½Π»Π°ΠΉΠ½ΠΈΡ‚ ΠΈ Π±Π΅Π· LLVM, это Π² Π΅Ρ‘ ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π΅. JIT ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ½Π»Π°ΠΉΠ½ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ эвристик, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹Ρ… Π² Ρ…ΠΎΠ΄Π΅ исполнСния, ΠΈ способны ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π΅ΠΆΠΈΠΌΠ°ΠΌΠΈ Π±Π΅Π· ΠΈΠ½Π»Π°ΠΉΠ½ΠΈΠ½Π³Π° ΠΈ с ΠΈΠ½Π»Π°ΠΉΠ½ΠΈΠ½Π³ΠΎΠΌ посрСдством OSR.

Π—Π°ΠΌΠ΅Ρ‚ΠΊΠ° ΠΎ JIT ΠΈ LLVM

LLVM прСдоставляСт ΠΊΡƒΡ‡Ρƒ инструмСнтов, связанных с ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. Julia Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с LLVM (ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ это большой инструмСнтарий, ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ язык ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ), Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Rust, Swift ΠΈ Crystal. Достаточно ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это большой ΠΈ Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ JIT, хотя Π² LLVM Π½Π΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΠΌΡ‹Ρ… встроСнных динамичСских JIT. На Ρ‡Π΅Ρ‚Π²Ρ‘Ρ€Ρ‚ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ компилирования JavaScriptCore ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ врСмя использовался LLVM-бэкСнд, Π½ΠΎ Π΅Π³ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΠ»ΠΈ мСньшС Π΄Π²ΡƒΡ… Π»Π΅Ρ‚ Π½Π°Π·Π°Π΄. Π‘ Ρ‚Π΅Ρ… ΠΏΠΎΡ€ этот инструмСнтарий Π½Π΅ слишком Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для динамичСских JIT, Π² основном ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² условиях динамичности. Π’ Pypy Π΅Π³ΠΎ ΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ 5-6 Ρ€Π°Π·, Π½ΠΎ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»ΠΈΡΡŒ Π½Π° JSC. ΠŸΡ€ΠΈ использовании LLVM возмоТности allocation sinking ΠΈ пСрСмСщСния ΠΊΠΎΠ΄Π° (code motion) Π±Ρ‹Π»ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹. Π’Π°ΠΊΠΆΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΡ‰Π½Ρ‹Π΅ JIT-возмоТности Π²Ρ€ΠΎΠ΄Π΅ range-inferencing (это ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ², Π½ΠΎ с извСстным Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠΌ значСния). Но ΠΊΡƒΠ΄Π° Π²Π°ΠΆΠ½Π΅Π΅, Ρ‡Ρ‚ΠΎ с LLVM Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ тратится ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ рСсурсов.

А Ссли вмСсто ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ прСдставлСния Π½Π° основС инструкций Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ большой Π³Ρ€Π°Ρ„, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ сСбя?

ΠœΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΎΠ± LLVM-Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π΅ ΠΈ ΠΎ Python/Ruby/Java-Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π΅ Π² качСствС ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ прСдставлСния. ВсС ΠΎΠ½ΠΈ выглядят ΠΊΠ°ΠΊ Π½Π΅ΠΊΠΈΠΉ язык Π² Π²ΠΈΠ΄Π΅ инструкций. Π’ Hotspot, Graal ΠΈ V8 примСняСтся ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ прСдставлСниС Β«Sea of NodesΒ» (появилось Π² Hotspot), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΌ AST. Π­Ρ‚ΠΎ эффСктивноС прСдставлСниС, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ профилирования основана Π½Π° прСдставлСнии ΠΎΠ± ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΌ ΠΏΡƒΡ‚ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π΄ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ (ΠΈΠ»ΠΈ пСрСсСкаСтся Π² случаС ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ шаблона). ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ эти AST компиляторов ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ AST парсСров.

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ я ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Β«ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΄ΠΎΠΌΠ°!Β», Π½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π³Ρ€Π°Ρ„Ρ‹ довольно Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ, хотя ΠΈ ΠΎΡ‡Π΅Π½ΡŒ интСрСсно, Π° Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΈ ΠΊΡ€Π°ΠΉΠ½Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для понимания Ρ€Π°Π±ΠΎΡ‚Ρ‹ компилятора. Π―, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅ ΠΌΠΎΠ³Ρƒ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ всС Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ·-Π·Π° Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ Π·Π½Π°Π½ΠΈΠΉ, Π½ΠΎ ΠΈ ΠΈΠ·-Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»ΠΎΠ² Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… возмоТностСй ΠΌΠΎΠ΅Π³ΠΎ ΠΌΠΎΠ·Π³Π° (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ компилятора ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ повСдСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ мСня Π½Π΅ интСрСсуСт).

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы

Π›Π°Π΄Π½ΠΎ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ взглянСм Π½Π° JavaScript AST!

Π’Π°ΠΊ выглядит AST (я ΡƒΠ±Ρ€Π°Π» Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ°Π»ΠΎΠ²Π°ΠΆΠ½Ρ‹Π΅ строки):

ΠŸΠ°Ρ€ΡΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ слоТно, Π½ΠΎ это ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° AST парсСра (Π²Π΅Ρ€Π½ΠΎ Π½Π΅ для всСх ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ). А ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ AST сгСнСрировано с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Acorn.js

А Ρ‚Π°ΠΊ выглядит AST Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Graal!

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы

Выглядит ΠΊΡƒΠ΄Π° ΠΏΡ€ΠΎΡ‰Π΅. ΠšΡ€Π°ΡΠ½Ρ‹ΠΌ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ ΠΏΠΎΡ‚ΠΎΠΊ управлСния, синим β€” ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ…, стрСлками β€” направлСния. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ хотя этот Π³Ρ€Π°Ρ„ ΠΏΡ€ΠΎΡ‰Π΅, Ρ‡Π΅ΠΌ AST ΠΈΠ· V8, это Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Graal Π»ΡƒΡ‡ΡˆΠ΅ упростил ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΎΠ½ сгСнСрирован Π½Π° основС Java, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΡƒΠ΄Π° ΠΌΠ΅Π½Π΅Π΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅Π½. Π’ΠΎΡ‚ ΠΆΠ΅ Π³Ρ€Π°Ρ„ Graal, сгСнСрированный ΠΈΠ· Ruby, Π±ΡƒΠ΄Π΅Ρ‚ Π±Π»ΠΈΠΆΠ΅ ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΉ вСрсии.

Π—Π°Π±Π°Π²Π½ΠΎ, Ρ‡Ρ‚ΠΎ AST Π² Graal Π±ΡƒΠ΄ΡƒΡ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π² зависимости ΠΎΡ‚ исполнСния ΠΊΠΎΠ΄Π°. Π­Ρ‚ΠΎΡ‚ Π³Ρ€Π°Ρ„ сгСнСрирован с ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹ΠΌ OSR ΠΈ ΠΈΠ½Π»Π°ΠΉΠ½ΠΈΠ³ΠΎΠΌ, ΠΏΡ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ со случайными ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° Π½Π΅ Π±Ρ‹Π»Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π°. И Π΄Π°ΠΌΠΏ снабдит вас Ρ†Π΅Π»ΠΎΠΉ ΠΏΠ°Ρ‡ΠΊΠΎΠΉ Π³Ρ€Π°Ρ„ΠΎΠ²! Π’ Graal для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ примСняСтся спСциализированноС AST (V8 Π΄Π΅Π»Π°Π΅Ρ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, Π½ΠΎ Π½Π΅ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ AST). Когда ΡΠΎΡ…Ρ€Π°Π½ΡΠ΅ΡˆΡŒ Π² Graal Π³Ρ€Π°Ρ„Ρ‹, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΡˆΡŒ большС дСсяти схСм с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ уровнями ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠŸΡ€ΠΈ пСрСзаписи Π½ΠΎΠ΄ ΠΎΠ½ΠΈ Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ сСбя (ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚) Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Π½ΠΎΠ΄Π°ΠΌΠΈ.

Π’Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ Π³Ρ€Π°Ρ„ β€” прСкрасный ΠΏΡ€ΠΈΠΌΠ΅Ρ€ спСциализации ΠΏΡ€ΠΈ динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΌ языкС (ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° взята ΠΈΠ· Β«One VM to Rule Them AllΒ», 2013). ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° сущСствования этого процСсса тСсно связана с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ частичная ΠΎΡ†Π΅Π½ΠΊΠ° β€” всё Π΄Π΅Π»ΠΎ Π² спСциализации.

Π£Ρ€Π° JIT скомпилировал ΠΊΠΎΠ΄! Π”Π°Π²Π°ΠΉ скомпилируСм снова! И снова!

Π’Ρ‹ΡˆΠ΅ я ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π» ΠΏΡ€ΠΎ Β«ΠΌΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΡΡ‚ΡŒΒ», Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΡƒΠΆΠ΅ ΠΎΠ± этом ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ. ИдСя простая: Ссли ΠΌΡ‹ Π΅Ρ‰Ρ‘ Π½Π΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, Π½ΠΎ интСрпрСтация Π΄ΠΎ сих ΠΏΠΎΡ€ обходится Π΄ΠΎΡ€ΠΎΠ³ΠΎ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ, Π° Π·Π°Ρ‚Π΅ΠΌ Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΡƒΡŽ, ΠΊΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅ΠΌ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄.

Hotspot β€” это ΠΌΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ JIT с двумя компиляторами: C1 ΠΈ C2. C1 выполняСт Π±Ρ‹ΡΡ‚Ρ€ΡƒΡŽ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ ΠΈ запускаСт ΠΊΠΎΠ΄, Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ скомпилированный с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π‘2 ΠΊΠΎΠ΄. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΡ€ΠΎΠ³Ρ€Π΅Π²ΠΎΠΌ. НС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ скомпилированный ΠΊΠΎΠ΄ всё-Ρ€Π°Π²Π½ΠΎ быстрСС ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π‘1 ΠΈ Π‘2 ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ Π½Π΅ вСсь ΠΊΠΎΠ΄. Если функция выглядит достаточно просто, с большой Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ Π‘2 Π½Π°ΠΌ Π½Π΅ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ (Π΅Ρ‰Ρ‘ ΠΈ сэкономим врСмя Π½Π° ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ!). Если Π‘1 занят ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, Ρ‚ΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒΡΡ, Ρ€Π°Π±ΠΎΡ‚Π° Π‘1 Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Ρ€Π²Π°Π½Π° ΠΈ Π·Π°ΠΏΡƒΡ‰Π΅Π½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π‘2.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ jit компиляторы

Π’ JavaScript Core ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ Π΅Ρ‰Ρ‘ большС! П сути, Ρ‚Π°ΠΌ Ρ‚Ρ€ΠΈ JIT. Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ JSC выполняСт Π»Ρ‘Π³ΠΊΠΎΠ΅ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ Baseline JIT, Π·Π°Ρ‚Π΅ΠΌ ΠΊ DFG (Data Flow Graph) JIT, ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ† ΠΊ FTL (Faster than Light) JIT. Π‘ Ρ‚Π°ΠΊΠΈΠΌ количСством ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ смысл Π΄Π΅ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ большС Π½Π΅ ограничиваСтся ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠΌ ΠΎΡ‚ компилятора ΠΊ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ, дСоптимизация ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ начиная с DFG ΠΈ заканчивая Baseline JIT (это Π½Π΅ Ρ‚Π°ΠΊ Π² случаС Hotspot C2->C1). ВсС Π΄Π΅ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ OSR (замСщСния Π² стСкС).

Baseline JIT ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ послС 100 исполнСний, Π° DFG JIT β€” ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ послС 1000 (с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ). Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ JIT ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ скомпилированный ΠΊΠΎΠ΄ Π³ΠΎΡ€Π°Π·Π΄ΠΎ быстрСС, Ρ‡Π΅ΠΌ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Pypy (Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ это Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠΊΠΎΠ»ΠΎ 3000 исполнСний). ΠœΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΡΡ‚ΡŒ позволяСт JIT ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ соотнСсти Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ исполнСния ΠΊΠΎΠ΄Π° с Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ Π΅Π³ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. Π•ΡΡ‚ΡŒ ΠΊΡƒΡ‡Π° ΡƒΠ»ΠΎΠ²ΠΎΠΊ, ΠΊΠ°ΠΊΠΎΠΉ Π²ΠΈΠ΄ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ (ΠΈΠ½Π»Π°ΠΉΠ½ΠΈΠ½Π³, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² ΠΈ Ρ‚.Π΄.) ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ, ΠΈ поэтому такая стратСгия являСтся ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ.

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

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

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