python компиляция Π² Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄

ΠŸΠΎΠ³Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΡƒΡ‡ΠΈΠ½Ρƒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Python. Π§1

python компиляция Π² Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄. d2daf8a6bfba4e1e85de156f18f835e8. python компиляция Π² Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄ Ρ„ΠΎΡ‚ΠΎ. python компиляция Π² Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄-d2daf8a6bfba4e1e85de156f18f835e8. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° python компиляция Π² Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° d2daf8a6bfba4e1e85de156f18f835e8. ΠžΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°: НавСрно всСм интСрСсно, Ρ‡Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρƒ инструмСнта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΡˆΡŒ, этот интСрСс ΠΎΠ²Π»Π°Π΄Π΅Π» ΠΈ ΠΌΠ½ΠΎΠΉ, Π½ΠΎ Π³Π»Π°Π²Π½ΠΎΠ΅ Π½Π΅ ΡƒΡ‚ΠΎΠΏΠ°Ρ‚ΡŒ Π² Π½Ρ‘ΠΌ ΠΈ Π½Π΅ Π·Π°ΠΊΠΎΠΏΠ°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π΅ Π²Ρ‹Π»Π΅Π·Ρ‚ΠΈ. Найдя для сСбя интСрСсный ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π», я Ρ€Π΅ΡˆΠΈΠ» Π·Π°Π±ΠΎΡ‚Π»ΠΈΠ²ΠΎ пСрСвСсти Π΅Π³ΠΎ ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ хабросообщСству (моя пСрвая публикация, ΠΏΡ€ΠΎΡˆΡƒ Π½ΠΎΠ³Π°ΠΌΠΈ сильно Π½Π΅ ΠΏΠΈΠ½Π°Ρ‚ΡŒ). Π’Π΅ΠΌ, ΠΊΠΎΠΌΡƒ интСрСсСн ΠΊΠ°ΠΊ Python Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° самом Π΄Π΅Π»Π΅, ΠΏΡ€ΠΎΡˆΡƒ ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚.

ΠžΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°: НавСрно всСм интСрСсно, Ρ‡Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρƒ инструмСнта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΡˆΡŒ, этот интСрСс ΠΎΠ²Π»Π°Π΄Π΅Π» ΠΈ ΠΌΠ½ΠΎΠΉ, Π½ΠΎ Π³Π»Π°Π²Π½ΠΎΠ΅ Π½Π΅ ΡƒΡ‚ΠΎΠΏΠ°Ρ‚ΡŒ Π² Π½Ρ‘ΠΌ ΠΈ Π½Π΅ Π·Π°ΠΊΠΎΠΏΠ°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π΅ Π²Ρ‹Π»Π΅Π·Ρ‚ΠΈ. Найдя для сСбя интСрСсный ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π», я Ρ€Π΅ΡˆΠΈΠ» Π·Π°Π±ΠΎΡ‚Π»ΠΈΠ²ΠΎ пСрСвСсти Π΅Π³ΠΎ ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ хабросообщСству (моя пСрвая публикация, ΠΏΡ€ΠΎΡˆΡƒ Π½ΠΎΠ³Π°ΠΌΠΈ сильно Π½Π΅ ΠΏΠΈΠ½Π°Ρ‚ΡŒ). Π’Π΅ΠΌ, ΠΊΠΎΠΌΡƒ интСрСсСн ΠΊΠ°ΠΊ Python Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° самом Π΄Π΅Π»Π΅, ΠΏΡ€ΠΎΡˆΡƒ ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚.

ПослСдниС Ρ‚Ρ€ΠΈ мСсяца я ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΠ» ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° byterun, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ питоновского Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π°, написанного Π½Π° ΠΏΠΈΡ‚ΠΎΠ½Π΅. Π Π°Π±ΠΎΡ‚Π° Π½Π°Π΄ этим ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ Π±Ρ‹Π»Π° для мСня Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰Π΅ вСсёлой ΠΈ ΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ. Π― Π±Ρ‹Π» Π±Ρ‹ Ρ€Π°Π΄, Ссли Π±Ρ‹ Π²Ρ‹ Ρ‚ΠΎΠΆΠ΅ Π΅Π³ΠΎ ΠΏΠΎΡ‚Ρ‹ΠΊΠ°Π»ΠΈ. Но ΠΏΡ€Π΅ΠΆΠ΄Π΅ Π½Π°ΠΌ Π½Π°Π΄ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ остСпСнится, ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ python, Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ Π·Π½Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Π½Π° самом Π΄Π΅Π»Π΅ ΠΈ с Ρ‡Π΅ΠΌ Π΅Π³ΠΎ Сдят.

Π― ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°ΡŽ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ сСйчас Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΠΈ я Ρ‚Ρ€ΠΈ мСсяца Π½Π°Π·Π°Π΄. Π’Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅ python, Π½ΠΎ понятия Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ ΠΊΠ°ΠΊ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

НСбольшая Π·Π°ΠΌΠ΅Ρ‚ΠΊΠ°: Π― Ρ€Π°Π±ΠΎΡ‚Π°ΡŽ с вСрсиСй 2.7 Π² этом постС. Π’Ρ€Π΅Ρ‚ΡŒΡ вСрсия ΠΏΠΎΡ‡Ρ‚ΠΈ схоТа со Π²Ρ‚ΠΎΡ€ΠΎΠΉ, Π΅ΡΡ‚ΡŒ нСбольшиС различия Π² синтаксисС ΠΈ наимСнованиях, Π½ΠΎ Π² Ρ†Π΅Π»ΠΎΠΌ всё Ρ‚ΠΎΠΆΠ΅ самоС.

Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ python?

ΠœΡ‹ Π½Π°Ρ‡Π½Ρ‘ΠΌ с ΠΎΡ‡Π΅Π½ΡŒ (ΠΎΡ‡Π΅Π½ΡŒ ΠΎΡ‡Π΅Π½ΡŒ) высокого уровня Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π§Ρ‚ΠΎ происходит ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ выполняСтС ΠΊΠΎΠ΄ Π² вашСм ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π΅?

Π“ΠΎΠ΄Ρ‹ ΠΈΠ΄ΡƒΡ‚, лСдянки Ρ‚Π°ΡŽΡ‚, Линус Π’ΠΎΡ€Π²Π°Π»ΡŒΠ΄Ρ ΠΏΠΈΠ»ΠΈΡ‚ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ΅ ядро, Π° 64 Π±ΠΈΡ‚Ρ‹ΠΉ процСссор Π±Π΅Π· устали трудится, Ρ‚Π΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ происходит Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ шага: лСксичСской Π°Π½Π°Π»ΠΈΠ·, парсинг, компиляция ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ† Ρ‚Π°ΠΊΠΈ интСрпрСтация. ΠŸΠ°Ρ€ΡΠ΅Ρ€ Π·Π°Π±ΠΈΡ€Π°Π΅Ρ‚ скормлСнныС Π΅ΠΌΡƒ инструкции ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ структуру которая ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ ΠΈΡ… связь формируя AST( АбстрактноС БинтаксичСскоС Π”Π΅Ρ€Π΅Π²ΠΎ). ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ AST Π² ΠΎΠ΄Π½ΠΈ (ΠΈΠ»ΠΈ нСсколько) ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΊΠΎΠ΄Π° (Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ + обвязка). ΠŸΠΎΡ‚ΠΎΠΌ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ выполняСт ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

Π― Π½Π΅ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎΠ± лСксичСском Π°Π½Π°Π»ΠΈΠ·Π΅, парсингС ΠΈΠ»ΠΈ компиляции сСгодня, Π½Π°Π²Π΅Ρ€Π½ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ я сам ΠΏΡ€ΠΎ эти Π²Π΅Ρ‰ΠΈ Π½ΠΈ Ρ‡Π΅Π³ΠΎ Π½Π΅ знаю, Π½ΠΎ Π½Π΅ ΡƒΠ½Ρ‹Π²Π°ΠΉΡ‚Π΅: Π²Ρ‹ всСгда смоТСтС ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ это, ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΠ² часов этак ΠΏΡΡ‚ΡŒΠ΄Π΅ΡΡΡ‚. ΠœΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ эти шаги ΠΏΡ€ΠΎΡˆΠ»ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, ΠΈ Ρƒ нас Π΅ΡΡ‚ΡŒ Π½Π° Ρ€ΡƒΠΊΠ°Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ python ΠΊΠΎΠ΄Π°.

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ Π΄Π΅Π»Ρƒ, я Ρ…ΠΎΡ‡Ρƒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ€Π΅ΠΌΠ°Ρ€ΠΊΡƒ: Π² Π΄Π°Π½Π½ΠΎΠΌ Ρ‚ΠΎΠΏΠΈΠΊΠ΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎΠ± ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… функциях, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… ΠΊΠΎΠ΄Π°, ΠΈ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π΅. Π­Ρ‚ΠΎ всё Ρ€Π°Π·Π½Ρ‹Π΅ Π²Π΅Ρ‰ΠΈ. Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Ρ‡Π½Ρ‘ΠΌ с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Нам Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²Π½ΠΈΠΊΠ°Ρ‚ΡŒ Π³Π»ΡƒΠ±ΠΎΠΊΠΎ Π² Π½ΠΈΡ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π΄ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°, Π½ΠΎ я просто Ρ…ΠΎΡ‡Ρƒ ΠΏΡ€ΠΎΡΡΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΊΠΎΠ΄Π° β€” это Π΄Π²Π΅ большиС Ρ€Π°Π·Π½ΠΈΡ†Ρ‹, Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” самыС интСрСсныС.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π’Ρ‹ Π½Π°Π²Π΅Ρ€Π½ΠΎ ΠΌΠΎΠ³Π»ΠΈ ΡΠ»Ρ‹ΡˆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎ Β«ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΒ». Π­Ρ‚ΠΎ Π²Π΅Ρ‰ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ люди ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°ΡŽΡ‚ ΠΊΠΎΠ³Π΄Π° говорят: Β«Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса». Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΈΠ·ΡƒΡ‡ΠΈΠΌ ΠΈΡ… ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅:

Β«Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса» ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ список это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ»ΠΈ экзСмпляры MyObject это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. Π Π°Π· foo это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π΅Π³ΠΎ Π½Π΅ выполняя Π΅Π³ΠΎ (Π² этом ΠΈ Π΅ΡΡ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ foo() ΠΈ foo). ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅Π΄Π°Ρ‚ΡŒ foo ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ посмотрим Π½Π° foo ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅ΠΉ:

Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠΎΠ΄Π° это Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠΎΠ΄Π° гСнСрируСтся питоновским компилятором ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ, ΠΎΠ½ содСрТит ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°. Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊΠΎΠ΄Π°:

Π—Π΄Π΅ΡΡŒ цСлая ΠΊΡƒΡ‡Π° Π½ΠΈΡˆΡ‚ΡΠΊΠΎΠ², Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½ΠΌ сСйчас Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ рассмотрим Ρ‚Ρ€ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° foo.

Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ здСсь Π΅ΡΡ‚ΡŒ: ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ констант ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ количСство ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΡ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Но ΠΌΡ‹ всё Π΅Ρ‰Ρ‘ Π½Π΅ Π²ΠΈΠ΄ΠΈΠΌ Π½ΠΈ Ρ‡Π΅Π³ΠΎ Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° инструкции. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ΠΎΠΌ ссылка, кстати это Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊΠΎΠ΄Π°:

Напоминаю Ρ‡Ρ‚ΠΎ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΊΠΎΠ΄Π° это Π½Π΅ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎΠΆΠ΅. Π‘Π°ΠΉΡ‚ΠΊΠΎΠ΄ это Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊΠΎΠ΄Π° ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ². Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Ρ‚Π°ΠΊΠΎΠ΅ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄? Ну это просто Π½Π°Π±ΠΎΡ€ Π±Π°ΠΉΡ‚. Они выглядят странно ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΈΡ… ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π±Π°ΠΉΡ‚ΠΎΠΌ сопоставимы символы Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π½Π΅Ρ‚, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π²Ρ‹Π²Π΅Π΄Π΅ΠΌ ΠΈΡ… ΠΊΠ°ΠΊ числа.

Π’ΠΎΡ‚ Π±Π°ΠΉΡ‚Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ творят всю магию. Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈ бСзустанно Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ Π±Π°ΠΉΡ‚Ρ‹, ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠ½ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΈ с ΠΊΠ°ΠΊΠΈΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΉΡ‚ΠΈ Π΅Ρ‰Ρ‘ дальшС ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ исходный ΠΊΠΎΠ΄ Cpython Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ ceval.c Ρ‡Ρ‚ΠΎ ΠΌΡ‹ сдСлаСм ΠΏΠΎΠ·Π΄Π½Π΅Π΅.

ДизассСмблированиС Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π°

ДизассСмблированиС ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π²Π·ΡΡ‚ΡŒ всС эти Π±Π°ΠΉΡ‚Ρ‹ ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π²ΠΎ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΈ способны ΠΏΠΎΠ½ΡΡ‚ΡŒ. Π­Ρ‚ΠΎ Π½Π΅ выполняСтся Π² стандартном Ρ†ΠΈΠΊΠ»Π΅ ΠΏΠΈΡ‚ΠΎΠ½Π°. БСгодня для этой Π·Π°Π΄Π°Ρ‡ΠΈ Π΅ΡΡ‚ΡŒ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ инструмСнт β€” ΠΌΠΎΠ΄ΡƒΠ»ΡŒ dis. ΠœΡ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ dis.dis Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ наша foo.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ это строка исходного python ΠΊΠΎΠ΄Π°, Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π½ΠΎΠΌΠ΅Ρ€ это смСщСниС Π²Π½ΡƒΡ‚Ρ€ΠΈ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π°: LOAD_CONST находится Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 0, Π° STORE_FAST Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 3 ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. БрСдняя ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° это Π½Π°Π·Π²Π°Π½ΠΈΠ΅ самой инструкции, послСдниС Π΄Π²Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ Π΄Π°ΡŽΡ‚ понятиС ΠΎΠ± Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ… инструкции (Π΅Π»ΠΈ ΠΎΠ½ΠΈ Π΅ΡΡ‚ΡŒ), чСтвСртая ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ сам Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт собой индСкс Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊΠΎΠ΄Π°. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ для LOAD_CONST это индСкс Π² спискС co_consts, Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ для STORE_FAST это индСкс Π² co_varnames, Π² пятой ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅ выводятся ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ констант. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ с Π»Π΅Π³ΠΊΠΎΡΡ‚ΡŒΡŽ это ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ:

Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ Π²Ρ‚ΠΎΡ€ΡƒΡŽ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ STORE_FAST которая находится ΠΏΠΎ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 3 Π² Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π΅. Если инструкция ΠΈΠΌΠ΅Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π° Π±Π°ΠΉΡ‚Π° ΠΈ Π΅ΡΡ‚ΡŒ этот Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚. Π Π°Π±ΠΎΡ‚Π° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° ΠΊΠ°ΠΊ Ρ€Π°Π· Ρ‚Π°ΠΊΠΈ Π² Ρ‚ΠΎΠΌ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ запутаСтся ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ ΡΠ΅ΡΡ‚ΡŒ Ρ€Π°Π·ΡƒΠΌΠ½ΠΎΠ΅, Π΄ΠΎΠ±Ρ€ΠΎΠ΅, Π²Π΅Ρ‡Π½ΠΎΠ΅. (Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ BINARY_ADD Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π½Π΅ Π²ΠΎΠ»Π½ΡƒΠΉΡ‚Π΅ΡΡŒ ΠΌΡ‹ Π΅Ρ‰Ρ‘ вСрнСмся ΠΊ этому)

Π‘Ρ‹Π»Π° ΠΎΠ΄Π½Π° вСшь которая удивляла мСня ΠΊΠΎΠ³Π΄Π° я Π½Π°Ρ‡Π΅Π» Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ python, ΠΊΠ°ΠΊ python ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ динамичСским, Ссли ΠΎΠ½ Π΅Ρ‰Ρ‘ ΠΈ «компилируСтся»? ΠžΠ±Ρ‹Ρ‡Π½ΠΎ эти Π΄Π²Π° слова Β«Π°Π½Ρ‚ΠΎΠ½ΠΈΠΌΡ‹Β», Π΅ΡΡ‚ΡŒ динамичСскиС языки Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Python, Ruby, ΠΈ Javascript, Π° Π΅ΡΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ Ρ‚Π°ΠΊΠΈ ΠΊΠ°ΠΊ C, Java, ΠΈ Haskell.

Когда люди говорят ΠΎΠ± ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… языках ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Π²Π²ΠΈΠ΄Ρƒ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ Π² Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ x86/ARM/etc инструкции. Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ язык Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ компиляции Π²ΠΎΠΎΠ±Ρ‰Π΅, Ρ€Π°Π·Π²Π΅ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ «компилируСтся» Π½Π° Π»Π΅Ρ‚Ρƒ Π² Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄. Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ ΠΏΠΈΡ‚ΠΎΠ½Π° Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ ΠΈ выполняСт Π΅Π³ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, Ρ‡Ρ‚ΠΎ кстати достаточно ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹, Π½ΠΎ ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎΠ± этом ΠΏΠΎΠ·Π΄Π½Π΅Π΅.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ динамичСским Π½Π°Π΄ΠΎ Π±Ρ‹Ρ‚ΡŒ абстрактным, Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Ρ‡Ρ‚ΠΎ это Π·Π½Π°Ρ‡ΠΈΡ‚:

Π­Ρ‚Π° дизассСмблированая функция Π² Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π΅. К Ρ‚ΠΎΠΌΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΠ΅ функция modus Π±Ρ‹Π»Π° скомпилирована ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠΎΡ€Π΄Π° Π±Ρ‹Π» сгСнСрирован. Достаточно Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ, Π½ΠΎ опСрация остатка ΠΎΡ‚ дСлСния % (опСрация modulus) прСобразуСтся Π² BINARY_MODULO. ΠŸΠΎΡ…ΠΎΠΆΠ΅ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для чисСл:

НСплохо, Π° Ρ‡Ρ‚ΠΎ Ссли ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ строку.

Опана, Ρ‡Ρ‚ΠΎ это Ρ‚ΡƒΡ‚? Π’Ρ‹ Π½Π°Π²Π΅Ρ€Π½ΠΎ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ это Ρ€Π°Π½ΡŒΡˆΠ΅:

Когда опСрация BINARY_MODULO выполняСтся для Π΄Π²ΡƒΡ… строк ΠΎΠ½Π° выполняСт подстановку строк вмСсто остатка ΠΎΡ‚ дСлСния. Π­Ρ‚Π° ситуация ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ динамичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ. Когда компилятор Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠΎΠ΄Π° для modulus ΠΎΠ½ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ понятия Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ x ΠΈ y, строки Π»ΠΈ ΠΎΠ½ΠΈ ΠΈΠ»ΠΈ числа ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Ρ‘. Он просто выполняСт инструкции: Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π΅Π½Π½ΡƒΡŽ, Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΡƒΡŽ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€Π΅ΠΏΠ°Ρ€Π°Ρ†ΠΈΡŽ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ модуля, Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Π Π°Π±ΠΎΡ‚Π° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Π² Ρ‚ΠΎΠΌ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ BINARY_MODULO Π·Π½Π°Ρ‡ΠΈΡ‚ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ контСкстС. Наша функция modulus ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ остаток, ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ строки… ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Ρ‘? Если ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ класс с ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ __mod__ Ρ‚ΠΎ ΠΌΡ‹ смоТСм ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ.

Одна ΠΈ Ρ‚Π° ΠΆΠ΅ функция с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π² зависимости ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° контСкста. Π’Π°ΠΊΠΆΠ΅ функция modulus ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π±ΡƒΠ΄ΠΈΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° TypeError Ссли ΠΌΡ‹ Π²Ρ‹Π·ΠΎΠ²Π΅ΠΌ Π΅Π³ΠΎ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹.

Π­Ρ‚ΠΎ являСтся ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΏΡ€ΠΈΡ‡ΠΈΠ½ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ python. Π’Ρ‹ Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΊΠΎΠ΄ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎ Π·Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅. Russell Power ΠΈ Alex Rubinsteyn написали ΡΡ‚Π°Ρ‚ΡŒΡŽ Β«ΠΊΠ°ΠΊ быстр ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ pythonΒ», это ΡΡ‚Π°Ρ‚ΡŒΡ достаточного ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ.

На сСгодня ΠΏΠΎΠΊΠ° всС. ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π» ΡΡ‚Π°Ρ‚ΡŒΠΈ Ρ‚ΡƒΡ‚. ΠŸΡ€ΠΎΡˆΡƒ ΠΏΡ€ΠΎΡˆΠ΅Π½ΠΈΡ Π·Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ошибки Ρ‚.ΠΊ. ΠΎΡ‚ ΠΏΡ€ΠΈΡ€ΠΎΠ΄Ρ‹ обладаю Π²Ρ€ΠΎΠΆΠ΄Ρ‘Π½Π½ΠΎΠΉ Π±Π΅Π·Π³Ρ€Π°ΠΌΠΎΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈ Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΌ способом ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ тСкста.

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

Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ прСобразования ΠΊΠΎΠ΄Π° Π½Π° Python

БСгодня ΠΌΡ‹ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌ Π²Π°ΠΌ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΡΡ‚Π°Ρ‚ΡŒΠΈ, Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ Π½Π΅ ΡΠ°ΠΌΡƒΡŽ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π΅ΠΌΡƒΡŽ Ρ‚Π΅ΠΌΡƒ: ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ ΠΊΠΎΠ΄Π° Π² Python, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ: Ρ€Π°Π±ΠΎΡ‚Ρƒ с абстрактным синтаксичСским Π΄Π΅Ρ€Π΅Π²ΠΎΠΌ (AST) ΠΈ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ΠΎΠΌ. ΠŸΡ€ΠΈΡ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Python являСтся ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ языком, Ρ‚Π°ΠΊΠΈΠ΅ возмоТности Π² Π½Π΅ΠΌ Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ Π²Π°ΠΆΠ½Ρ‹ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. О Π½ΠΈΡ… ΠΌΡ‹ сСгодня ΠΈ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ.

Π’Ρ‹ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Π»ΠΈΡΡŒ, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ компилятор ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ваш ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π» быстрСС? Π₯ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ абстрактноС синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ (AST) ΠΈ для Ρ‡Π΅Π³ΠΎ ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ?

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

Код ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΊΠ°ΠΊ Π΄Π΅Ρ€Π΅Π²ΠΎ

Как ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρƒ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ вычисляСт выраТСния ΠΈΠ· вашСго ΠΊΠΎΠ΄Π° Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ порядкС?
Для этого ΠΎΠ½ сначала ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΠ΄ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Π΄Ρ€Π΅Π²ΠΎΠ²ΠΈΠ΄Π½ΡƒΡŽ структуру ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ AST.

python компиляция Π² Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄. image loader. python компиляция Π² Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄ Ρ„ΠΎΡ‚ΠΎ. python компиляция Π² Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄-image loader. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° python компиляция Π² Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° image loader. ΠžΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°: НавСрно всСм интСрСсно, Ρ‡Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρƒ инструмСнта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΡˆΡŒ, этот интСрСс ΠΎΠ²Π»Π°Π΄Π΅Π» ΠΈ ΠΌΠ½ΠΎΠΉ, Π½ΠΎ Π³Π»Π°Π²Π½ΠΎΠ΅ Π½Π΅ ΡƒΡ‚ΠΎΠΏΠ°Ρ‚ΡŒ Π² Π½Ρ‘ΠΌ ΠΈ Π½Π΅ Π·Π°ΠΊΠΎΠΏΠ°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π΅ Π²Ρ‹Π»Π΅Π·Ρ‚ΠΈ. Найдя для сСбя интСрСсный ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π», я Ρ€Π΅ΡˆΠΈΠ» Π·Π°Π±ΠΎΡ‚Π»ΠΈΠ²ΠΎ пСрСвСсти Π΅Π³ΠΎ ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ хабросообщСству (моя пСрвая публикация, ΠΏΡ€ΠΎΡˆΡƒ Π½ΠΎΠ³Π°ΠΌΠΈ сильно Π½Π΅ ΠΏΠΈΠ½Π°Ρ‚ΡŒ). Π’Π΅ΠΌ, ΠΊΠΎΠΌΡƒ интСрСсСн ΠΊΠ°ΠΊ Python Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° самом Π΄Π΅Π»Π΅, ΠΏΡ€ΠΎΡˆΡƒ ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚.

Π’ Python ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ стандартныС ΠΏΡ€Π°Π²ΠΈΠ»Π° матСматичСской Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ (сначала ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π·Π°Ρ‚Π΅ΠΌ слоТСниС). Π§Ρ‚ΠΎΠ±Ρ‹ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΏΡƒΡ‚Π°Ρ‚ΡŒ с ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², Π² Python сначала строится ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ, ΠΊΠ°ΠΊ Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅. ΠžΠ±Ρ‰Π°Ρ опСрация – это слоТСниС (Ρƒ корня Π΄Π΅Ρ€Π΅Π²Π°), ΠΈ, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ лСвая Ρ‡Π°ΡΡ‚ΡŒ этой суммы прСдставляСт собой ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ число, справа ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅. Π Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ структура Π΄Π°Π½Π½Ρ‹Ρ… выглядит Ρ‚Π°ΠΊ:

BinOp ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Binary Operation (Бинарная опСрация) ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² Ρ‚Π°ΠΊΠΈΡ… опСрациях ΠΊΠ°ΠΊ слоТСниС ΠΈ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ – ΠΏΠΎ Π΄Π²Π° ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°. ЕстСствСнно, Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ слоТСния Ρƒ вас Π½Π΅ получится, Ссли Π² ΠΏΡ€Π°Π²ΠΎΠΉ части выраТСния Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ значСния – поэтому сначала Π½ΡƒΠΆΠ½ΠΎ произвСсти ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅.

Однако Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π² AST, сгСнСрированном Python, Π±ΡƒΠ΄ΡƒΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΡƒΠ·Π»Ρ‹ ΠΈ поля, Π° Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π² ΠΎΠ΄Π½Ρƒ строку, ΠΈΠ·-Π·Π° Ρ‡Π΅Π³ΠΎ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд ΠΎΠ½ΠΎ каТСтся слоТнСС, Ρ‡Π΅ΠΌ Π΅ΡΡ‚ΡŒ Π½Π° самом Π΄Π΅Π»Π΅.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π°Π·ΠΎΠ±ΡŒΠ΅ΠΌ Π΅Π³ΠΎ Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΡƒΠ·Π»Ρ‹, ΠΊΠ°ΠΊ ΠΈ Π² ΠΏΡ€ΠΎΡˆΠ»Ρ‹ΠΉ Ρ€Π°Π· – ΠΈ Π·Π°Π½ΠΎΠ²ΠΎ ΠΎΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ AST, ΡƒΠΆΠ΅ свСрху, ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ всСго Π΄Π΅Ρ€Π΅Π²Π°:

ΠŸΡ€ΠΎΡ†Π΅ΡΡ компиляции: ΠΎΡΡ‚Π°Π²ΡˆΠ°ΡΡΡ Ρ‡Π°ΡΡ‚ΡŒ

Π˜Π½Ρ‹ΠΌΠΈ словами, процСсс компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, написанной Π½Π° Python, ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π² Π΄Π²Π° этапа. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, получСнная Π½Π° Π²Ρ…ΠΎΠ΄, ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ парсинг, ΠΈ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ получаСтся абстрактноС синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ (AST). Π—Π°Ρ‚Π΅ΠΌ компилятор ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ AST ΠΈ ΠΏΡ€ΠΈ этом Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄. ПослС Ρ‡Π΅Π³ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Python выполняСт этот Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄. Π’Π·ΡΠ²ΡˆΠΈΡΡŒ Π·Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ, Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ AST, ΠΈΠ»ΠΈ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°. Обоим этим Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°ΠΌ свойствСнны собствСнныС достоинства ΠΈ нСдостатки.

НаконСц, Π½ΡƒΠΆΠ½ΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ, хотя, AST Π² любой Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Python являСтся ΠΎΠ±Ρ‰Π΅ΠΉ, процСсс трансляции AST Π² Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ, ΠΈ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… рСализациях Python Π½Π° ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠΌ этапС ΠΌΠΎΠΆΠ΅Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ, скаТСм, JavaScript, Π° Π½Π΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄.

ΠŸΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡ‹ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… языков программирования

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡƒΠ·Π»Π° Π²Π½ΡƒΡ‚Ρ€ΠΈ AST

ИмСя AST ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠ°ΠΊ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ части этого Π΄Π΅Ρ€Π΅Π²Π°? ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΡƒΠ΄ΠΎΠ±Π½Ρ‹Ρ… встроСнных возмоТностСй Python.

ΠΠ΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ поля, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΡƒΠ·Π»Π° Π² исходном ΠΊΠΎΠ΄Π΅, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ довольно часто. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ ast Π΅ΡΡ‚ΡŒ выдСлСнная функция copy_location ΠΊΠ°ΠΊ Ρ€Π°Π· для этой Ρ†Π΅Π»ΠΈ, ΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ:

ΠšΡΡ‚Π°Ρ‚ΠΈ, компилятор CPython ΡƒΠΆΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΡƒΠ·Π»Ρ‹ BinOp Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ здСсь. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ написан Π½Π° C ΠΈ приводится Π² Python/ast_opt.c. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€ CPython Π±ΠΎΠ»Π΅Π΅ унивСрсалСн ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с числами, ΠΊΠ°ΠΊ Π² рассматриваСмом Π½Π°ΠΌΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Π½ΠΎ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ константных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΡƒΠ·Π»ΠΎΠ² Π² AST

Как ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ сдСланныС Π½Π°ΠΌΠΈ прСобразования Π±Ρ‹Π»ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌΠΈ? Для Π½Π°Ρ‡Π°Π»Π° Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ AST ΠΈ ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ всю ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ повСдСния Π²Ρ‹ ΠΈ добивались, дСлая pi истинной константной, которая замСняСтся ΠΏΡ€ΠΈ компиляции ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ пСрСприсвоСна, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Однако это, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ, Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ сСмантику Python.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΡƒΠ·Π΅Π» ΠΏΠΎΡΠ΅Ρ‚ΠΈΡ‚Π΅Π»ΡŒ, ΠΏΠΎΡ…ΠΎΠΆΠΈΠΉ Π½Π° ΡƒΠ·Π΅Π»-ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, описанный Π²Ρ‹ΡˆΠ΅. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ прСобразоватСля, ΠΏΠΎΡΠ΅Ρ‚ΠΈΡ‚Π΅Π»ΡŒ Π½Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для измСнСния ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΡƒΠ·Π»ΠΎΠ², ΠΎΠ½ просто ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ AST ΠΈ осматриваСт ΡƒΠ·Π»Ρ‹ (посСщаСт ΠΈΡ…). БоотвСтствСнно, Π²ΠΈΠ·ΠΈΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚.

Π’ нашСм случаС ΠΌΡ‹ провСряСм, ссылаСтся Π»ΠΈ ΡƒΠ·Π΅Π» Name Π½Π° pi ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ Π»ΠΈ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ ΠΊΡ€ΠΎΠΌΠ΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ значСния pi (ΠΏΠΎΠΌΠ½ΠΈΠΌ ΠΎ ΠΏΠΎΠ»Π΅ контСкста ctx ).

Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ значСния Π² Python

Наш ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ» Π»ΠΈ программист Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ pi, получился довольно Π³Ρ€ΡƒΠ±Ρ‹ΠΌ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, компилятор Python дСйствуСт вСсьма схоТим ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° опрСдСляСт, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π° Π² области видимости Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ. Если пСрСмСнная измСняСтся Π³Π΄Π΅-Π»ΠΈΠ±ΠΎ Π² области видимости Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (ΠΈ явно Π½Π΅ сдСлана глобальной, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ инструкции global), Ρ‚ΠΎ эта пСрСмСнная считаСтся локальной Π²ΠΎ всСй области видимости Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ выполнится ΠΈ Π±Π΅Π· Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠΉ строки. Но, хотя x = 0 Π² Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠΉ строкС Π½ΠΈΠΊΠΎΠ³Π΄Π° ΠΈ Π½Π΅ выполняСтся, это всС Ρ€Π°Π²Π½ΠΎ считаСтся присваиваниСм ΠΊ x ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, x становится локальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² ΠΌΠ°ΡΡˆΡ‚Π°Π±Π°Ρ… всСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈ Π΄Π°ΠΆΠ΅ Π² строкС 3. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Python Π±ΡƒΠ΄Π΅Ρ‚ Ρ€ΡƒΠ³Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ пСрСмСнная x Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ строкС Π΅Ρ‰Π΅ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния.

Если вас ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‚ подробности, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ здСсь Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Python, посмотритС Python/symtable.c.

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

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

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

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

ΠŸΠΎΡ‡Π΅ΠΌΡƒ сущСствуСт Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ ΠŸΠΈΡ‚ΠΎΠ½ΠΎΠ²?

Π£Π΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π½ΠΎ это довольно Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΠ΅ заявлСниС. Π§Ρ‚ΠΎ я имСю Π²Π²ΠΈΠ΄Ρƒ ΠΏΠΎΠ΄ β€œΠŸΠΈΡ‚ΠΎΠ½ΠΎΠΌβ€? ΠœΠΎΠΆΠ΅Ρ‚, абстрактный интСрфСйс ΠŸΠΈΡ‚ΠΎΠ½Π°? Или CPython, распространСнная рСализация ΠŸΠΈΡ‚ΠΎΠ½Π° (Π½Π΅ ΠΏΡƒΡ‚Π°Ρ‚ΡŒ с ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌ ΠΏΠΎ названию Cython)? Или я имСю Π²Π²ΠΈΠ΄Ρƒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ совсСм ΠΈΠ½ΠΎΠ΅? ΠœΠΎΠΆΠ΅Ρ‚, я косвСнно ΡΡΡ‹Π»Π°ΡŽΡΡŒ Π½Π° Jython, ΠΈΠ»ΠΈ IronPython, ΠΈΠ»ΠΈ PyPy. Или ΠΌΠΎΠΆΠ΅Ρ‚ я отвлСкся Ρ‚Π°ΠΊ сильно, Ρ‡Ρ‚ΠΎ Π³ΠΎΠ²ΠΎΡ€ΡŽ ΠΎ RPython ΠΈΠ»ΠΈ RubyPython (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‡Π΅Π½ΡŒ сильно ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ).

НС смотря Π½Π° ΡΡ…ΠΎΠΆΠ΅ΡΡ‚ΡŒ Π² названиях ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… ΠΈΠΌΠ΅ΡŽΡ‚ совсСм Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ (ΠΈΠ»ΠΈ, ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΠΈΠ½Ρ‹ΠΌΠΈ способами)

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠŸΠΈΡ‚ΠΎΠ½ΠΎΠΌ я столкнулся с ΠΊΡƒΡ‡Π΅ΠΉ Ρ‚Π°ΠΊΠΈΡ… Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ. Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ *ython. Но лишь Π½Π΅Π΄Π°Π²Π½ΠΎ я ΡƒΠ΄Π΅Π»ΠΈΠ» врСмя, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ собой ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ½ΠΈ (каТдая ΠΏΠΎ-своСму) Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹.

Π’ этом постС я Π½Π°Ρ‡Π½Ρƒ с нуля ΠΈ ΠΏΡ€ΠΎΠΉΠ΄ΡƒΡΡŒ ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ рСализациям ΠŸΠΈΡ‚ΠΎΠ½Π°, Π° Π·Π°ΠΊΠΎΠ½Ρ‡Ρƒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΌ Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Π² PyPy, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ, ΠΏΠΎ ΠΌΠΎΠ΅ΠΌΡƒ мнСнию, Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅ языка.

ВсС начинаСтся с понимания Ρ‚ΠΎΠ³ΠΎ, Ρ‡Π΅ΠΌ Π½Π° самом Π΄Π΅Π»Π΅ являСтся β€œΠŸΠΈΡ‚ΠΎΠ½β€.

Если Ρƒ вас Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ машинного ΠΊΠΎΠ΄Π°, Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ этот Ρ€Π°Π·Π΄Π΅Π».

ΠŸΠΈΡ‚ΠΎΠ½ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ?

Π­Ρ‚ΠΎ распространСнный источник нСпонимания срСди Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ² ΠŸΠΈΡ‚ΠΎΠ½Π°.

ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ: β€œΠŸΠΈΡ‚ΠΎΠ½β€ – это интСрфСйс. БущСствуСт спСцификация, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π°Ρ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠŸΠΈΡ‚ΠΎΠ½, ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ сСбя вСсти (Ρ‡Ρ‚ΠΎ справСдливо для любого интСрфСйса). И сущСствуСт нСсколько ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΉ (Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ справСдливо для любого интСрфСйса).

Π’Ρ‚ΠΎΡ€ΠΎΠ΅: β€œΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉβ€ ΠΈ β€œΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉβ€ это свойства ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, Π½ΠΎ Π½Π΅ интСрфСйса.

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ сам вопрос Π½Π΅ совсСм ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π΅Π½.

Π’ случаС с самой распространСнной Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ (CPython: написанный Π½Π° C, часто Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ просто β€œPython”, ΠΈ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅, Ссли понятия Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ ΠΎ Ρ‡Π΅ΠΌ я Ρ‚ΠΎΠ»ΠΊΡƒΡŽ) ΠΎΡ‚Π²Π΅Ρ‚: ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ, с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ компиляциСй. CPython ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚* исходный ΠΊΠΎΠ΄ Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅ Π² Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ этот Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄, запуская Π΅Π³ΠΎ Π² процСссС.

* Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: это Π½Π΅ совсСм β€œΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡβ€ Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠΌ смыслС. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ, ΠΌΡ‹ считаСм, Ρ‡Ρ‚ΠΎ β€œΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡβ€ это конвСртация ΠΈΠ· высокоуровнСвого языка Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ – Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€ΠΎΠ΄Π΅ это β€œΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡβ€.

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΈΠ·ΡƒΡ‡ΠΈΠΌ этот ΠΎΡ‚Π²Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΡˆΠ΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΌ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ нас Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅.

Π‘Π°ΠΉΡ‚ΠΊΠΎΠ΄ ΠΈΠ»ΠΈ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄

ΠžΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΌΠ΅ΠΆΠ΄Ρƒ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ΠΎΠΌ ΠΈ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΌ (ΠΈΠ»ΠΈ Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ) ΠΊΠΎΠ΄ΠΎΠΌ. ΠŸΠΎΠΆΠ°Π»ΡƒΠΉ, Π»Π΅Π³Ρ‡Π΅ всСго Π΅Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

β€” CΠΈ компилируСтся Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ впослСдствии запускаСтся Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ процСссором. КаТдая инструкция заставляСт процСссор ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ дСйствия.
β€” Java компилируСтся Π² Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ впослСдствии запускаСтся Π½Π° Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС Java (Java Virtual Machine, JVM), абстрактном ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запускаСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. КаТдая инструкция обрабатываСтся JVM, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ взаимодСйствуСт с ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠΌ.

Бильно упрощая: ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ быстрСС, Π½ΠΎ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ Π»ΡƒΡ‡ΡˆΠ΅ пСрСносим ΠΈ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½.

ΠœΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ Π² зависимости ΠΎΡ‚ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Π½Π° всСх ΠΌΠ°ΡˆΠΈΠ½Π°Ρ…. МоТно ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ ΠΏΠΎΠ΄ Π²Π°ΡˆΡƒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ CPython, Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

1. CPython ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ваш исходный ΠΊΠΎΠ΄ Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅ Π² Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄.
2. Π­Ρ‚ΠΎΡ‚ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ запускаСтся Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС CPython.

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ°ΡˆΠΈΠ½Ρ‹: Jython, IronPython ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅

Как я Π³ΠΎΠ²ΠΎΡ€ΠΈΠ» Π²Ρ‹ΡˆΠ΅, Ρƒ ΠŸΠΈΡ‚ΠΎΠ½Π° сущСствуСт нСсколько Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ. ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, ΠΊΠ°ΠΊ Π³ΠΎΠ²ΠΎΡ€ΠΈ-лось Π²Ρ‹ΡˆΠ΅, самой популярной являСтся CPython. Π­Ρ‚Π° вСрсия ΠŸΠΈΡ‚ΠΎΠ½Π° написана Π½Π° C ΠΈ считаСтся ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ β€œΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽβ€.

Но ΠΊΠ°ΠΊ насчСт Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²? Одна ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²ΠΈΠ΄Π½Ρ‹Ρ… это Jython, рСализация ΠŸΠΈΡ‚ΠΎΠ½Π° Π½Π° Java, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ JVM. Π’ Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ CPython Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ для запуска Π½Π° CPython VM, Jython Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ Java для запуска Π½Π° JVM (это Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ гСнСрируСтся ΠΏΡ€ΠΈ компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Java).

python компиляция Π² Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄. image loader. python компиляция Π² Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄ Ρ„ΠΎΡ‚ΠΎ. python компиляция Π² Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄-image loader. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° python компиляция Π² Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° image loader. ΠžΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°: НавСрно всСм интСрСсно, Ρ‡Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρƒ инструмСнта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΡˆΡŒ, этот интСрСс ΠΎΠ²Π»Π°Π΄Π΅Π» ΠΈ ΠΌΠ½ΠΎΠΉ, Π½ΠΎ Π³Π»Π°Π²Π½ΠΎΠ΅ Π½Π΅ ΡƒΡ‚ΠΎΠΏΠ°Ρ‚ΡŒ Π² Π½Ρ‘ΠΌ ΠΈ Π½Π΅ Π·Π°ΠΊΠΎΠΏΠ°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π΅ Π²Ρ‹Π»Π΅Π·Ρ‚ΠΈ. Найдя для сСбя интСрСсный ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π», я Ρ€Π΅ΡˆΠΈΠ» Π·Π°Π±ΠΎΡ‚Π»ΠΈΠ²ΠΎ пСрСвСсти Π΅Π³ΠΎ ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ хабросообщСству (моя пСрвая публикация, ΠΏΡ€ΠΎΡˆΡƒ Π½ΠΎΠ³Π°ΠΌΠΈ сильно Π½Π΅ ΠΏΠΈΠ½Π°Ρ‚ΡŒ). Π’Π΅ΠΌ, ΠΊΠΎΠΌΡƒ интСрСсСн ΠΊΠ°ΠΊ Python Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° самом Π΄Π΅Π»Π΅, ΠΏΡ€ΠΎΡˆΡƒ ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚.

β€œΠ—Π°Ρ‡Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ?”, спроситС Π²Ρ‹. Ну, для Π½Π°Ρ‡Π°Π»Π°, Ρ€Π°Π·Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ладят с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ.

CPython ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ написаниС C-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ для ΠΊΠΎΠ΄Π° Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅ ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΎΠ½ запускаСтся ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ CΠΈ. Jython Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ Π½Π° Java: Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Java-классы Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… усилий, призывая ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ваши Java-классы ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π½Π° Jython. (Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Ссли Π²Ρ‹ Π΅Ρ‰Π΅ Π½Π΅ Π΄ΡƒΠΌΠ°Π»ΠΈ ΠΎΠ± этом Π²ΡΠ΅Ρ€ΡŒΠ΅Π·, это довольно Π±Π΅Π·ΡƒΠΌΠ½ΠΎ. ΠœΡ‹ Π΄ΠΎΠΆΠΈΠ»ΠΈ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΡΠΌΠ΅ΡˆΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ языки ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² ΠΎΠ΄Π½Ρƒ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ. Как Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ» Rostin, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΡΠΌΠ΅ΡˆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠ΄ Π½Π° Π€ΠΎΡ€Ρ‚Ρ€Π°Π½Π΅ с CΠΈ появились довольно Π΄Π°Π²Π½ΠΎ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ это Π½Π΅ совсСм Π½ΠΎΠ²ΠΈΠ½ΠΊΠ°. Но это всС ΠΆΠ΅ ΠΊΡ€ΡƒΡ‚ΠΎ.)

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Π²ΠΎΡ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π° Jython:

[Java HotSpot(TM) 64-Bit Server VM (Apple Inc.)] on java1.6.0_51
>>> from java.util import HashSet
>>> s = HashSet(5)
>>> s.add(«Foo»)
>>> s.add(«Bar»)
>>> s
[Foo, Bar]

МоТно ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Jython: Java :: IronPython: C#. Они Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ°ΡˆΠΈΠ½Π°Ρ…, Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ классы C# Π² ΠΊΠΎΠ΄ IronPython ΠΈ классы Java Π² ΠΊΠΎΠ΄ Jython, ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

python компиляция Π² Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄. image loader. python компиляция Π² Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄ Ρ„ΠΎΡ‚ΠΎ. python компиляция Π² Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄-image loader. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° python компиляция Π² Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° image loader. ΠžΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°: НавСрно всСм интСрСсно, Ρ‡Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρƒ инструмСнта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΡˆΡŒ, этот интСрСс ΠΎΠ²Π»Π°Π΄Π΅Π» ΠΈ ΠΌΠ½ΠΎΠΉ, Π½ΠΎ Π³Π»Π°Π²Π½ΠΎΠ΅ Π½Π΅ ΡƒΡ‚ΠΎΠΏΠ°Ρ‚ΡŒ Π² Π½Ρ‘ΠΌ ΠΈ Π½Π΅ Π·Π°ΠΊΠΎΠΏΠ°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π΅ Π²Ρ‹Π»Π΅Π·Ρ‚ΠΈ. Найдя для сСбя интСрСсный ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π», я Ρ€Π΅ΡˆΠΈΠ» Π·Π°Π±ΠΎΡ‚Π»ΠΈΠ²ΠΎ пСрСвСсти Π΅Π³ΠΎ ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ хабросообщСству (моя пСрвая публикация, ΠΏΡ€ΠΎΡˆΡƒ Π½ΠΎΠ³Π°ΠΌΠΈ сильно Π½Π΅ ΠΏΠΈΠ½Π°Ρ‚ΡŒ). Π’Π΅ΠΌ, ΠΊΠΎΠΌΡƒ интСрСсСн ΠΊΠ°ΠΊ Python Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° самом Π΄Π΅Π»Π΅, ΠΏΡ€ΠΎΡˆΡƒ ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚.

ΠšΡΡ‚Π°Ρ‚ΠΈ, Ρ…ΠΎΡ‚ΡŒ это ΠΈ Π½Π΅ станСт ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ для ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ, стоит ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ эти Π½Π° самом Π΄Π΅Π»Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ. Π­Ρ‚ΠΎ касаСтся Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ способов ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅. Однако эти отличия, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π½Π΅-Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹, ΠΎΠ½ΠΈ ΠΈΡΡ‡Π΅Π·Π°ΡŽΡ‚ ΠΈ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΈΠ·-Π·Π° Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, IronPython ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ строки Unicode ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ; ΠΎΠ΄Π½Π°ΠΊΠΎ CPython ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ASCII Π² вСрсиях 2.x (выдавая ΠΎΡˆΠΈΠ±ΠΊΡƒ UnicodeEncodeError для Π½Π΅-ASCII символов), ΠΈ ΠΏΡ€ΠΈ этом ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ символы Unicode ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² вСрсиях 3.x.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Π½Π° Π»Π΅Ρ‚Ρƒ (Just-in-Time Compilation): PyPy ΠΈ Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅

Π˜Ρ‚Π°ΠΊ, Ρƒ нас Π΅ΡΡ‚ΡŒ имплСмСнтация ΠŸΠΈΡ‚ΠΎΠ½Π°, написанная Π½Π° Π‘ΠΈ, Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° – Π½Π° Java, ΠΈ Ρ‚Ρ€Π΅Ρ‚ΡŒΡ Π½Π° C#. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ шаг: имплСмСнтация ΠŸΠΈΡ‚ΠΎΠ½Π°, написанная на… ΠŸΠΈΡ‚ΠΎΠ½Π΅. (ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚, Ρ‡Ρ‚ΠΎ это ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΠΌΠ°Π½Ρ‡ΠΈΠ²ΠΎ).

Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ это ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ±ΠΈΠ²Π°Ρ‚ΡŒ с Ρ‚ΠΎΠ»ΠΊΡƒ. Для Π½Π°Ρ‡Π°Π»Π°, Π΄Π°Π²Π°ΠΉΡ‚Π΅ обсудим ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ Π½Π° Π»Π΅Ρ‚Ρƒ (just-in-time ΠΈΠ»ΠΈ JIT).

JIT. ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΈ ΠΊΠ°ΠΊ

Напомню, Ρ‡Ρ‚ΠΎ Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ быстрСС Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π°. Ну, Π° Ρ‡Ρ‚ΠΎ, Ссли Π±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π° ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΊΠ°ΠΊ Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΊΠΎΠ΄? ΠŸΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ β€œΠ·Π°ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒβ€ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ†Π΅Π½Ρƒ (ΠΈΠ½Ρ‹ΠΌΠΈ словами: врСмя) Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π°, Π½ΠΎ Ссли Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ быстрСС, Ρ‚ΠΎ это Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ! Π­Ρ‚ΠΈΠΌ ΠΈ мотивируСтся JIT-компиляция, гибридная Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ°, которая совмСщаСт Π² сСбС прСимущСства ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎ-Ρ€ΠΎΠ² ΠΈ компиляторов. Π’ Π΄Π²ΡƒΡ… словах – JIT стараСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ систСму ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ.

НапримСр, Π²ΠΎΡ‚ распространСнный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ JIT:

Π’ этом вся ΡΡƒΡ‚ΡŒ PyPy: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ JIT Π² ΠŸΠΈΡ‚ΠΎΠ½Π΅ (Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ). ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π΅ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ†Π΅Π»ΠΈ: PyPy Π½Π°Ρ†Π΅Π»Π΅Π½ Π½Π° ΠΊΡ€ΠΎΡΡΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎΡΡ‚ΡŒ, Ρ€Π°Π±ΠΎΡ‚Ρƒ с нСбольшим количСством памяти ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ stackless (ΠΎΡ‚ΠΊΠ°Π·Π° ΠΎΡ‚ стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² языка Π‘ΠΈ Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ собствСнного стСка). Но JIT это Π³Π»Π°Π²Π½ΠΎΠ΅ прСимущСство. Π’ срСднСм Π½Π° основС Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… тСстов, Ρ„Π°ΠΊΡ‚ΠΎΡ€ ускорСния составляСт 6.27. Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ· схСмы ΠΎΡ‚ PyPy Speed Center:

python компиляция Π² Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄. image loader. python компиляция Π² Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄ Ρ„ΠΎΡ‚ΠΎ. python компиляция Π² Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄-image loader. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° python компиляция Π² Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° image loader. ΠžΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°: НавСрно всСм интСрСсно, Ρ‡Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρƒ инструмСнта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΡˆΡŒ, этот интСрСс ΠΎΠ²Π»Π°Π΄Π΅Π» ΠΈ ΠΌΠ½ΠΎΠΉ, Π½ΠΎ Π³Π»Π°Π²Π½ΠΎΠ΅ Π½Π΅ ΡƒΡ‚ΠΎΠΏΠ°Ρ‚ΡŒ Π² Π½Ρ‘ΠΌ ΠΈ Π½Π΅ Π·Π°ΠΊΠΎΠΏΠ°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π΅ Π²Ρ‹Π»Π΅Π·Ρ‚ΠΈ. Найдя для сСбя интСрСсный ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π», я Ρ€Π΅ΡˆΠΈΠ» Π·Π°Π±ΠΎΡ‚Π»ΠΈΠ²ΠΎ пСрСвСсти Π΅Π³ΠΎ ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ хабросообщСству (моя пСрвая публикация, ΠΏΡ€ΠΎΡˆΡƒ Π½ΠΎΠ³Π°ΠΌΠΈ сильно Π½Π΅ ΠΏΠΈΠ½Π°Ρ‚ΡŒ). Π’Π΅ΠΌ, ΠΊΠΎΠΌΡƒ интСрСсСн ΠΊΠ°ΠΊ Python Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° самом Π΄Π΅Π»Π΅, ΠΏΡ€ΠΎΡˆΡƒ ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚.

Π’ PyPy слоТно Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ

Π£ PyPy Π΅ΡΡ‚ΡŒ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π», ΠΈ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΎΠ½ Ρ…ΠΎΡ€ΠΎΡˆΠΎ совмСстим с CPython (Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π° Π½Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Flask, Django, ΠΈ Ρ‚.Π΄.).

Но с PyPy Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρ‹. (ΠΎΡ†Π΅Π½ΠΈΡ‚Π΅, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, это бСссмыслСнноС ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ PyPyPy…). По ΠΌΠΎΠ΅ΠΌΡƒ мнСнию основная ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ PyPy ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ являСтся:

1. Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ ΠŸΠΈΡ‚ΠΎΠ½Π°, написанным Π½Π° RPython (Π½Π΅ Python (я ΠΎΠ±ΠΌΠ°Π½ΡƒΠ» вас Π΄ΠΎ этого)). RPython это подмноТСство Python со статичной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ. Π’ Python, вСсти Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ бСсСды ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… β€œΠ² Ρ†Π΅Π»ΠΎΠΌ нСвозмоТно” ΠΏΠΎΡ‡Π΅ΠΌΡƒ это Ρ‚Π°ΠΊ слоТно? рассмотритС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

x = random.choice([1, «foo»])

это ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π° Python (спасибо Ademanβ€˜Ρƒ). Какой Ρ‚ΠΈΠΏ Ρƒ x? Как ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠΎΠ³Π΄Π° Ρ‚ΠΈΠΏΡ‹ Π΄Π°ΠΆΠ΅ Π½Π΅ Ρ„ΠΎΡ€ΡΠΈΡ€ΡƒΡŽΡ‚ΡΡ?). Π’ RPython ΠΌΡ‹ ΠΆΠ΅Ρ€Ρ‚Π²ΡƒΠ΅ΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒΡŽ, Π½ΠΎ Π²Π·Π°ΠΌΠ΅Π½ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Ρ‡Π΅Π³ΠΎ Π΅Ρ‰Π΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΡ€ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ.

2. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄ Π½Π° RPython Π² Ρ€Π°Π·Π½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ JIT. ΠŸΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΎΠΉ ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ являСтся Π‘ΠΈ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ компилятор RPython-Π²-Π‘ΠΈ, Π½ΠΎ Π² качСствС Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ JVM ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅.

Для простоты описания, я Π±ΡƒΠ΄Ρƒ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ… PyPy (1) ΠΈ PyPy (2).

Π—Π°Ρ‡Π΅ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ эти Π΄Π²Π΅ Π²Π΅Ρ‰ΠΈ, ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ – Π² ΠΎΠ΄Π½ΠΎΠΌ Π½Π°Π±ΠΎΡ€Π΅? Π”ΡƒΠΌΠ°ΠΉΡ‚Π΅ ΠΎΠ± этом Ρ‚Π°ΠΊ: PyPy (1) это ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€, написанный Π½Π° RPython. Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ½ Π±Π΅Ρ€Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΊΠΎΠ΄ Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅ ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ Π² Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄. Но Ρ‡Ρ‚ΠΎΠ±Ρ‹ сам ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ (написанный Π½Π° RPython) ΠΌΠΎΠ³ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Пи-Ρ‚ΠΎΠ½Π°, Π²Π΅Ρ€Π½ΠΎ?

Π˜Ρ‚Π°ΠΊ, ΠΌΠΎΠΆΠ½ΠΎ просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ CPython Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€. Но это Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ слишком быстро.

ВмСсто этого ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ PyPy (2) (Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ RPython Toolchain) Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ PyPy Π² ΠΊΠΎΠ΄ для Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, C, JVM, ΠΈΠ»ΠΈ CLI) для запуска Π½Π° ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ машинС, с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ JIT. Π­Ρ‚ΠΎ волшСбно: PyPy динамичСски добавляСт JIT ΠΊ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ, гСнСрируя собствСнный компилятор! (ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, это Π±Π΅Π·ΡƒΠΌΠΈΠ΅: ΠΌΡ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€, добавляя Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ, ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ компилятор).

Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ исполняСмый Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ исходный ΠΊΠΎΠ΄ Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ JIT. Π’ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ! ΠŸΠΎΠ½ΡΡ‚ΡŒ слоТновато, Π½ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, эта схСма ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚:

python компиляция Π² Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄. image loader. python компиляция Π² Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄ Ρ„ΠΎΡ‚ΠΎ. python компиляция Π² Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄-image loader. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° python компиляция Π² Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° image loader. ΠžΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°: НавСрно всСм интСрСсно, Ρ‡Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρƒ инструмСнта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΡˆΡŒ, этот интСрСс ΠΎΠ²Π»Π°Π΄Π΅Π» ΠΈ ΠΌΠ½ΠΎΠΉ, Π½ΠΎ Π³Π»Π°Π²Π½ΠΎΠ΅ Π½Π΅ ΡƒΡ‚ΠΎΠΏΠ°Ρ‚ΡŒ Π² Π½Ρ‘ΠΌ ΠΈ Π½Π΅ Π·Π°ΠΊΠΎΠΏΠ°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π΅ Π²Ρ‹Π»Π΅Π·Ρ‚ΠΈ. Найдя для сСбя интСрСсный ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π», я Ρ€Π΅ΡˆΠΈΠ» Π·Π°Π±ΠΎΡ‚Π»ΠΈΠ²ΠΎ пСрСвСсти Π΅Π³ΠΎ ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ хабросообщСству (моя пСрвая публикация, ΠΏΡ€ΠΎΡˆΡƒ Π½ΠΎΠ³Π°ΠΌΠΈ сильно Π½Π΅ ΠΏΠΈΠ½Π°Ρ‚ΡŒ). Π’Π΅ΠΌ, ΠΊΠΎΠΌΡƒ интСрСсСн ΠΊΠ°ΠΊ Python Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° самом Π΄Π΅Π»Π΅, ΠΏΡ€ΠΎΡˆΡƒ ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚.

ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΠΌ: настоящая красота PyPy Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ сСбС ΠΊΡƒΡ‡Ρƒ Ρ€Π°Π·Π½Ρ‹Ρ… ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠŸΠΈΡ‚ΠΎΠ½Π° Π½Π° RPython Π½Π΅ Π²ΠΎΠ»Π½ΡƒΡΡΡŒ ΠΎ JIT (Π½Π΅ считая ΠΏΠ°Ρ€Ρ‹ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ). ПослС этого PyPy Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ для нас JIT, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ RPython Toolchain/PyPy (2).

На самом Π΄Π΅Π»Π΅, Ссли ΠΊΠΎΠΏΠ½ΡƒΡ‚ΡŒ Π³Π»ΡƒΠ±ΠΆΠ΅ Π² Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ†ΠΈΡŽ, тСорСтичСски ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ любого языка, Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² PyPy ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ JIT для этого языка. Π­Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ PyPy концСнтрируСтся Π½Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ самого ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°, Π° Π½Π΅ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ языка, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚ΠΎΡ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚.

Π’ качСствС отступлСния я Π±Ρ‹ Ρ…ΠΎΡ‚Π΅Π» Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ сам JIT ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ восхититСлСн. Он ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚Π΅Ρ…Π½ΠΈΠΊΡƒ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ β€œΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅β€ (tracing), которая Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π£Π·Π½Π°Ρ‚ΡŒ большС ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ· этой лСгкодоступной ΠΈ ΠΎΡ‡Π΅Π½ΡŒ интСрСсной ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

ΠŸΠΎΠ΄Ρ‹Ρ‚ΠΎΠΆΠΈΠΌ: ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ PyPy-компилятор RPython-Π²-Π‘ΠΈ (ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ†Π΅Π»Π΅Π²ΡƒΡŽ ΠΏΠ»Π°Ρ‚-Ρ„ΠΎΡ€ΠΌΡƒ), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π½Π° RPython ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚Π°Ρ‚ΠΎΡ€ PyPΡƒ.

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

ΠŸΠΎΡ‡Π΅ΠΌΡƒ всС это Ρ‚Π°ΠΊ Π²ΠΎΡΡ…ΠΈΡ‚ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ? ΠŸΠΎΡ‡Π΅ΠΌΡƒ стоит Π³Π½Π°Ρ‚ΡŒΡΡ Π·Π° этой Π±Π΅Π·ΡƒΠΌΠ½ΠΎΠΉ ΠΈΠ΄Π΅Π΅ΠΉ? По-ΠΌΠΎΠ΅ΠΌΡƒ, АлСкс Π“Π΅ΠΉΠ½ΠΎΡ€ объяснил это ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π² своСм Π±Π»ΠΎΠ³Π΅: β€œ[Π—Π° PyPy Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅] ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ [ΠΎΠ½] Π±ΠΎΠ»Π΅Π΅ быстрый, Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠΉ ΠΈ являСтся Π»ΡƒΡ‡ΡˆΠ΅ΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΎΠΉ для развития ΠŸΠΈΡ‚ΠΎΠ½Π°β€.

Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅: Π΄Ρ€ΡƒΠ³ΠΈΠ΅ названия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΠ»Ρ‹ΡˆΠ°Π»ΠΈ

Python 3000 (Py3k): Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Python 3.0, основной Ρ€Π΅Π»ΠΈΠ· ΠŸΠΈΡ‚ΠΎΠ½Π° с ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ появился Π² 2008. Π³ΠΎΠ΄Ρƒ. Команда Py3k прСдсказала, Ρ‡Ρ‚ΠΎ Π½ΠΎΠ²ΠΎΠΉ вСрсии понадобится ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΏΡΡ‚ΡŒ Π»Π΅Ρ‚ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΈΠΆΠΈΡ‚ΡŒΡΡ. И Π² Ρ‚ΠΎ врСмя, ΠΊΠ°ΠΊ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ (Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π½Π°Π΄ΡƒΠΌΠ°Π½Π½ΠΎΠ΅ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅) Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Python 2.x, люди всС большС Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°ΡŽΡ‚ΡΡ ΠΎ Py3k.

Numba: β€œΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ just-in-time компилятор”, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ добавляСт JIT Π² снабТСнный примСчаниями ΠΊΠΎΠ΄ Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅. ΠŸΡ€ΠΎΡ‰Π΅ говоря, Π²Ρ‹ Π΄Π°Π΅Ρ‚Π΅ Π΅ΠΌΡƒ подсказки, Π° ΠΎΠ½ ускоряСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ части вашСго ΠΊΠΎΠ΄Π°. Numba являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ дистрибутива Anaconda Π½Π°Π±ΠΎΡ€Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² для Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ управлСния Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

IPython: сильно отличаСтся ΠΎΡ‚ всСго, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ обсудили. Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ срСда для ΠŸΠΈΡ‚ΠΎΠ½Π°. Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Π°Ρ, с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ GUI-ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ² ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

Psyco: ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠŸΠΈΡ‚ΠΎΠ½Π°, ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΠ΅Ρ€Π²Ρ‹Ρ… ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ ΠŸΠΈΡ‚ΠΎΠ½Π° Π² области JIT. Π”Π°Π²Π½ΠΎ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ β€œΠ½Π΅ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ ΠΈ мСртвый”. Π“Π»Π°Π²Π½Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Psyco Армин Π ΠΈΠ³ΠΎ сСйчас Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π°Π΄ PyPy.

ΠŸΡ€ΠΈΠ²ΡΠ·ΠΊΠΈ ΠΊ языкам
JavaScript Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ

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

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

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