Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ 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
Π Π½Π΅ΠΊΠΎΡΠΎΡΡΡ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ Π΄Π»Ρ Π±ΡΡΡΡΠΎΠ³ΠΎ ΠΏΠΎΠΈΡΠΊΠ° ΠΏΠΎ Π±ΠΎΠ»ΡΡΠΎΠΌΡ Π±ΠΈΡΠΎΠ²ΠΎΠΌΡ ΠΌΠ°ΡΡΠΈΠ²Ρ ΠΌΡ Π² 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 (ΠΈΠ½ΠΎΠ³Π΄Π° Π²ΡΡ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎ), Π½ΠΎ Π΅ΡΠ»ΠΈ Π·Π½Π°Ρ ΡΠΎΡΠ½ΠΎ, ΡΠΎ ΡΠΊΠ°ΠΆΡ Π½Π° ΡΡΠΎ. Π― ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Ρ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΊΠΎΠ΄Π°, ΡΡΠΎΠ±Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ, Π³Π΄Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ, Π½ΠΎ ΡΡΠΎ Π½Π΅ ΡΠΎΡΠ½ΠΎ, Π²Π΅Π΄Ρ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠ΄Π°Π½ Π΄ΡΡΠ³ΠΎΠΉ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ. ΠΠΎΠ³ΡΡ Π±ΡΡΡ ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ ΠΎΠ±ΡΠΈΠ΅ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΡ, Π½ΠΎ Π½Π΅ Π±ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ ΠΏΠΎΡΡΠΎΠ².
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ Π²Π΅Ρ ΠΈ
(ΠΠ΅ΡΠ°)ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠ°
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).
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-Π±ΡΠΊΠ΅Π½Π΄!). ΠΡΠΎ ΡΡΡΠ°Π½Π½ΠΎ, Π½ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ Π²Π·ΡΡΡ Ρ ΠΎΡΠΎΡΠΈΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΠΌΡΠ΅ ΡΠ·ΡΠΊ Ρ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ ΡΠΎΡΠΎΠΊΠ°Π»Π΅ΡΠ½Π΅ΠΉ ΠΈΡΡΠΎΡΠΈΠ΅ΠΉ, ΠΈ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ! ΠΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΎΠ½ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ ΡΠ°ΠΊ Π±ΡΡΡΡΠΎ, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π‘, Π½ΠΎ Π·Π°ΡΠΎ ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ².
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-ΠΏΠΎΡΠΎΠΊ Π²ΡΡΠ°Π½Π΅Ρ Π½Π° ΠΏΠ°ΡΠ·Ρ ΠΈ ΡΠΊΠ°ΠΆΠ΅Ρ: Β«ΠΡΠΈΠ²Π΅Ρ, ΡΠ±ΠΎΡΡΠΈΠΊ ΠΌΡΡΠΎΡΠ°, ΠΌΠ½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡΡ?Β», ΡΠ°ΠΊ ΡΡΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΏΠΎΡΠΎΠΊΠΎΠ² Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ Π±ΠΎΠ»ΡΡΠΈΡ Π½Π°ΠΊΠ»Π°Π΄Π½ΡΡ ΡΠ°ΡΡ ΠΎΠ΄ΠΎΠ². ΠΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π³ΡΡΠ±ΠΎ, Π½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π±ΡΡΡΡΠΎ, ΡΡΠΎΠ±Ρ Π΄Π΅ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΎΠΊΠ°Π·Π°Π»Π°ΡΡ Ρ ΠΎΡΠΎΡΠ΅ΠΉ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠ΅ΠΉ.
ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΡ Ρ ΠΌΠΎΡΡΠΈΠΊΠ°ΠΌΠΈ Π² Pypy, Π΄Π΅ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΠΏΠ°ΡΡΠΈΠ·Π°Π½ΡΠΊΠΈΠΉ ΠΏΠ°ΡΡΠΈΠ½Π³ (monkey patching) ΡΡΠ½ΠΊΡΠΈΠΉ. ΠΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΡΠ»Π΅Π³Π°Π½ΡΠ½Π΅Π΅, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π΄Π΅ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΡΡΡΠΈΠΉ ΠΊΠΎΠ΄ Π½Π΅ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π·Π°ΡΠΈΡΠ½ΠΈΠΊ ΡΠ΅ΡΠΏΠΈΡ Π½Π΅ΡΠ΄Π°ΡΡ, Π° ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΏΠ°ΡΡΠΈΠ·Π°Π½ΡΠΊΠΈΠΉ ΠΏΠ°ΡΡΠΈΠ½Π³.
ΠΠ°ΠΆΠ΅ Π½Π΅ ΠΏΠΎΡΠΌΠΎΡΡΠ΅Π² Π½Π° ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ, ΠΊΠ°ΠΊ ΠΊΠ°ΠΊ ΡΡΠ° Π΄Π΅ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΡΠΌΠ΅Π½ΡΡΠ°Π΅Ρ ΠΎΠ±ΡΡΠΌ ΠΊΠΎΠ΄Π°.
Π TruffleRuby Π΄Π΅ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΡΠΎΠ³ΠΎΠ½ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, ΡΠ°ΠΊ ΡΡΠΎ ΠΌΡ Π½Π΅ ΡΡΠ°ΡΠΈΠΌ Π½Π° ΡΡΠΎ ΡΠ΅ΡΡΡΡΡ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ.
WET-ΠΊΠΎΠ΄ β Π±ΡΡΡΡΡΠΉ ΠΊΠΎΠ΄. ΠΠ½Π»Π°ΠΉΠ½ΠΈΠ½Π³ ΠΈ OSR
ΠΡΠ²Π΅Ρ, Π΄ΡΡΠ³ ΠΌΠΎΠΉ, ΠΊΡΠΎΠ΅ΡΡΡ Π² Π·Π°ΠΌΠ΅ΡΠ΅Π½ΠΈΠΈ Π² ΡΡΠ΅ΠΊΠ΅ (on-stack replacement, OSR). ΠΠ½Π»Π°ΠΉΠ½ΠΈΠ½Π³ β ΡΡΠΎ ΠΌΠΎΡΠ½Π°Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° (Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ 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 ΠΏΠ°ΡΡΠ΅ΡΠΎΠ².
ΠΠ±ΡΡΠ½ΠΎ Ρ ΠΏΡΠΈΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ Β«ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ Π΄ΠΎΠΌΠ°!Β», Π½ΠΎ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ Π³ΡΠ°ΡΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΡΡΠ΄Π½ΠΎ, Ρ ΠΎΡΡ ΠΈ ΠΎΡΠ΅Π½Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ, Π° Π·Π°ΡΠ°ΡΡΡΡ ΠΈ ΠΊΡΠ°ΠΉΠ½Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΄Π»Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ°. Π―, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π΅ ΠΌΠΎΠ³Ρ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ Π²ΡΠ΅ Π³ΡΠ°ΡΠΈΠΊΠΈ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ·-Π·Π° Π½Π΅Ρ Π²Π°ΡΠΊΠΈ Π·Π½Π°Π½ΠΈΠΉ, Π½ΠΎ ΠΈ ΠΈΠ·-Π·Π° ΠΏΡΠ΅Π΄Π΅Π»ΠΎΠ² Π²ΡΡΠΈΡΠ»ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ ΠΌΠΎΠ΅Π³ΠΎ ΠΌΠΎΠ·Π³Π° (ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° ΠΌΠΎΠ³ΡΡ ΠΏΠΎΠΌΠΎΡΡ ΠΈΠ·Π±Π°Π²ΠΈΡΡΡΡ ΠΎΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΠ΅Π½Ρ Π½Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ΅Ρ).
ΠΠ°Π΄Π½ΠΎ, Π΄Π°Π²Π°ΠΉΡΠ΅ Π²Π·Π³Π»ΡΠ½Π΅ΠΌ Π½Π° JavaScript AST!
Π’Π°ΠΊ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ AST (Ρ ΡΠ±ΡΠ°Π» Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠ°Π»ΠΎΠ²Π°ΠΆΠ½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ):
ΠΠ°ΡΡΠΈΡΡ ΡΠ°ΠΊΠΎΠ΅ ΡΠ»ΠΎΠΆΠ½ΠΎ, Π½ΠΎ ΡΡΠΎ ΠΏΠΎΡ ΠΎΠΆΠ΅ Π½Π° AST ΠΏΠ°ΡΡΠ΅ΡΠ° (Π²Π΅ΡΠ½ΠΎ Π½Π΅ Π΄Π»Ρ Π²ΡΠ΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ). Π ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ AST ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Acorn.js
Π ΡΠ°ΠΊ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ AST ΡΠΎΠΉ ΠΆΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Graal!
ΠΡΠ³Π»ΡΠ΄ΠΈΡ ΠΊΡΠ΄Π° ΠΏΡΠΎΡΠ΅. ΠΡΠ°ΡΠ½ΡΠΌ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ ΠΏΠΎΡΠΎΠΊ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΡΠΈΠ½ΠΈΠΌ β ΠΏΠΎΡΠΎΠΊ Π΄Π°Π½Π½ΡΡ , ΡΡΡΠ΅Π»ΠΊΠ°ΠΌΠΈ β Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Ρ ΠΎΡΡ ΡΡΠΎΡ Π³ΡΠ°Ρ ΠΏΡΠΎΡΠ΅, ΡΠ΅ΠΌ 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.
Π 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 ΠΏΡΡΠ°ΡΡΡΡ ΡΠΎΠΎΡΠ½Π΅ΡΡΠΈ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π° Ρ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡΡ Π΅Π³ΠΎ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ. ΠΡΡΡ ΠΊΡΡΠ° ΡΠ»ΠΎΠ²ΠΎΠΊ, ΠΊΠ°ΠΊΠΎΠΉ Π²ΠΈΠ΄ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ (ΠΈΠ½Π»Π°ΠΉΠ½ΠΈΠ½Π³, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠΈΠΏΠΎΠ² ΠΈ Ρ.Π΄.) ΠΈΡΠΏΠΎΠ»Π½ΡΡΡ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΡΡΠΎΠ²Π½Π΅ΠΉ, ΠΈ ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ°ΠΊΠ°Ρ ΡΡΡΠ°ΡΠ΅Π³ΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ.