Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

МодСли Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ² ΠΈ мСтапрограммирования: Go, Rust, Swift, D ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅

Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π€ΠΎΡ‚ΠΎ Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

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

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

ΠžΠ±Π·ΠΎΡ€

Π― нарисовал Π±Π»ΠΎΠΊ-схСму всСх описанных Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ систСм, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ прСдставляли Π΅Ρ‘ содСрТимоС ΠΈ ΠΊΠ°ΠΊ взаимосвязаны эти систСмы:

Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π€ΠΎΡ‚ΠΎ Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

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

Допустим, ΠΌΡ‹ пишСм Π½Π° языкС Π±Π΅Π· систСм Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ², ΠΈ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ структуру Π΄Π°Π½Π½Ρ‹Ρ… стСка Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ² (generic stack data structure), которая Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π»ΡŽΠ±Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ². ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ каТдая функция ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈ скопированными ΠΎΠ΄Π½ΠΈΠΌ способом, ΠΈ, Π² Ρ†Π΅Π»ΠΎΠΌ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΌΠΈ ΠΏΠΎΡ…ΠΎΠΆΠ΅.

ΠžΠ±ΠΎΠΉΡ‚ΠΈ это ΠΌΠΎΠΆΠ½ΠΎ двумя способами: Π»ΠΈΠ±ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… дСйствовали Π² нашСй структурС ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ, Π»ΠΈΠ±ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΏΠΈΠΉ структуры Π΄Π°Π½Π½Ρ‹Ρ… с нСбольшими измСнСниями для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΈ ΠΈΠ΄Π΅ΠΈ Π»Π΅Π³Π»ΠΈ Π² основу Π΄Π²ΡƒΡ… Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π³Ρ€ΡƒΠΏΠΏ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ с Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠ°ΠΌΠΈ: ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ° (boxing) ΠΈ мономорфизация (monomorphization).

Π£ΠΏΠ°ΠΊΠΎΠ²ΠΊΠ° ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ складываниС всСго подряд Π² ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Β«ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈΒ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это Π΄Π΅Π»Π°ΡŽΡ‚ Ρ‚Π°ΠΊ: Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠ»Π°Π΄ΡƒΡ‚ Π² ΠΊΡƒΡ‡Ρƒ (heap), Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Π½ΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ Π² структурС Π΄Π°Π½Π½Ρ‹Ρ…. МоТно ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° всС Ρ‚ΠΈΠΏΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π»ΡŽΠ±Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²! Однако это ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡŽ потрСблСния памяти, динамичСскому поиску ΠΈ ΠΏΡ€ΠΎΠΌΠ°Ρ…Π°ΠΌ кэша. Π’ языкС Π‘ это соотвСтствуСт Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ваша структура Π΄Π°Π½Π½Ρ‹Ρ… Ρ…Ρ€Π°Π½ΠΈΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ void* ΠΈ просто ΠΊΡΡˆΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΈ ΠΈΠ· void* (Ссли Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ Π² ΠΊΡƒΡ‡Π΅, ΠΎΠ½ ΠΈΡ… Ρ‚Π°ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅Ρ‚).

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

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

КаТдая ΠΈΠ· описанных схСм Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠ°ΠΌΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π° Π² Ρ€Π°Π·Π½Ρ‹Ρ… направлСниях, Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ большС возмоТностСй ΠΈΠ»ΠΈ бСзопасности, ΠΈ Π² Π°Π²Ρ‚ΠΎΡ€Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… языков ΠΏΡ€ΠΈΡˆΠ»ΠΈ ΠΊ ΠΎΡ‡Π΅Π½ΡŒ интСрСсным Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌ. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π² Rust ΠΈ C# Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Π° ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°!

Π£ΠΏΠ°ΠΊΠΎΠ²ΠΊΠ°

Начнём с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π±Π°Π·ΠΎΠ²ΠΎΠΉ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ Π² Go:

Π’Π°ΠΊΠΆΠ΅ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² C ( void* ), Go ( interface<> ), Π΄ΠΎ-Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ²ΠΎΠΉ Java ( Object ) ΠΈ Π΄ΠΎ-Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ²ΠΎΠΌ Objective-C ( id ).

Π£ΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ с Π·Π°Ρ‚ΠΈΡ€Π°Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠΎΠ²

Π£ основного ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ Π΅ΡΡ‚ΡŒ нСдостатки:

Java ΠΈ Objective-C Π½Π°Ρ‡ΠΈΠ½Π°Π»ΠΈ с ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ, Π° ΠΏΠΎΠ·Π΄Π½Π΅Π΅ обзавСлись языковыми срСдствами для Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ² с Π·Π°Ρ‚ΠΈΡ€Π°Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠΎΠ², Ρ€Π°Π΄ΠΈ совмСстимости ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ Ρ‚ΠΈΠΏΡ‹-ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ, ΠΊΠ°ΠΊ ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅, Π½ΠΎ с ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Ρ‚ΠΈΠΏΠΎΠ²-Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ². Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· ΡΡ‚Π°Ρ‚ΡŒΠΈ Π½Π° Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ ΠΏΡ€ΠΎ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Π² Java:

Π’Ρ‹Π²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ с ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ прСдставлСниСм

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

ΠŸΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π²Π°Ρ‚ΡŒ Β«Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΈΠ· списка элСмСнтов Ρ‚ΠΈΠΏΠ° ‘a Π²ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ с Ρ‚ΠΈΠΏΠΎΠΌ ‘a Β». Π­Ρ‚ΠΎ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅, ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏ списка, ΠΈ ΠΏΡ€ΠΈ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ.

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹

Π”Ρ€ΡƒΠ³ΠΈΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½Π΅ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹. Π­Ρ‚ΠΎ Π½Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° для структур Π΄Π°Π½Π½Ρ‹Ρ… Π²Ρ€ΠΎΠ΄Π΅ стСка, Π½ΠΎ инструмСнтам Π²Ρ€ΠΎΠ΄Π΅ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½ΡƒΠΆΠ½Ρ‹ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ возмоТности, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, спСцифичСскиС для Ρ‚ΠΈΠΏΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сравнСния. Π•ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ способов Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ это Π² runtime ΠΈ ΠΎΡ‚Ρ€Π°Π·ΠΈΡ‚ΡŒ Π² языкС, тСхничСски это Ρ€Π°Π·Π½Ρ‹Π΅ направлСния, ΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ язык с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ². Однако особСнности Ρ€Π°Π·Π½Ρ‹Ρ… языков Π²Π»ΠΈΡΡŽΡ‚ Π½Π° ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, Π° ΡƒΠΆΠ΅ Π·Π°Ρ‚Π΅ΠΌ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΡƒΡΠΈΠ»ΠΈΠ²Π°ΡŽΡ‚ ΡΠΈΠ»ΡŒΠ½Ρ‹Π΅ стороны Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ сущСствуСт Π΄Π²Π° сСмСйства языков, основанных Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°Ρ… ΠΊ runtime: Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ… Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² (vtables) ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ словаря.

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΠ½Ρ‹Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²

Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, спСцифичСскиС для Ρ‚ΠΈΠΏΠΎΠ², ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡΡΡŒ стратСгии ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ Ρ€Π°Π΄ΠΈ ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ со всСм подряд, Ρ‚ΠΎ достаточно ΠΈΠΌΠ΅Ρ‚ΡŒ ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ способ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ называСтся Β«Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²Β» (vtables, virtual method tables), хотя Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎΠ»Π½Ρ‹ΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ. Он Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Ρ‚Π°ΠΊ: Π½Π° Π½ΡƒΠ»Π΅Π²ΠΎΠΌ смСщСнии Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-структуры располоТСн ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с консистСнтной схСмой. Π’ этих Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ… Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-ΠΊΠΎΠ΄ ΠΈΡ‰Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, спСцифичСскиС для Ρ‚ΠΈΠΏΠΎΠ², индСксируя ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° фиксированных смСщСниях.

Π’Π°ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Ρ‚ΠΈΠΏΡ‹ interface Π² Go ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ dyn trait Π² Rust. Когда Π²Ρ‹ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚Π΅ Ρ‚ΠΈΠΏ ΠΊ интСрфСйсному Ρ‚ΠΈΠΏΡƒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚, для интСрфСйса создаётся ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠ°, содСрТащая ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° исходный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° vtable Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, спСцифичСских для Ρ‚ΠΈΠΏΠΎΠ². Но для этого трСбуСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ косвСнной адрСсации ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ другая схСма. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ сортировка Π² Go ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ интСрфСйс для ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° с ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Swap, Π° Π½Π΅ Π±Π΅Ρ€Ρ‘Ρ‚ слайс интСрфСйса Comparable, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎ Π±Ρ‹ размСщСния Π² памяти ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ слайса интСрфСйсных Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сортировался Π±Ρ‹ вмСсто исходного слайса!

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

ООП β€” это свойство языка, Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π΅ возмоТности Ρ‚Π°Π±Π»ΠΈΡ† Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ². ВмСсто ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… интСрфСйсных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² с vtables, ООП-языки Π²Ρ€ΠΎΠ΄Π΅ Java просто Π²ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π² Π½Π°Ρ‡Π°Π»ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ². Java-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ языки ΠΈΠΌΠ΅ΡŽΡ‚ систСму наслСдования ΠΈ интСрфСйсы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ‚Π°Π±Π»ΠΈΡ† Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ².

ΠšΡ€ΠΎΠΌΠ΅ прСдоставлСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… возмоТностСй, встраиваниС vtable Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ нСобходимости ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ интСрфСйсныС Ρ‚ΠΈΠΏΡ‹ с косвСнной адрСсациСй (indirection). Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Go, Π² Java функция сортировки ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ интСрфСйс Comparable ΠΊ Ρ‚ΠΈΠΏΠ°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½Π° Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚.

РСфлСксия

Если Ρƒ вас Π΅ΡΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², Ρ‚ΠΎ Π²Π°ΠΌ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ слоТно Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ компилятор Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠΌΡ‘Π½ ΠΏΠΎΠ»Π΅ΠΉ, Ρ‚ΠΈΠΏΠΎΠ² ΠΈ мСст (locations). Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊΠΎ всСм Π΄Π°Π½Π½Ρ‹ΠΌ этого Ρ‚ΠΈΠΏΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ всС Π΄Π°Π½Π½Ρ‹Π΅ Π»ΡŽΠ±Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ². Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для добавлСния Π² язык «рСфлСксии», ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈ красивоС ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ². Π£ рСфлСксии, ΠΊΠ°ΠΊ Ρƒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡ‹ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ, Π΅ΡΡ‚ΡŒ нСдостаток: для Π½Π΅Ρ‘ достаточно лишь ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ ΠΊΠΎΠ΄Π°, Π½ΠΎ ΠΏΡ€ΠΈ этом Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ динамичСских поисков, Ρ‡Ρ‚ΠΎ сниТаСт ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ сСриализации.

Π―Π·Ρ‹ΠΊΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π΅Ρ„Π»Π΅ΠΊΡΠΈΡŽ для сСриализации ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ: Java, C# ΠΈ Go.

ДинамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ языки

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

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ: «Но вСдь динамичСскиС языки Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π΅ Ρ‚Π°ΠΊ, ΠΎΠ½ΠΈ просто Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ всё с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ…ΡΡˆ-Ρ‚Π°Π±Π»ΠΈΡ†!Β». Π₯эш-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ β€” лишь Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ структура Π΄Π°Π½Π½Ρ‹Ρ… для создания Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Ρ‚Π°Π±Π»ΠΈΡ† с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ Ρ‚ΠΈΠΏΠ°Ρ…. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ Ρ‚Π°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, CPython. Π’ Π²Ρ‹ΡΠΎΠΊΠΎΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ JIT, скаТСм, V8, ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚Π°Π±Π»ΠΈΡ† Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ рСфлСксии (reflection info). Π’ V8 скрытыС классы (vtables ΠΈ информация ΠΎ рСфлСксии) ΠΈ структура ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² Java VM, с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½ΠΎΠ²Ρ‹ΠΌΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π² Ρ…ΠΎΠ΄Π΅ исполнСния. Π­Ρ‚ΠΎ Π½Π΅ совпадСниС, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ совпадСний Π½Π΅ Π±Ρ‹Π²Π°Π΅Ρ‚: ΡΠΎΠ·Π΄Π°Ρ‚Π΅Π»ΡŒ V8 Ρ€Π°Π½ΡŒΡˆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π» Π½Π°Π΄ Π²Ρ‹ΡΠΎΠΊΠΎΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Java VM.

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° словаря

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

Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² классах Ρ‚ΠΈΠΏΠΎΠ² (type classes) Π² Haskell, хотя GHC позволяСт с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΈΠ½Π»Π°ΠΉΠ½ΠΈΠ½Π³Π° ΠΈ спСциализации Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ ΠΌΠΎΠ½ΠΎΠΌΠΎΡ€Ρ„ΠΈΠ·Π°Ρ†ΠΈΡŽ. Π’ OCaml ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° словаря с явным Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Π² Π²ΠΈΠ΄Π΅ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса, Π½ΠΎ ΡƒΠΆΠ΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ нСявным.

Witness-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² Swift

Авторы Swift ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ»ΠΈ интСрСсноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅: ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° словаря, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΈ способах ΠΈΡ… пСрСмСщСния, копирования ΠΈ освобоТдСния позволяСт ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ всю Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ для ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π»ΡŽΠ±Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π±Π΅Π· ΠΈΡ… ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Swift ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Π±Π΅Π· ΠΌΠΎΠ½ΠΎΠΌΠΎΡ€Ρ„ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ размСщСния Π² памяти Π² ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ прСдставлСнии всСх сущностСй! Π”Π°, приходится Ρ€Π°ΡΠΏΠ»Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π·Π° динамичСскиС поиски, ΠΊΠ°ΠΊ это свойствСнно всСму сСмСйству, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΡƒ, Π½Π° Π·Π°Ρ‚ΠΎ экономятся рСсурсы Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π² памяти, Π΅Ρ‘ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ ΠΈ Π½Π΅ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ кэша. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Swift Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΌΠ΅Π΅Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠ°ΠΊ @inlinable, ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (ΠΌΠΎΠ½ΠΎΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ) ΠΈ ΠΈΠ½Π»Π°ΠΉΠ½ΠΈΡ‚ΡŒ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ модуля ΠΈΠ»ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ модулями, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ упомянутых расходов. ВСроятно, примСняСтся эвристичСская ΠΎΡ†Π΅Π½ΠΊΠ° влияния Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°.

Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚, ΠΊΠ°ΠΊ Swift ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ABI-ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΠΏΡ€ΠΈ этом позволяя Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΈ ΠΏΠ΅Ρ€Π΅Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ поля Π² структурС, хотя Π°Π²Ρ‚ΠΎΡ€Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ @frozen для ΠΎΡ‚ΠΊΠ°Π·Π° ΠΎΡ‚ динамичСского поиска Ρ€Π°Π΄ΠΈ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Π˜Π½Ρ‚Π΅Π½ΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ· Ρ‚ΠΈΠΏΠΎΠ² (Intensional Type Analysis)

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

Π― Π½Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π΅Ρ€Π΅Π³Π°ΡŽ ΠΎΡ‚ использования языков, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, Π½ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ компиляторы Π‘++ ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Java, ΠΊΠΎΠ³Π΄Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° основС ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΉ Π²Ρ‹ΡΡΠ½ΡΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ΅ мСсто Π²Ρ‹Π·ΠΎΠ²Π° Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ² ΠΏΠΎ большСй части Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ². ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€Ρ‹ ΠΈ Π’Πœ Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ мСста Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°ΠΌΠΈ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ, Π° Π·Π°Ρ‚Π΅ΠΌ статичСски Π΄Π΅ΡΠΏΠ΅Ρ‚Ρ‡Π΅Ρ€ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ эти Ρ‚ΠΈΠΏΡ‹, Π² качСствС запасного Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π΄ΠΈΡΠΏΠ΅Ρ‚Ρ‡Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ прСдсказания вСтвлСния ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ³Π½ΠΎΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ Π²Π΅Ρ‚ΠΊΠ΅ ΠΏΠΎΠΉΠ΄Ρ‘Ρ‚ ΠΊΠΎΠ΄, ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ Π΄ΠΈΡΠΏΠ΅Ρ‚Ρ‡Π΅Ρ€ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ инструкции с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ статичСских Π²Ρ‹Π·ΠΎΠ²ΠΎΠ².

ΠœΠΎΠ½ΠΎΠΌΠΎΡ€Ρ„ΠΈΠ·Π°Ρ†ΠΈΡ

Π­Ρ‚ΠΎ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ΅. ΠŸΡ€ΠΈ ΠΌΠΎΠ½ΠΎΠΌΠΎΡ€Ρ„ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ способ гСнСрирования многочислСнных вСрсий ΠΊΠΎΠ΄Π° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Π£ компиляторов Π΅ΡΡ‚ΡŒ нСсколько Ρ„Π°Π· прСдставлСния, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΊΠΎΠ΄, ΠΈ, тСорСтичСски, ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° любой ΠΈΠ· этих стадий.

Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ исходного ΠΊΠΎΠ΄Π°

ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ способ ΠΌΠΎΠ½ΠΎΠΌΠΎΡ€Ρ„ΠΈΠ·Π°Ρ†ΠΈΠΈ β€” ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° стадии ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ прСдставлСния: ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ исходный ΠΊΠΎΠ΄! Π’ΠΎΠ³Π΄Π° Ρƒ компилятор Π΄Π°ΠΆΠ΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ, ΠΈ Ρ‚Π°ΠΊ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ языков Π‘ ΠΈ Go, Π² Ρ‡ΡŒΠΈΡ… компиляторах Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π½Π΅Ρ‚.

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

Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹Π΅ миксины Π² D

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

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

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы Rust

Аналогичный ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с прСдставлСниСм Π² компиляторС лишь Π½Π° ΠΎΠ΄Π½ΠΎΠΌ этапС. ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы Rust ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π² качСствС Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΈ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² (token streams), прСдоставляя ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ для прСобразования этих ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² строковыС ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ. ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ· исходного ΠΊΠΎΠ΄Π° ΠΎ располоТСниях. Код, написанный ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, макрос ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΈΠ· Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅. И Ссли этот ΠΊΠΎΠ΄ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ ошибкС компилирования Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… макоса, компилятор Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ сообщСниС ΠΈ Ρ‚ΠΎΡ‡Π½ΠΎ ΡƒΠΊΠ°ΠΆΠ΅Ρ‚ Π½Π° Ρ„Π°ΠΉΠ», строку ΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΊΡƒ сломанной части ΠΊΠΎΠ΄Π°. Но Ссли сломанный ΠΊΠΎΠ΄ макрос Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‚ΠΎ сообщСниС ΠΎΠ± ошибкС ΡƒΠΊΠ°ΠΆΠ΅Ρ‚ Π½Π° Π²Ρ‹Π·ΠΎΠ² макроса. НапримСр, Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ макрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Ρ‘Ρ€Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² ΠΆΡƒΡ€Π½Π°Π»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Π²Ρ‹Π·ΠΎΠ²Π°Ρ… ΠΈ допускаСт ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±Ρ‘Ρ€Π½ΡƒΡ‚ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎ сообщСниС ΠΎΠ± ошибкС ΡƒΠΊΠ°ΠΆΠ΅Ρ‚ прямо Π½Π° ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² Ρ„Π°ΠΉΠ»Π΅, Π° Π½Π΅ Π½Π° ΠΊΠΎΠ΄, сгСнСрированный макросом.

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ синтаксичСского Π΄Π΅Ρ€Π΅Π²Π°

НСкоторыС языки ΠΈΠ΄ΡƒΡ‚ Π΅Ρ‰Ρ‘ дальшС ΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ срСдства использования ΠΈ создания Π² макросах Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π΅Ρ€Π΅Π²Π° абстрактного синтаксиса (Abstract Syntax Tree, AST). Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π²Π°Ρ‚ΡŒ Template Haskell, макросы Nim, OCaml PPX ΠΈ ΠΏΠΎΡ‡Ρ‚ΠΈ всС Lisp.

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

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²ΠΎ всСх упомянутых ΠΌΠ½ΠΎΠΉ языках Π΅ΡΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ² Β«quoteΒ», ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π²Ρ‹ Π΄Π°Ρ‘Ρ‚Π΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° Π½Π° языкС, Π° Ρ‚ΠΎΡ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π­Ρ‚ΠΈ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΡΡ€Π°Ρ‰ΠΈΠ²Π°Ρ‚ΡŒ значСния синтаксичСского Π΄Π΅Ρ€Π΅Π²Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ подобия строковой интСрполяции. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° Template Haskell:

Одним нСдостатком создания ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ синтаксичСского Π΄Π΅Ρ€Π΅Π²Π°, Π° Π½Π΅ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ², являСтся Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏΡ‹ синтаксичСского Π΄Π΅Ρ€Π΅Π²Π° часто ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²Ρ‹Ρ… языковых свойств. А Ρ‚ΠΈΠΏΡ‹ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡΡ‚Π°Ρ‚ΡŒΡΡ совмСстимыми. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, систСмС PPX Π² OCaml Π½ΡƒΠΆΠ½Π° ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ инфраструктура для ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π² парсинга Π²/ΠΈΠ· языковой вСрсии, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ макросом. Π’ Rust Π΅ΡΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ parsing ΠΈ quotation, поэтому Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ стилС, Ρ‡Ρ‚ΠΎ ΠΈ Π² синтаксисС макросов синтаксичСских Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π². А Π΅Ρ‰Ρ‘ Π² Rust Π΅ΡΡ‚ΡŒ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, которая пытаСтся Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйс, прСдоставляСмыС рСфлСксиСй!

Π¨Π°Π±Π»ΠΎΠ½Ρ‹

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

Π’ C++20 Π΅ΡΡ‚ΡŒ Β«ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚Ρ‹Β», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ слуТат для Ρ‚ΠΎΠΉ ΠΆΠ΅ Ρ†Π΅Π»ΠΈ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΡ… Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° большС ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ интСрфСйсов ΠΈ ограничСния Ρ‚ΠΈΠΏΠΎΠ².

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ этапа компилирования

Π•ΡΡ‚ΡŒ языки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅Ρ‰Ρ‘ дальшС Ρ€Π°Π·Π²ΠΈΠ²Π°ΡŽΡ‚ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ Β«Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ этапа компилирования». НапримСр, Zig:

Π‘Π΅Π·ΡƒΠΌΠ½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ мСтапрограммирования Π² Terra позволяСт Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ простых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ компиляторы для ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… (domain specific) языков, ΠΈΠ»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ интСрфСйсныС ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ систСмы Java ΠΈ Go Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ с малСньким количСством ΠΊΠΎΠ΄Π°. И Π·Π°Ρ‚Π΅ΠΌ Π² Terra ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ сгСнСрированный Π² Ρ…ΠΎΠ΄Π΅ runtime ΠΊΠΎΠ΄ Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², Π½Π΅ содСрТащих зависимости.

Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Π² Rust

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ ΠΌΠΎΠ½ΠΎΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ² пСрСносит Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π² компиляторС Π΅Ρ‰Ρ‘ дальшС, послС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ². Π― ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π», Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ Π²Π½ΡƒΡ‚Ρ€ΠΈΠ±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… ошибок, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π² Π‘++, ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° ошибки Π² динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ языкС. Π­Ρ‚ΠΎ слСдствиС Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… шаблонов, ΠΏΠΎ сути, Π΅ΡΡ‚ΡŒ лишь ΠΎΠ΄ΠΈΠ½ Π²ΠΈΠ΄ Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠ°ΠΊ динамичСский язык. А Π·Π½Π°Ρ‡ΠΈΡ‚ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² систСму Ρ‚ΠΈΠΏΠΎΠ² Π½Π° ΠΌΠ΅Ρ‚Π°ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΈ примСняя ΠΌΠ½ΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΎΠ² Ρ‚ΠΈΠΏΠΎΠ² со статичСской ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π²Π°ΠΌΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. Π’Π°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Π² Rust, ΠΈ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ языка β€” Π² Swift ΠΈ Haskell.

Π’ Rust Π½ΡƒΠΆΠ½ΠΎ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ Β«Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠ²Β» (trait bounds). Trait β€” это ΠΊΠ°ΠΊ интСрфСйсы Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… языках, ΠΎΠ½ΠΈ ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ Π½Π°Π±ΠΎΡ€ возмоТностСй, прСдоставляСмых Ρ‚ΠΈΠΏΠΎΠΌ. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Rust ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚, Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ Ρ‚Π΅Π»ΠΎ Π²Π°ΡˆΠΈΡ… Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π»ΡŽΠ±Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Π³Ρ€Π°Π½ΠΈΡ†Π°ΠΌ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠ², ΠΈ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ возмоТности Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π² этих Π³Ρ€Π°Π½ΠΈΡ†Π°Ρ…. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Rust Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ ошибок компиляции ΠΏΡ€ΠΈ создании экзСмпляров Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, компилятору достаточно лишь ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Ρ‚ΠΈΠΏΠΎΠ² для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

На ΡƒΡ€ΠΎΠ²Π½Π΅ языка это ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° Ρ‚Π°ΠΊΡƒΡŽ Ρ€Π°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒ систСмы Ρ‚ΠΈΠΏΠΎΠ², которая Π½ΡƒΠΆΠ½Π° для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ² с интСрфСйсной ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ². ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Rust ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΠ±Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠΉ систСмы. Π’ Rust 2018 Π΄Π°ΠΆΠ΅ появился ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ синтаксис, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ v: &impl SomeTrait получаСтся ΠΌΠΎΠ½ΠΎΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ, Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ v: &dyn SomeTrait ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΡƒ. Π­Ρ‚ΠΎ свойство позволяСт компиляторам Π²Ρ€ΠΎΠ΄Π΅ GHC Π² Swift ΠΈ Haskell ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ½ΠΎΠΌΠΎΡ€Ρ„ΠΈΠ·Π°Ρ†ΠΈΡŽ Π² качСствС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, Π΄Π°ΠΆΠ΅ хотя ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΡƒ.

ΠœΠΎΠ½ΠΎΠΌΠΎΡ€Ρ„ΠΈΠ·Π°Ρ†ΠΈΡ машинного ΠΊΠΎΠ΄Π°

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ логичСский шаг Π² модСлях ΠΌΠΎΠ½ΠΎΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ² β€” это пСрСнСсти ΠΈΡ… Π² компиляторах Π½Π° Π΅Ρ‰Ρ‘ Π±ΠΎΠ»Π΅Π΅ позднюю ΡΡ‚Π°Π΄ΠΈΡŽ, послС бэкСнда. Как ΠΌΡ‹ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ исходного ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π·Π°Π³Π»ΡƒΡˆΠΊΠ°ΠΌΠΈ (placeholders) для Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-Ρ‚ΠΈΠΏΠΎΠ², Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ с Π·Π°Π³Π»ΡƒΡˆΠΊΠ°ΠΌΠΈ для частСй, относящихся ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠ°ΠΌ. А Π·Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡ‡Π΅Π½ΡŒ быстро Π½Π°ΡˆΡ‚Π°ΠΌΠΏΠΎΠ²Π°Ρ‚ΡŒ эти ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ memcpy ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ°Ρ‚Ρ‡Π΅ΠΉ, словно Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ! НСдостатком являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ½ΠΎΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠΏΠΈΠΈ нСльзя ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Однако благодаря ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΡŽ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ² ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π³ΠΎΡ€Π°Π·Π΄ΠΎ быстрСС. ΠœΡ‹ Π΄Π°ΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊΠΎΠ΄Π° Π² малСнький JIT, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒΡΡ Π² Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊΠΈ ΠΈ Π² Ρ…ΠΎΠ΄Π΅ исполнСния Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ½ΠΎΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠΏΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Ρ€Π°Π·Π΄ΡƒΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Ρ„Π°ΠΉΠ»ΠΎΠ².

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

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

Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Π² TypeScript: разбираСмся вмСстС

ВсСм ΠΏΡ€ΠΈΠ²Π΅Ρ‚! Команда TestMace ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅Ρ‚ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΈΠ· ΠΌΠΈΡ€Π° web-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. На этот Ρ€Π°Π· для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ²! ΠŸΡ€ΠΈΡΡ‚Π½ΠΎΠ³ΠΎ чтСния.

Π Π°Π·Π²Π΅Π΅ΠΌ ΠΏΠ΅Π»Π΅Π½Ρƒ таинствСнности ΠΈ нСдопонимания Π½Π°Π΄ синтаксисом ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ† подруТимся с Π½ΠΈΠΌ

Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π€ΠΎΡ‚ΠΎ Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

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

Π― Π±Ρ‹ Ρ…ΠΎΡ‚Π΅Π» ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π²Π°ΠΌ, Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ всё Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅, Ρ‡Π΅ΠΌ каТСтся. Π― Π΄ΠΎΠΊΠ°ΠΆΡƒ, Ρ‡Ρ‚ΠΎ Ссли Π²Ρ‹ способны Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° JavaScript Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ, Ρ‚ΠΎ Π²Ρ‹ смоТСтС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Π±Π΅Π· Π»ΠΈΡˆΠ½ΠΈΡ… усилий. ΠŸΠΎΠ΅Ρ…Π°Π»ΠΈ!

Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Π² TypeScript

Π’ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ TypeScript приводится ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅: «Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ β€” это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΎΠ΄Π½ΠΈΠΌ, Π° с нСсколькими Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…».

Π—Π΄ΠΎΡ€ΠΎΠ²ΠΎ! Π—Π½Π°Ρ‡ΠΈΡ‚, основная идСя состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π½Π°ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΈΠ΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… ΠΈΠΌ Π΄Π°Π½Π½Ρ‹Ρ…. Но ΠΊΠ°ΠΊ это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ? Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ я Π΄ΡƒΠΌΠ°ΡŽ.

Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ ΠΈ Ρ‚ΠΈΠΏΡ‹ соотносятся Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ, ΠΊΠ°ΠΊ значСния ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ способ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ (функциям, классам ΠΈΠ»ΠΈ интСрфСйсам), ΠΊΠ°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΈΡ… Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π²ΠΎ врСмя Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΡ‹ сообщаСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠ°ΠΊΠΈΠ΅ значСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

Π›ΡƒΡ‡ΡˆΠ΅ всСго Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ это Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠ° тоТдСствСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ВоТдСствСнная функция β€” это функция, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π°Ρ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π² Π½Π΅Ρ‘ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Π’ JavaScript ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π‘Π΄Π΅Π»Π°Π΅ΠΌ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Π»Π° с числами:

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

Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π€ΠΎΡ‚ΠΎ Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π€ΠΎΡ‚ΠΎ Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½Π° Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ-Ρ‚ΠΎ синтаксис Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ² Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ вас ΠΏΡƒΠ³Π°Ρ‚ΡŒ. T ΠΈ U β€” это просто ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Π½Π°Π·Π½Π°Ρ‡Π°Π΅Ρ‚Π΅ сами. ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ вмСсто Π½ΠΈΡ… ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΈΠΏΡ‹, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ данная функция.

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Π°Ρ вСрсия понимания ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ² состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² зависимости ΠΎΡ‚ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…. На Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ Π½ΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ мСняСтся запись Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ‚ΠΈΠΏΠ°.

Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π€ΠΎΡ‚ΠΎ Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Как ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, функция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ любой Ρ‚ΠΈΠΏ, Ρ‡Ρ‚ΠΎ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠ°ΠΊ ΠΈ Π±Ρ‹Π»ΠΎ ΠΎΠ±Π΅Ρ‰Π°Π½ΠΎ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ особоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹Π·ΠΎΠ² console.log Π½Π° Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ Π²Ρ‹ΡˆΠ΅ β€” Π² Π½Π΅Π³ΠΎ Π½Π΅ пСрСдаётся Ρ‚ΠΈΠΏ. Π’ этом случаС TypeScript попытаСтся Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΏΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ.

ΠžΠ±ΠΎΠ±Ρ‰Ρ‘Π½Π½Ρ‹Π΅ классы ΠΈ интСрфСйсы

Π’Π°ΠΌ ΡƒΠΆΠ΅ извСстно, Ρ‡Ρ‚ΠΎ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ β€” это всСго лишь способ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚. Волько Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с функциями, ΠΈ Ρƒ мСня Ρ…ΠΎΡ€ΠΎΡˆΠΈΠ΅ новости: с классами ΠΈ интСрфСйсами ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π’ этом случаС ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² слСдуСт послС ΠΈΠΌΠ΅Π½ΠΈ интСрфСйса ΠΈΠ»ΠΈ класса.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ сами. НадСюсь, Ρƒ вас ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ.

Если ΠΊΠΎΠ΄ сразу Π½Π΅ понятСн, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΎΡ‚ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ значСния type свСрху Π²Π½ΠΈΠ· Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ дСйствий ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ:

Π Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ случаи использования: Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ Π·Π° Ρ€Π°ΠΌΠΊΠΈ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ выполнСния Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚:

ПодвСдСм ΠΈΡ‚ΠΎΠ³ΠΈ

НадСюсь, я ΠΏΠΎΠΌΠΎΠ³ Π²Π°ΠΌ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠ°ΠΌΠΈ. Π—Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, всё, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, β€” это всСго лишь ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ type Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ πŸ™‚

Если Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π΅Ρ‰Ρ‘ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ, я ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠΈΠ» Π΄Π°Π»Π΅Π΅ ΠΏΠ°Ρ€Ρƒ ссылок.

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

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

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