Π Π°Π·Π½ΠΎΠ΅

ΠœΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ c: ΠœΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² C++ / Π₯Π°Π±Ρ€

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

Ρ‡Π΅Ρ€Π΅Π· страдания ΠΊ ΠΏΡ€ΠΎΡΠ²Π΅Ρ‚Π»Π΅Π½ΠΈΡŽ / Π₯Π°Π±Ρ€

#define variant_TL1( T1 ) detail::typelist< T1, detail::nulltype >
#define variant_TL2( T1, T2) detail::typelist< T1, variant_TL1( T2) >
#define variant_TL3( T1, T2, T3) detail::typelist< T1, variant_TL2( T2, T3) >
#define variant_TL4( T1, T2, T3, T4) detail::typelist< T1, variant_TL3( T2, T3, T4) >
#define variant_TL5( T1, T2, T3, T4, T5) detail::typelist< T1, variant_TL4( T2, T3, T4, T5) >
#define variant_TL6( T1, T2, T3, T4, T5, T6) detail::typelist< T1, variant_TL5( T2, T3, T4, T5, T6) >
#define variant_TL7( T1, T2, T3, T4, T5, T6, T7) detail::typelist< T1, variant_TL6( T2, T3, T4, T5, T6, T7) >
#define variant_TL8( T1, T2, T3, T4, T5, T6, T7, T8) detail::typelist< T1, variant_TL7( T2, T3, T4, T5, T6, T7, T8) >
#define variant_TL9( T1, T2, T3, T4, T5, T6, T7, T8, T9) detail::typelist< T1, variant_TL8( T2, T3, T4, T5, T6, T7, T8, T9) >
#define variant_TL10( T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) detail::typelist< T1, variant_TL9( T2, T3, T4, T5, T6, T7, T8, T9, T10) >
#define variant_TL11( T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) detail::typelist< T1, variant_TL10( T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) >
#define variant_TL12( T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) detail::typelist< T1, variant_TL11( T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) >
#define variant_TL13( T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) detail::typelist< T1, variant_TL12( T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) >
#define variant_TL14( T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) detail::typelist< T1, variant_TL13( T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) >
#define variant_TL15( T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) detail::typelist< T1, variant_TL14( T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) >
#define variant_TL16( T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) detail::typelist< T1, variant_TL15( T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) >

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΌΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅?

ΠΌΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ относится ΠΊ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ способам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ знаниями ΠΎ сСбС ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ собой.

Π² Ρ‚Π°ΠΊΠΈΡ… языках, ΠΊΠ°ΠΊ C#, ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ являСтся Ρ„ΠΎΡ€ΠΌΠΎΠΉ мСтапрограммирования, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ сСбС. НапримСр, Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ списка всСх свойств ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Π² Ρ‚Π°ΠΊΠΈΡ… языках, ΠΊΠ°ΠΊ ActionScript, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ†Π΅Π½ΠΈΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎ врСмя выполнСния для создания Π½ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ eval(«x» + i).DoSomething () повлияСт Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с ΠΈΠΌΠ΅Π½Π΅ΠΌ x1, ΠΊΠΎΠ³Π΄Π° i Ρ€Π°Π²Π½ΠΎ 1 ΠΈ x2, ΠΊΠΎΠ³Π΄Π° i Ρ€Π°Π²Π½ΠΎ 2.

Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° распространСнная Ρ„ΠΎΡ€ΠΌΠ° мСтапрограммирования — это ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. LISP Ρ…ΠΎΡ€ΠΎΡˆΠΎ извСстСн этим ΠΈ являСтся Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Пол Грэм отстаивал ΠΎΠΊΠΎΠ»ΠΎ дСсяти Π»Π΅Ρ‚ Π½Π°Π·Π°Π΄. МнС придСтся ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π΅Π³ΠΎ эссС. Но идСя Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° основС Π΅Π΅ состояния. Π­Ρ‚ΠΎ позволяСт ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ гибкости ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π²ΠΎ врСмя выполнСния, Ρ‡Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ слоТно Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ популярных языки сСгодня.

Ρ‚Π°ΠΊΠΆΠ΅ стоит ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² старыС Π΄ΠΎΠ±Ρ€Ρ‹Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π° программирования Π² прямой сборкС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ сСбя Π²ΠΎ врСмя выполнСния, Π±Ρ‹Π»ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ ΠΈ ΠΎΡ‡Π΅Π½ΡŒ распространСны.

ΠΈΠ· эссС Пола Грэма «Π§Ρ‚ΠΎ Π‘Π΄Π΅Π»Π°Π»ΠΎ Lisp Π”Ρ€ΡƒΠ³ΠΈΠΌ»:

ΠΌΠ½ΠΎΠ³ΠΈΠ΅ языки ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ называСтся
макрос. Но макросы Lisp ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹. И
Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Π΅Ρ€ΡŒΡ‚Π΅, Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π½Π΅Ρ‚, Π½ΠΎ ΠΎΠ½ΠΈ
связано с ΠΊΡ€ΡƒΠ³Π»Ρ‹ΠΌΠΈ скобками. Π­Ρ‚ΠΎΡ‚
Π΄ΠΈΠ·Π°ΠΉΠ½Π΅Ρ€Ρ‹ Lisp Π½Π΅ Π·Π°Π±Ρ‹Ρ‚ΡŒ
ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки Π² языкС просто
ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΠΉΡΡ. К программисту Blub,
Код Lisp выглядит странно. Но эти
скобки Ρ‚Π°ΠΌ Π½Π΅ просто Ρ‚Π°ΠΊ.
Они ΡΠ²Π»ΡΡŽΡ‚ΡΡ внСшним ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎΠΌ
ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½Π°Ρ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Лиспом
ΠΈ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… языках.

ΠΊΠΎΠ΄ Lisp сдСлан ΠΈΠ· Π΄Π°Π½Π½Ρ‹Ρ… Lisp
ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. И Π½Π΅ Π² Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ смыслС
Ρ‡Ρ‚ΠΎ исходныС Ρ„Π°ΠΉΠ»Ρ‹ содСрТат
символы ΠΈ строки ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ·
Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ языком.
Код Лиспа, послС Π΅Π³ΠΎ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚
Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, состоит ΠΈΠ· структур Π΄Π°Π½Π½Ρ‹Ρ…
Ρ‡Ρ‚ΠΎ Ρ‚Ρ‹ моТСшь ΠΏΡ€ΠΎΠΉΡ‚ΠΈ.

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

ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΈΡˆΡƒΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹? Когда
Ρ‚Ρ‹ Π±Ρ‹ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π·Π°Ρ…ΠΎΡ‚Π΅Π» это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ? НС
ΠΎΡ‡Π΅Π½ΡŒ часто, Ссли Π²Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅ Π² Cobol. ВсС
врСмя, Ссли Π΄ΡƒΠΌΠ°Ρ‚ΡŒ шСпСляво. Он
Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Ссли Π±Ρ‹ я ΠΌΠΎΠ³
ΠΏΡ€ΠΈΠ²Π΅Π΄ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠΎΡ‰Π½ΠΎΠ³ΠΎ макроса,
ΠΈ скаТи Ρ‚Π°ΠΌ! ΠΊΠ°ΠΊ насчСт этого? Но Ссли
Π― сдСлал, это Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ
Ρ‚Π°Ρ€Π°Π±Π°Ρ€Ρ‰ΠΈΠ½Π° для Ρ‚ΠΎΠ³ΠΎ, ΠΊΡ‚ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚
Π¨Π΅ΠΏΠ΅Π»ΡΠ²ΠΈΡ‚ΡŒ; здСсь Π½Π΅Ρ‚ мСста ΠΎΠ±ΡŠΡΡΠ½ΡΡ‚ΡŒ.
всС, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹
понимаю, Ρ‡Ρ‚ΠΎ это Π·Π½Π°Ρ‡ΠΈΡ‚. Π’ Ansi
Common Lisp я пытался ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π²Π΅Ρ‰ΠΈ
Ρ‚Π°ΠΊ быстро, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠΎΠ³, ΠΈ Π΄Π°ΠΆΠ΅ Ρ‚Π°ΠΊ.
Π― Π½Π΅ макросы, ΠΏΠΎΠΊΠ° страница 160.

Π½ΠΎ я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ³Ρƒ Π΄Π°Ρ‚ΡŒ своСго Ρ€ΠΎΠ΄Π°
Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ. Π­Ρ‚ΠΎΡ‚
исходный ΠΊΠΎΠ΄ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° Viaweb Π±Ρ‹Π»
вСроятно, ΠΎΠΊΠΎΠ»ΠΎ 20-25% макросы. ΠœΠ°ΠΊΡ€ΠΎΡΡ‹
Ρ‚Ρ€ΡƒΠ΄Π½Π΅Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ, Ρ‡Π΅ΠΌ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Lisp
Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈ считаСтся, Ρ‡Ρ‚ΠΎ
ΠΏΠ»ΠΎΡ…ΠΎΠΉ ΡΡ‚ΠΈΠ»ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ…, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ Π½Π΅
Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ макрос Π² этот ΠΊΠΎΠ΄
Π΅ΡΡ‚ΡŒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ. Π§Ρ‚ΠΎ?
это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ 20-25%
ΠΊΠΎΠ΄ Π² этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π΄Π΅Π»Π°Π΅Ρ‚
Π²Π΅Ρ‰ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ‹ Π½Π΅ моТСшь Π»Π΅Π³ΠΊΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π² любом
Π΄Ρ€ΡƒΠ³ΠΎΠΉ язык. Однако скСптичСски
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚ Ρ€Π΅Π²Π΅Ρ‚ΡŒ, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, ΠΎ ΠΌΠΎΠ΅ΠΌ
ΠΏΡ€Π΅Ρ‚Π΅Π½Π·ΠΈΠΈ Π½Π° таинствСнныС силы
ШСпСлявит, это Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρƒ Π½Π΅Π³ΠΎ Π»ΡŽΠ±ΠΎΠΏΡ‹Ρ‚ΡΡ‚Π²ΠΎ.
ΠœΡ‹ Π½Π΅ писали этот ΠΊΠΎΠ΄ для Π½Π°ΡˆΠΈΡ…
собствСнноС Ρ€Π°Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅. ΠœΡ‹ Π±Ρ‹Π»ΠΈ ΠΊΡ€ΠΎΡˆΠ΅Ρ‡Π½Ρ‹ΠΌ стартапом.,
ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΠ΅ΠΌ Ρ‚Π°ΠΊ усСрдно, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠΎΠΆΠ΅ΠΌ.
порядок возвСдСния тСхничСских Π±Π°Ρ€ΡŒΠ΅Ρ€ΠΎΠ²
ΠΌΠ΅ΠΆΠ΄Ρƒ Π½Π°ΠΌΠΈ ΠΈ нашими ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Ρ‹.

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

ΠœΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ β€” ВикипСдия

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» ΠΈΠ· Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ β€” свободной энциклопСдии

ΠœΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅Β β€” Π²ΠΈΠ΄ программирования, связанный с созданиСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ своСй Ρ€Π°Π±ΠΎΡ‚Ρ‹[1] (Π² частности, Π½Π° стадии компиляции ΠΈΡ… исходного ΠΊΠΎΠ΄Π°), Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Π½ΡΡŽΡ‚ сСбя Π²ΠΎ врСмя выполнСния (ΡΠ°ΠΌΠΎΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉΡΡ ΠΊΠΎΠ΄).[источник Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ 3387 Π΄Π½Π΅ΠΉ] ΠŸΠ΅Ρ€Π²ΠΎΠ΅ позволяСт ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΡ€ΠΈ ΠΌΠ΅Π½ΡŒΡˆΠΈΡ… Π·Π°Ρ‚Ρ€Π°Ρ‚Π°Ρ… Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ усилий Π½Π° ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Ρ‡Π΅ΠΌ Ссли Π±Ρ‹ программист писал ΠΈΡ… Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ, Π²Ρ‚ΠΎΡ€ΠΎΠ΅ позволяСт ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ свойства ΠΊΠΎΠ΄Π° (Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ быстродСйствиС).

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

ΠŸΡ€ΠΈ этом ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, Π° создаётся автоматичСски ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ Π½Π° основС Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

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

Π Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Π΄Π²Π° ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π²ΠΈΠ΄Π° ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ:

  1. Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ являСтся физичСски ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ, Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ написанной Π½Π° Ρ†Π΅Π»Π΅Π²ΠΎΠΌ языкС.
  2. Ρ†Π΅Π»Π΅Π²ΠΎΠΉ язык являСтся ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ языком Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° составляСт с Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅.

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

Π”Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ синтаксичСских ΠΈ лСксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ², Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Lex, YACC, ANTLR, bison.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ случай прСдставляСт собой встраиваниС языка ΠΈ рСализуСтся трСмя статичСскими ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ c использованиСм макросрСдств языка ΠΈΠ»ΠΈ чистым встраиваниСм. Π’ этом случаС Π½Π°Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½Ρ‹Π΅ Π² процСссС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΌΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Π² дальнСйшСм ΠΌΠΎΠ³ΡƒΡ‚ интСнсивно ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½ΠΎΠ²Ρ‹Ρ… ΠΌΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ[2].

Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

  • Π’ Perl сущСствуСт понятиС Β«source filtersΒ» (Β«Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ² исходного ΠΊΠΎΠ΄Π°Β»)Β β€” ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² с исходным ΠΊΠΎΠ΄ΠΎΠΌ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΌΠ΅Π½ΡΡ‚ΡŒ синтаксис ΠΈ сСмантику языка. Одним ΠΈΠ· извСстных ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² являСтся ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Lingua::Romana::Perligata, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ Perl Π½Π° Π»Π°Ρ‚Ρ‹Π½ΠΈ.[3]
  • Π’ Π€ΠΎΡ€Ρ‚ программисту ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ встроСнныС Π² язык возмоТности ΠΏΠΎ измСнСнию своСго синтаксиса ΠΈ сСмантики. Π­Ρ‚ΠΎ достигаСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΈ ΠΏΠΎΠ»Π½Ρ‹ΠΌ доступом ΠΊ возмоТностям измСнСния Π΅Ρ‘ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ….

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

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

  • Π“ΠΎΠΌΠΎΠΈΠΊΠΎΠ½Π½ΠΎΡΡ‚ΡŒΒ β€” инструкции ΠΏΠΎ самоидСнтификации ΠΈΠ»ΠΈ измСнСнию ΠΊΠΎΠ΄Π° ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π° Ρ‚ΠΎΠΌ ΠΆΠ΅ синтаксисС, Ρ‡Ρ‚ΠΎ ΠΈ сам ΠΊΠΎΠ΄.
  • Π˜Π½Ρ‚Ρ€ΠΎΡΠΏΠ΅ΠΊΡ†ΠΈΡΒ β€” прСдставлСниС Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… структур языка Π² Π²ΠΈΠ΄Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… встроСнных Ρ‚ΠΈΠΏΠΎΠ² с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ доступа ΠΊ Π½ΠΈΠΌ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… Π‘++ это Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ тСхнологиям динамичСского ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ° ΠΈ динамичСского привСдСния Ρ‚ΠΈΠΏΠΎΠ²).
ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ, ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ опрСдСлСния Ρ‚ΠΈΠΏΠΎΠ², стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΠΎΠΌΡƒ динамичСски ΠΈ ΠΏΡ€.

  • ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²ΠΎ ΠΈΠΌΡ‘Π½ System.Reflection ΠΈ Ρ‚ΠΈΠΏ System.Type Π² .NET; классы Class, Method, Field Π² Java; прСдставлСниС пространств ΠΈΠΌΠ΅Π½ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· встроСнныС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π² Python; стандартныС встроСнныС возмоТности Π² Π€ΠΎΡ€Ρ‚ ΠΏΠΎ доступу ΠΊ рСсурсам Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹; ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ значСния ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ свойств ΠΏΠΎΡ‡Ρ‚ΠΈ любого ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² ECMAScript (с ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΊΠ°ΠΌΠΈ).
  • Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, прСдставлСнного Π² Π²ΠΈΠ΄Π΅ строки.
    • БущСствуСт СстСствСнным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π²ΠΎ мноТСствС ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… языков (Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ функция eval Π±Ρ‹Π»Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² Lisp, Π° Ρ‚ΠΎΡ‡Π½Π΅Π΅, нСпосрСдствСнно ΠΏΠ΅Ρ€Π΅Π΄ Π½ΠΈΠΌ, ΡΡ‚Π°Π²ΡˆΠΈΠΌ Π΅Ρ‘ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ).
    • ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Tiny C позволяСт Β«Π½Π° Π»Π΅Ρ‚ΡƒΒ» ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° языкС C, прСдставлСнный Π² Π²ΠΈΠ΄Π΅ строки символов.
    • Для Π€ΠΎΡ€Ρ‚ использования ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ ΠΈΠ· строки EVALUATE.

Π’ языкС ΠŸΡ€ΠΎΠ»ΠΎΠ³ ΠΌΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ позволяСт Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΈ Π²Π΅Ρ€ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ (ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ свойств) ΠŸΡ€ΠΎΠ»ΠΎΠ³-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. ΠœΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° ΠŸΡ€ΠΎΠ»ΠΎΠ³Π΅ ΠΊΠ°ΠΊ Ρ‚Π΅Ρ€ΠΌΡ‹ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… свойства ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ, ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ для управлСния Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠŸΡ€ΠΎΠ»ΠΎΠ³-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ[4].

Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ

Бсылки

Π”Π΅ΡΡΡ‚ΡŒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ мСтапрограммирования | Записки программиста

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π”Π°Π»Π΅Π΅ ΠΏΠΎΠ΄ макросами ΠΈ шаблонами я Π±ΡƒΠ΄Ρƒ ΠΈΠΌΠ΅Ρ‚ΡŒ Π² Π²ΠΈΠ΄Ρƒ срСдства мСтапрограммирования, Π½Π΅ привязанныС ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ языку. Π­Ρ‚ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ макросы Π² Clojure ΠΈΠ»ΠΈ Scala, ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ Π² Haskell, parse_transform ΠΈ, ΠΎΠΏΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈ, макросы Π² Erlang, ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ Π² C++ ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. ВсС эти срСдства ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΎΠ± ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅.

  1. Π’ΠΎΠΎΠ±Ρ‰Π΅, Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π±Π΅Π· макросов. МнС Π² Π³ΠΎΠ»ΠΎΠ²Ρƒ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ макросы 1-2 Ρ€Π°Π·Π°, ΠΈ Ρ‚ΠΎ Π·Π°Π΄Π°Ρ‡Ρƒ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΈΠ½Π°Ρ‡Π΅. ΠŸΠΎΡ‡Ρ‚ΠΈ всСгда ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π½Π° самом Π΄Π΅Π»Π΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ срСдствами языка.
  2. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ использованиС макросов всСгда ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ сущСствСнному ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΡŽ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π’Π°ΠΊΠΆΠ΅ сущСствСнно ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ трСбования ΠΊ рСсурсам, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌ для компиляции, Π² особСнности ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти;
  3. Никто Π½Π΅ отмСнял ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ. НапримСр, Thrift, Protobuf ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ Π΄Π΅Π»Π°ΡŽΡ‚ Π² сущности Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡ‚ макросов. Если ΠΆΠ΅ Ρ‚Π°ΠΊΠΈΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΠ»ΠΎΡ…ΠΎ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ с вашСй систСмой сборки ΠΈΠ»ΠΈ IDE, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, просто Ρƒ вас фиговая систСма сборки ΠΈΠ»ΠΈ IDE.
  4. Допустим, ΠΊΠΎΠ΄, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ шаблонов ΠΈΠ»ΠΈ макросов, бросит ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. КакиС Π½ΠΎΠΌΠ΅Ρ€Π° строк Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Π² стэктрСйсС? Π‘ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ Π»Π΅Π³ΠΊΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ ΠΈ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π΅Π΅, особСнно, Ссли ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ написан ΠΊΠ΅ΠΌ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ?
  5. Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹, Ρ‚ΠΎ скорСС всСго сломаСтС ΠΌΠΎΠ·Π³ своСй любимой IDE. Допустим, шаблон Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ Π½ΠΈΡ…, IDE Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ встроСнный ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ вашСго языка программирования. Π‘ΠΊΠΎΡ€Π΅Π΅ всСго, ΠΎΠ½Π° Π΅Π³ΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚, Π° Π·Π½Π°Ρ‡ΠΈΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°Ρ‚ΡŒ сгСнСрированныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ красным, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² ΠΊΠΎΠ΄Π΅ ΠΈΡ… ΠΊΠ°ΠΊ Π±Ρ‹ ΠΈ Π½Π΅Ρ‚.
  6. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ Π·Π°ΠΌΠ°ΡΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ шаблонов Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°. Π•ΡΡ‚ΡŒ ΠΌΠ΅Π½Π΅Π΅ Ρ€Π°Π΄ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ способы Π±ΠΎΡ€ΡŒΠ±Ρ‹ с code smell. Π”ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда ΠΌΠΎΠΆΠ½ΠΎ вынСсти Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹. Или ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΠ΅ΡΡ части, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² лямбду.
  7. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ программистов просто Π½Π΅ ΡƒΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с макросами ΠΈ шаблонами. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ ΠΎΠ΄Π½ΠΈ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅. Π”Π°ΠΆΠ΅ Ссли ваши ΠΊΠΎΠ»Π»Π΅Π³ΠΈ Π·Π½Π°ΡŽΡ‚ макросы, всС Ρ€Π°Π²Π½ΠΎ ΠΈΡ… использованиС сущСствСнно услоТнит ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΊΠΎΠ΄Π°.
  8. Π—Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ макросы ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ странных ΠΈ нСпонятных ошибок. НапримСр, Π² Erlang Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ beam с ΠΊΠ°ΠΊΠΈΠΌΠΈ-Ρ‚ΠΎ макросами, Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ объявлСн этот макрос, ΠΈ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΎΡΡ‚Π°Π»ΡŒΠ½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΡƒΠΆΠ΅ с Π΄Ρ€ΡƒΠ³ΠΈΠΌ макросом. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΏΠΎΡ‚ΠΎΠΌ ΠΎΡ‚Π»Π°Π΄ΠΈΡ‚ΡŒ ошибки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ посыпятся! Или, допустим, макрос ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя. Π’Ρ‹ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· скомпилировали ΠΊΠΎΠ΄, ΠΎΠ½ Π·Π°ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π»ΡΡ. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ пСрСсобираСтС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅, ΠΏΠΎΡ‡Π΅ΠΌΡƒ врСмя Π½Π΅ измСняСтся.
  9. НСрСдко макросы β€” это Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Π°Ρ ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ Ρ„ΠΈΡ‡Π° языка. Π’ Scala ΠΈ Ρ‚Π°ΠΊ всС постоянно мСняСтся, Π° Π²Ρ‹ Π΅Ρ‰Π΅ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚Π΅ Π²Π·ΡΡ‚ΡŒ макросы. Π’ Template Haskell Ρ‚ΠΎΠΆΠ΅ Π²ΠΎΠ½ всС помСнялось, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ‚Π°ΠΌ Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ макросы. Плюс ΠΊ этому Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ макросов Π½Π΅Ρ€Π΅Π΄ΠΊΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ ΠΌΠ΅Π»ΠΊΠΈΠ΅ косяки ΠΈ нСудобства. Π’Π°ΠΊ Π² Template Haskell шаблон Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ объявлСн ΠΈ использован Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅.
  10. Π’Ρ‹ ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π°Π΅Ρ‚Π΅ ΠΊΡƒΡ‡Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… DSL. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ язык ΠΏΡ€ΠΈ этом, понятноС Π΄Π΅Π»ΠΎ, отличаСтся ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ…. ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ просто Π½Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ языкС? ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, ΠΎΠ½ просто нСдостаточно Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»Π΅Π½ ΠΈ слСдуСт Π½Π°ΠΉΡ‚ΠΈ язык ΠΏΠΎΠ»ΡƒΡ‡ΡˆΠ΅?

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, минусов Ρƒ мСтапрограммирования масса, ΠΈ, ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠΎ ΠΏΡ€Π°Π²Π΄Π΅, я Π½Π΅ Π²ΠΈΠΆΡƒ сущСствСнных плюсов.

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

А ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ ΠΌΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² своСй Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΈ Ссли Π΄Π°, Ρ‚ΠΎ Π² ΠΊΠ°ΠΊΠΈΡ… Π·Π°Π΄Π°Ρ‡Π°Ρ…?

ΠœΠ΅Ρ‚ΠΊΠΈ: Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°, Ѐилософия.

ΠœΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ β€” ВикипСдия

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» ΠΈΠ· Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ β€” свободной энциклопСдии

ΠœΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅Β β€” Π²ΠΈΠ΄ программирования, связанный с созданиСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ своСй Ρ€Π°Π±ΠΎΡ‚Ρ‹[1] (Π² частности, Π½Π° стадии компиляции ΠΈΡ… исходного ΠΊΠΎΠ΄Π°), Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Π½ΡΡŽΡ‚ сСбя Π²ΠΎ врСмя выполнСния (ΡΠ°ΠΌΠΎΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉΡΡ ΠΊΠΎΠ΄).[источник Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ 3387 Π΄Π½Π΅ΠΉ] ΠŸΠ΅Ρ€Π²ΠΎΠ΅ позволяСт ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΡ€ΠΈ ΠΌΠ΅Π½ΡŒΡˆΠΈΡ… Π·Π°Ρ‚Ρ€Π°Ρ‚Π°Ρ… Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ усилий Π½Π° ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Ρ‡Π΅ΠΌ Ссли Π±Ρ‹ программист писал ΠΈΡ… Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ, Π²Ρ‚ΠΎΡ€ΠΎΠ΅ позволяСт ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ свойства ΠΊΠΎΠ΄Π° (Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ быстродСйствиС).

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

ΠŸΡ€ΠΈ этом ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, Π° создаётся автоматичСски ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ Π½Π° основС Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

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

Π Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Π΄Π²Π° ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π²ΠΈΠ΄Π° ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ:

  1. Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ являСтся физичСски ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ, Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ написанной Π½Π° Ρ†Π΅Π»Π΅Π²ΠΎΠΌ языкС.
  2. Ρ†Π΅Π»Π΅Π²ΠΎΠΉ язык являСтся ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ языком Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° составляСт с Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅.

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

Π”Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ синтаксичСских ΠΈ лСксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ², Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Lex, YACC, ANTLR, bison.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ случай прСдставляСт собой встраиваниС языка ΠΈ рСализуСтся трСмя статичСскими ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ c использованиСм макросрСдств языка ΠΈΠ»ΠΈ чистым встраиваниСм. Π’ этом случаС Π½Π°Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½Ρ‹Π΅ Π² процСссС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΌΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Π² дальнСйшСм ΠΌΠΎΠ³ΡƒΡ‚ интСнсивно ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½ΠΎΠ²Ρ‹Ρ… ΠΌΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ[2].

Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

  • Π’ Perl сущСствуСт понятиС Β«source filtersΒ» (Β«Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ² исходного ΠΊΠΎΠ΄Π°Β»)Β β€” ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² с исходным ΠΊΠΎΠ΄ΠΎΠΌ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΌΠ΅Π½ΡΡ‚ΡŒ синтаксис ΠΈ сСмантику языка. Одним ΠΈΠ· извСстных ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² являСтся ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Lingua::Romana::Perligata, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ Perl Π½Π° Π»Π°Ρ‚Ρ‹Π½ΠΈ.[3]
  • Π’ Π€ΠΎΡ€Ρ‚ программисту ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ встроСнныС Π² язык возмоТности ΠΏΠΎ измСнСнию своСго синтаксиса ΠΈ сСмантики. Π­Ρ‚ΠΎ достигаСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΈ ΠΏΠΎΠ»Π½Ρ‹ΠΌ доступом ΠΊ возмоТностям измСнСния Π΅Ρ‘ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ….

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

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

  • Π“ΠΎΠΌΠΎΠΈΠΊΠΎΠ½Π½ΠΎΡΡ‚ΡŒΒ β€” инструкции ΠΏΠΎ самоидСнтификации ΠΈΠ»ΠΈ измСнСнию ΠΊΠΎΠ΄Π° ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π° Ρ‚ΠΎΠΌ ΠΆΠ΅ синтаксисС, Ρ‡Ρ‚ΠΎ ΠΈ сам ΠΊΠΎΠ΄.
  • Π˜Π½Ρ‚Ρ€ΠΎΡΠΏΠ΅ΠΊΡ†ΠΈΡΒ β€” прСдставлСниС Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… структур языка Π² Π²ΠΈΠ΄Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… встроСнных Ρ‚ΠΈΠΏΠΎΠ² с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ доступа ΠΊ Π½ΠΈΠΌ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… Π‘++ это Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ тСхнологиям динамичСского ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ° ΠΈ динамичСского привСдСния Ρ‚ΠΈΠΏΠΎΠ²).
ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ, ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ опрСдСлСния Ρ‚ΠΈΠΏΠΎΠ², стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΠΎΠΌΡƒ динамичСски ΠΈ ΠΏΡ€.

  • ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²ΠΎ ΠΈΠΌΡ‘Π½ System.Reflection ΠΈ Ρ‚ΠΈΠΏ System.Type Π² .NET; классы Class, Method, Field Π² Java; прСдставлСниС пространств ΠΈΠΌΠ΅Π½ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· встроСнныС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π² Python; стандартныС встроСнныС возмоТности Π² Π€ΠΎΡ€Ρ‚ ΠΏΠΎ доступу ΠΊ рСсурсам Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹; ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ значСния ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ свойств ΠΏΠΎΡ‡Ρ‚ΠΈ любого ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² ECMAScript (с ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΊΠ°ΠΌΠΈ).
  • Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, прСдставлСнного Π² Π²ΠΈΠ΄Π΅ строки.
    • БущСствуСт СстСствСнным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π²ΠΎ мноТСствС ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… языков (Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ функция eval Π±Ρ‹Π»Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² Lisp, Π° Ρ‚ΠΎΡ‡Π½Π΅Π΅, нСпосрСдствСнно ΠΏΠ΅Ρ€Π΅Π΄ Π½ΠΈΠΌ, ΡΡ‚Π°Π²ΡˆΠΈΠΌ Π΅Ρ‘ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ).
    • ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Tiny C позволяСт Β«Π½Π° Π»Π΅Ρ‚ΡƒΒ» ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° языкС C, прСдставлСнный Π² Π²ΠΈΠ΄Π΅ строки символов.
    • Для Π€ΠΎΡ€Ρ‚ использования ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ ΠΈΠ· строки EVALUATE.

Π’ языкС ΠŸΡ€ΠΎΠ»ΠΎΠ³ ΠΌΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ позволяСт Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΈ Π²Π΅Ρ€ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ (ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ свойств) ΠŸΡ€ΠΎΠ»ΠΎΠ³-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. ΠœΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° ΠŸΡ€ΠΎΠ»ΠΎΠ³Π΅ ΠΊΠ°ΠΊ Ρ‚Π΅Ρ€ΠΌΡ‹ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… свойства ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ, ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ для управлСния Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠŸΡ€ΠΎΠ»ΠΎΠ³-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ[4].

Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ

Бсылки

ΠœΠ΅Ρ‚Π°ΠΊΠ»Π°ΡΡΡ‹ ΠΈ ΠΌΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Python β€” GitJournal

4.5
/
5
(
2

голоса
)

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ сСбС, Ρ‡Ρ‚ΠΎ Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΈΡˆΡƒΡ‚ ΠΊΠΎΠ΄ Π·Π° вас. Π­Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΎ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Π½Π΅ Π½Π°ΠΏΠΈΡˆΡƒΡ‚ вСсь ваш ΠΊΠΎΠ΄!

Π­Ρ‚Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ°, имСнуСмая ΠΌΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, популярна срСди Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ². Π’Π°ΠΊ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ ΠΊΠΎΠ΄Π° ΠΈ ΡƒΠΌΠ½Ρ‹Π΅ возмоТности Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… распространённых Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°Ρ… ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ…, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Ruby On Rails ΠΈΠ»ΠΈ TensorFlow.

Π―Π·Ρ‹ΠΊΠΈ Ρ„ΡƒΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Elixir, Clojure ΠΈ Ruby, извСстны своими возмоТностями мСтапрограммирования. Π’ этом руководствС ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΡ‰ΡŒ мСтапрограммирования Π² Python.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π° написаны для Python 3, Π½ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π° Python 2 с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ исправлСниями.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ мСтакласс Π² Python?

Python β€” это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ язык, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с классами.

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

ВикипСдия довольно Ρ…ΠΎΡ€ΠΎΡˆΠΎ описываСт мСтаклассы:

ΠœΠ΅Ρ‚Π°ΠΊΠ»Π°ΡΡ (Π°Π½Π³Π». Metaclass)Β β€” Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ это класс, экзСмпляры ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΡΠ²Π»ΡΡŽΡ‚ΡΡ классами.

Когда ΠΌΡ‹ опрСдСляСм класс, Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ класс ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Но ΠΊΠ°ΠΊ насчёт самого класса? Π§Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ этот самый ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для класса?

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

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

# hello_metaclass.py
# ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ мСтакласс
# Π­Ρ‚ΠΎΡ‚ мСтакласс добавляСт ΠΌΠ΅Ρ‚ΠΎΠ΄ 'hello' ΠΊ классам, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΌ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅,
# Ρ‚Π΅ классы ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ 'hello' Π±Π΅Π· Π»ΠΈΡˆΠ½ΠΈΡ… усилий
# мСтакласс заботится ΠΎ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° для нас
class HelloMeta(type):  
    # ΠœΠ΅Ρ‚ΠΎΠ΄ hello
    def hello(cls):
        print("greetings from %s, a HelloMeta type class" % (type(cls())))

    # Π’Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ мСтакласс
    def __call__(self, *args, **kwargs):
        # создаём Π½ΠΎΠ²Ρ‹ΠΉ класс ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ
        cls = type.__call__(self, *args)

        # опрСдСляСм Π½ΠΎΠ²Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ hello для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· этих классов
        setattr(cls, "hello", self.hello)

        # Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ класс
        return cls

# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ мСтакласс
class TryHello(object, metaclass=HelloMeta):  
    def greet(self):
        self.hello()

# Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ экзСмпляр мСтакласса. Он Π΄ΠΎΠ»ΠΆΠ΅Π½ автоматичСски ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ hello
# хотя ΠΎΠ½ Π½Π΅ объявлСн Π² классС Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ
# ΠΈΠ½Ρ‹ΠΌΠΈ словами, ΠΎΠ½ объявлСн Π·Π° нас мСтаклассом
greeter = TryHello()  
greeter.greet()

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ запуска этого ΠΊΠΎΠ΄Π° Π½ΠΎΠ²Ρ‹ΠΉ класс TryHello способСн Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ привСтствиС:

greetings from <class '__main__.TryHello'>, a HelloMeta type class

ΠœΠ΅Ρ‚ΠΎΠ΄, отвСтствСнный Π·Π° этот Π²Ρ‹Π²ΠΎΠ΄, Π½Π΅ объявлСн Π² Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ класса. ВмСсто этого мСтакласс, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС HelloMeta, ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ ΠΊΠΎΠ΄ Π²ΠΎ врСмя запуска, Ρ‡Ρ‚ΠΎ сразу связываСт этот ΠΌΠ΅Ρ‚ΠΎΠ΄ с классом.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ это Π² дСйствии, смСло ΠΊΠΎΠΏΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠ΄ Π² консоль Python. Π’Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΡ‡Ρ‚ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ сдСлали Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ части ΠΊΠΎΠ΄Π°. Π£ нас Π΅ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ greeter, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒΡŽ класса TryHello. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ self.hello класса TryHello, хотя этот ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ Π² объявлСнии класса TryHello.

ВмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π΄Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π²Ρ‹Π·ΠΎΠ²Π° Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, TryHello автоматичСски привязываСт этот ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΊ классу, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ HelloMeta ΠΊΠ°ΠΊ Π΅Π³ΠΎ мСтакласс.

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

Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ мСтапрограммирования. ΠœΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ β€” это просто написаниС ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с мСтаклассами ΠΈ схоТиС ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠΈ измСнСния ΠΊΠΎΠ΄Π° Π½Π° Π·Π°Π΄Π½Π΅ΠΌ ΠΏΠ»Π°Π½Π΅.

ΠŸΡ€Π΅ΠΊΡ€Π°ΡΠ½ΠΎ Π² ΠΌΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ вмСсто Π²Ρ‹Π²ΠΎΠ΄Π° исходного ΠΊΠΎΠ΄Π°, ΠΎΠ½ΠΎ Π΄Π°Ρ‘Ρ‚ Π½Π°ΠΌ лишь исполнСниС этого ΠΊΠΎΠ΄Π°. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΎ Β«ΠΌΠ°Π³ΠΈΠΈΒ», происходящСй Π·Π° ΠΊΠ°Π΄Ρ€ΠΎΠΌ.

ΠŸΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ ΠΎ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‚ ΠΊΠΎΠ΄ Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ ΠΊΠ°ΠΊ программисту Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ мСньшС ΠΊΠΎΠ΄Π° для всСго. Π’ΠΎΡ‚ нСсколько ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ²:

Помимо языка Python, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²Ρ€ΠΎΠ΄Π΅ Ruby On Rails(Ruby) ΠΈ Boost(C++) слуТат ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π°Π²Ρ‚ΠΎΡ€Π°ΠΌΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ нСявно ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΈ Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΠ±ΠΎ всСм. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡƒΠΏΡ€ΠΎΡ‰Ρ‘Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ API, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π·Π° программиста, ΠΏΠΈΡˆΡƒΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°.

ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ простота Ρ€Π°Π±ΠΎΡ‚Π°Π»Π° Π·Π° ΠΊΠ°Π΄Ρ€ΠΎΠΌ β€” ΠΊΠ°ΠΊ Ρ€Π°Π· Ρ‚ΠΎ, для Ρ‡Π΅Π³ΠΎ ΠΌΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ встроСно Π² исходный ΠΊΠΎΠ΄ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ².

НСмного Ρ‚Π΅ΠΎΡ€ΠΈΠΈ: разбСрёмся, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ мСтаклассы

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ мСтаклассы Π² Python, Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ Ρ‚ΠΈΠΏΠΎΠ². Π’ΠΈΠΏ β€” это просто Π½ΠΎΠΌΠ΅Π½ΠΊΠ»Π°Ρ‚ΡƒΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² Python.

Найти Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Python REPL (ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹ΠΉ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€), Π΄Π°Π²Π°ΠΉΡ‚Π΅ создадим простой строковый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Π΅Π³ΠΎ Ρ‚ΠΈΠΏ:

>>> day = "Sunday"
>>> print("The type of variable day is %s" % (type(day)))
The type of variable day is <type 'str'>  

Как ΠΈ слСдовало ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ пСрСмСнная day относится ΠΊ Ρ‚ΠΈΠΏΡƒ str, строковому Ρ‚ΠΈΠΏΡƒ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ Ρ‚ΠΈΠΏ любого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ type с ΠΎΠ΄Π½ΠΈΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ.

Найти Ρ‚ΠΈΠΏ класса

Π’Π°ΠΊ, строка Π²Ρ€ΠΎΠ΄Π΅ "Sunday" ΠΈΠ»ΠΈ "hello" ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ str, Π½ΠΎ ΠΊΠ°ΠΊ насчёт самого str ? Какой Ρ‚ΠΈΠΏ Ρƒ класса str ?

ΠžΠΏΡΡ‚ΡŒ Π²Π²Π΅Π΄Ρ‘ΠΌ Π² консоль Python:

>>> type(str)
<type 'type'>  

Π’ этот Ρ€Π°Π· ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄: str ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Ρ‚ΠΈΠΏΡƒ type.

Π’ΠΈΠΏ ΠΈ Ρ‚ΠΈΠΏ Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ°

Π§Ρ‚ΠΎ скаТСм ΠΏΡ€ΠΎ сам type? Каков Ρ‚ΠΈΠΏ type?

>>> type(type)
<type 'type'>  

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ снова ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Β«typeΒ». Π’Π°ΠΊ ΠΌΡ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ type Π΅ΡΡ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ мСтакласс для Ρ‚ΠΈΠΏΠΎΠ² Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ int, Π½ΠΎ ΠΈ свой собствСнный мСтакласс!

Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ мСтаклассами

Π—Π΄Π΅ΡΡŒ Π½Π°ΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ. Вспомним, Ρ‡Ρ‚ΠΎ мСтакласс β€” это класс, сущностями ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡΠ²Π»ΡΡŽΡ‚ΡΡ сами классы, Π° Π½Π΅ просто ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. Π’ Python 3 ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ мСтакласс ΠΏΡ€ΠΈ создании Π½ΠΎΠ²ΠΎΠ³ΠΎ класса, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² Π³Π»Π°Π²Π½Ρ‹ΠΉ класс Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ класса.

Π’ΠΈΠΏ type, ΠΊΠ°ΠΊ мСтакласс ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Python, опрСдСляСт особыС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΠΎΠ²Ρ‹ΠΉ мСтакласс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Π’ΠΎΡ‚ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ€ этих Β«Π²ΠΎΠ»ΡˆΠ΅Π±Π½Ρ‹Ρ…Β» ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π² мСтаклассС:

  • __new__: этот ΠΌΠ΅Ρ‚ΠΎΠ΄ вызываСтся Π² мСтаклассС Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ создаётся ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ класса, Π½Π° Π½Ρ‘ΠΌ основанного
  • __init__: этот ΠΌΠ΅Ρ‚ΠΎΠ΄ вызываСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ послС создания сущности/ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°
  • __prepare__: опрСдСляСт пространство ΠΈΠΌΡ‘Π½ класса Π² ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ, ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‰ΠΈΠ΅ΠΌ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹
  • __call__: этот ΠΌΠ΅Ρ‚ΠΎΠ΄ вызываСтся, ΠΊΠΎΠ³Π΄Π° конструктор Π½ΠΎΠ²ΠΎΠ³ΠΎ класса Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для создания ΠΎΡŠΠ΅ΠΊΡ‚Π°

Π’ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π² вашСм мСтаклассС даст вашим классам ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠ΅ ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° typeмСтакласса ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° мСтапрограммирования 1: использованиС Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π‘Π΄Π΅Π»Π°Π΅ΠΌ шаг Π½Π°Π·Π°Π΄, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΡ‹ приступим ΠΊ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ мСтапрограммирования. ΠžΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ мСтапрограммирования Π½Π° Python β€” это использоваинС Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠ².

Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ Π΅ΡΡ‚ΡŒ функция, которая измСняСт исполнСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π˜Π½Ρ‹ΠΌΠΈ словами, ΠΎΠ½ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½Π° Π²Ρ…ΠΎΠ΄ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

НапримСр, Π²ΠΎΡ‚ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Π΅Ρ€Ρ‘Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ Π΅Ρ‘ имя ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ запуском Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для логирования Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

# decorators.py

from functools import wraps

# Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ notifyfunc
def notifyfunc(fn):  
    """ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄ Π΅Ρ‘ исполнСниСм"""
    @wraps(fn)
    def composite(*args, **kwargs):
        print("Executing '%s'" % fn.__name__)
        # ЗапускаСм ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
        rt = fn(*args, **kwargs)
        return rt
    # Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π½Π°ΡˆΡƒ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ
    return composite

# ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ наш Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ своих Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²
@notifyfunc
def multiply(a, b):  
    product = a * b
    return product

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ этот ΠΊΠΎΠ΄ Π² Python REPL. Π“Π»Π°Π²Π½ΠΎΠ΅ Π² использовании Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠ² β€” Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ исполняСтся составная функция вмСсто Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ исполнСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π° функция умноТСния ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ ΠΎ своём запускС ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ вычислСний:

>>> multiply(5, 6)
Executing 'multiply'  
30  
>>>
>>> multiply(89, 5)
Executing 'multiply'  
445  

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

ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° мСтапрограммирования 2: использованиС мСтаклассов ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠ²

ΠœΠ΅Ρ‚Π°ΠΊΠ»Π°ΡΡΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈΠ»ΠΈ классы. Они способны Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ ΠΏΠ΅Ρ€Π΅Π΄ созданииСм Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΈΠ»ΠΈ послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΎΠ½ ΡƒΠΆΠ΅ создан. Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚ΠΎΠ³ΠΎ, для Ρ‡Π΅Π³ΠΎ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ.

Π”Π°Π»Π΅Π΅ ΠΌΡ‹ создадим мСтакласс, Π΄ΠΎΡΡ‚ΠΈΠ³Π°ΡŽΡ‰ΠΈΠΉ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, Ρ‡Ρ‚ΠΎ ΠΈ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ ΠΈΠ· ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ ΠΎΠ±Π° способа, Π²Π°ΠΌ слСдуСт Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΈΡ… совмСстно. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΈ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ прямо Π² ваш REPL, Ссли ΠΎΠ½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°.

# metaclassdecorator.py
import types

# Ѐункция, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ имя ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰Π΅ΠΉ Π½Π° Π²Ρ…ΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ
# ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡŽ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ исходной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
def notify(fn, *args, **kwargs):

    def fncomposite(*args, **kwargs):
        # ΠžΠ±Ρ‹Ρ‡Π½Π°Ρ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ notify
        print("running %s" % fn.__name__)
        rt = fn(*args, **kwargs)
        return rt
    # Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ
    return fncomposite

# ΠœΠ΅Ρ‚Π°ΠΊΠ»Π°ΡΡ, ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ своих классов
# Π½Π° Π½ΠΎΠ²Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, 'Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Π΅' ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ прСобразоватСля слоТной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
class Notifies(type):

    def __new__(cls, name, bases, attr):
        # Π—Π°ΠΌΠ΅Π½ΠΈΠΌ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½Π° Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
        # ΠΏΠ΅Ρ€Π΅Π΄ запуском вычислСния с прСдоставлСнными args ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
        for name, value in attr.items():
            if type(value) is types.FunctionType or type(value) is types.MethodType:
                attr[name] = notify(value)

        return super(Notifies, cls).__new__(cls, name, bases, attr)

# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ мСтакласс
class Math(metaclass=Notifies):  
    def multiply(a, b):
        product = a * b
        print(product)
        return product

Math.multiply(5, 6)

# Запуск multiply():
# 30


class Shouter(metaclass=Notifies):  
    def intro(self):
        print("I shout!")

s = Shouter()  
s.intro()

# Запуск intro():
# I shout!

Π’ классах, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ наш мСтакласс Notifies, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Shouter ΠΈ Math, Π²ΠΎ врСмя создания Π·Π°ΠΌΠ΅Π½Π΅Π½Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π½Π° Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Π΅ вСрсии, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сначала ΡΠΎΠΎΠ±Ρ‰Π°ΡŽΡ‚ Π½Π°ΠΌ Ρ‡Π΅Ρ€Π΅Π· Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ print имя запускаСмого сСйчас ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Π­Ρ‚ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎ повСдСнию, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄ использованиСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ мСтаклассов 1: объявлСниС класса, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ нСльзя ΡƒΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒΡΡ

ΠžΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ сцСнарии использования для мСтапрограммирования Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ сущностСй классов. НапримСр, ΠΎΠ΄ΠΈΠ½ΠΎΡ‡ΠΊΠΈ (singletons) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… ΠΊΠΎΠ΄Π°. Класс-ΠΎΠ΄ΠΈΠ½ΠΎΡ‡ΠΊΠ° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ созданиС сущностСй Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ лишь ΠΎΠ΄ΠΈΠ½ экзСмпляр класса Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

Π€ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ класс β€” Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ использованиС классов. Π­Ρ‚ΠΎΡ‚ класс Π½Π΅ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ свои подклассы. Π€ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ классы ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°Ρ… для бСзопасности, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ класс сохраняСт свои исходныС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹.

НиТС ΠΌΡ‹ Π΄Π°Π΄ΠΈΠΌ объявлСниС Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ класса, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ мСтакласс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ классу Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ.

# final.py

# Ρ„ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ мСтакласс. Π£Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ класса, ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π³ΠΎ свои мСтаклассом Final, Π½Π΅ получится
class Final(type):  
    def __new__(cls, name, bases, attr):
        # ΠΎΡ‚ Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ класса нСльзя ΡƒΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒΡΡ
        # ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ класс Final Π½Π΅ выступаСт Π² качСствС Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ
        # Ссли Ρ‚Π°ΠΊ, ΡƒΠΊΠ°ΠΆΠ΅ΠΌ ΠΎΠ± ошибкС, ΠΈΠ½Π°Ρ‡Π΅ создадим Π½ΠΎΠ²Ρ‹ΠΉ класс с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ Final
        type_arr = [type(x) for x in bases]
        for i in type_arr:
            if i is Final:
                raise RuntimeError("You cannot subclass a Final class")
        return super(Final, cls).__new__(cls, name, bases, attr)


# ВСст: ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ мСтакласс, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ класс Cop

class Cop(metaclass=Final):  
    def exit():
        print("Exiting...")
        quit()

# ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ класс Cop, Π² ΠΈΠ΄Π΅Π°Π»Π΅ слСдуСт Π²ΠΎΠ·Π±ΡƒΠ΄ΠΈΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅!
class FakeCop(Cop):  
    def scam():
        print("This is a hold up!")

cop1 = Cop()  
fakecop1 = FakeCop()

# Π‘ΠΎΠ»ΡŒΡˆΠ΅ тСстов, Π΄Ρ€ΡƒΠ³ΠΎΠΉ класс Final
class Goat(metaclass=Final):  
    location = "Goatland"

# Π£Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ класса Π½Π΅ получится
class BillyGoat(Goat):  
    location = "Billyland"

Π’ этом ΠΊΠΎΠ΄Π΅ ΠΌΡ‹ Π²Π²Π΅Π»ΠΈ объявлСния классов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ класса Final. Π­Ρ‚ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ»ΠΈΡΡŒ, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π±Ρ‹Π»ΠΎ Π²Ρ‹Π±Ρ€ΠΎΡˆΠ΅Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. ИспользованиС мСтаклассов, Ρ‡Ρ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ наслСдованиС, позволяСт Π½Π°ΠΌ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Ρ„ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ классы Π² нашСй ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Π΅.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ мСтаклассов 2: созданиС класса, ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ врСмя исполнСния

ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ рСсурсов Π² Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ систСмС. Они ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ процСссора ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ тСхничСскиС характСристики.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ мСтакласс, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ исполнСния ΠΊΠΎΠ΄Π°. Наш ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° Π½Π΅ совсСм ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ, Π½ΠΎ ΠΎΠ½ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ.

# timermetaclass.py	 	 
import types	 	 
# Класс Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ	 	 
import time	 	 
class Timer: 	 	 
 def __init__(self, func=time.perf_counter):	 	 
 self.elapsed = 0.0	 	 
 self._func = func	 	 
 self._start = None	 	 
 def start(self):	 	 
 if self._start is not None:	 	 
 raise RuntimeError('Already started')	 	 
 self._start = self._func()	 	 
 def stop(self):	 	 
 if self._start is None:	 	 
 raise RuntimeError('Not started')	 	 
 end = self._func()	 	 
 self.elapsed += end - self._start	 	 
 self._start = None	 	 
 def reset(self):	 	 
 self.elapsed = 0.0	 	 
 @property	 	 
 def running(self):	 	 
 return self._start is not None	 	 
 def __enter__(self):	 	 
 self.start()	 	 
 return self	 	 
 def __exit__(self, *args):	 	 
 self.stop()	 	 
# Π”Π°Π»Π΅Π΅ ΠΌΡ‹ создаём мСтакласс Timed, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ считаСт врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ своих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²	 	 
# вмСстС с функциями установки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ классa	 	 
# Π²Ρ€Π΅ΠΌΠ΅Π½Π° создания классов	 	 
# Ѐункция, Π·Π°ΡΠ΅ΠΊΠ°ΡŽΡ‰Π°Ρ врСмя исполнСния встроСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²ΡƒΡŽ,	 	 
# инкапсулируя ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ исходной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ	 	 
def timefunc(fn, *args, **kwargs):	 	 
 def fncomposite(*args, **kwargs):	 	 
 timer = Timer()	 	 
 timer.start()	 	 
 rt = fn(*args, **kwargs)	 	 
 timer.stop()	 	 
 print("Executing %s took %s seconds." % (fn.__name__, timer.elapsed))	 	 
 return rt	 	 
 # Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ	 	 
 return fncomposite

# ΠœΠ΅Ρ‚Π°ΠΊΠ»Π°ΡΡ 'Timed', ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ замСняСт ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ своих классов	
# с Π½ΠΎΠ²Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ 'timed' Π½Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ слоТной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-прСобразоватСля	 	 
class Timed(type):	 	 
 def __new__(cls, name, bases, attr):	 	 
 # мСняСт ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½Π° Π½ΠΎΠ²ΡƒΡŽ, врСмя ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ замСряСтся	 	 
 # запускаСт вычислСниС с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ args ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚	 	 
 for name, value in attr.items():	 	 
 if type(value) is types.FunctionType or type(value) is types.MethodType:	 	 
 attr[name] = timefunc(value)	 	 
 return super(Timed, cls).__new__(cls, name, bases, attr)	 	 
# Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° провСряСт мСтакласс	 	 
# ΠšΠ»Π°ΡΡΡ‹, ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠ΅ мСтакласс Timed, слСдуСт Π·Π°ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ Π·Π° нас автоматичСски	 	 
# ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² REPL	 	 
class Math(metaclass=Timed):	 	 
 def multiply(a, b):	 	 
 product = a * b	 	 
 print(product)	 	 
 return product	 	 
Math.multiply(5, 6)	 	 
class Shouter(metaclass=Timed):	 	 
 def intro(self):	 	 
 print("I shout!")	 	 
s = Shouter() 	 	 
s.intro()	 	 
def divide(a, b): 	 	 
 result = a / b	 	 
 print(result)	 	 
 return result	 	 
div = timefunc(divide) 	 	 
div(9, 3)

Π’Ρ‹Π²ΠΎΠ΄Ρ‹

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

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

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΌΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² C #?

ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка

  1. Около
  2. ΠŸΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹

  3. Для ΠΊΠΎΠΌΠ°Π½Π΄
  1. ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка
    ΠžΠ±Ρ‰Π΅ΡΡ‚Π²Π΅Π½Π½Ρ‹Π΅ вопросы ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹

  2. ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка для ΠΊΠΎΠΌΠ°Π½Π΄
    Π“Π΄Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈ дСлятся частными знаниями с ΠΊΠΎΠ»Π»Π΅Π³Π°ΠΌΠΈ

  3. Вакансии
    ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ связанныС с Π½ΠΈΠΌ тСхничСскиС возмоТности ΠΊΠ°Ρ€ΡŒΠ΅Ρ€Π½ΠΎΠ³ΠΎ роста

  4. Π’Π°Π»Π°Π½Ρ‚
    НанимайтС тСхничСских спСциалистов ΠΈ создавайтС свой Π±Ρ€Π΅Π½Π΄ работодатСля

  5. Π Π΅ΠΊΠ»Π°ΠΌΠ°
    ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³Π°ΠΌ со всСго ΠΌΠΈΡ€Π°

  6. О компании

.

Π’Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΌΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ шаблонов C ++ — Π‘Π²ΠΎΠ±ΠΎΠ΄Π½ΠΎ C ++

Π•ΡΡ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² C ++, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ цСнят ΠΌΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ шаблонов.

И Π΅ΡΡ‚ΡŒ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ C ++.

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

На ΠΌΠΎΠΉ взгляд, ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΡ€ΠΈΡ‡ΠΈΠ½, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ TMP Π½Π΅ нравится ΠΌΠ½ΠΎΠ³ΠΈΠΌ людям, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ часто это нСпонятный . Π”ΠΎ Ρ‚Π°ΠΊΠΎΠΉ стСпСни, Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° это выглядит ΠΊΠ°ΠΊ тСмная магия, прСдназначСнная для ΠΎΡ‡Π΅Π½ΡŒ своСобразного ΠΏΠΎΠ΄Π²ΠΈΠ΄Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π΅Π΅ Π΄ΠΈΠ°Π»Π΅ΠΊΡ‚. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, врСмя ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΡ‹ сталкиваСмся с понятным Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠΌ TMP, Π½ΠΎ Π² срСднСм ΠΌΠ½Π΅ Ρ‚Ρ€ΡƒΠ΄Π½Π΅Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Π΅ΠΌ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄.

И я Ρ…ΠΎΡ‡Ρƒ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ TMP Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ .

Π― ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π²Π°ΠΌ, ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ TMP Π±ΠΎΠ»Π΅Π΅ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ. И это Π½Π΅ ракСтостроСниС.

TMP часто Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ языком Π² Ρ€Π°ΠΌΠΊΠ°Ρ… языка C ++. Π˜Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ TMP Π±ΠΎΠ»Π΅Π΅ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ, Π½Π°ΠΌ просто Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚Π΅ ΠΆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°, Ρ‡Ρ‚ΠΎ ΠΈ Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ это, ΠΌΡ‹ возьмСм Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ½ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ самыС смСлыС ΠΈΠ· нас, ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ ΠΊ Π½Π΅ΠΌΡƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π° ΠΏΡ€Π°Π²ΠΈΠ»Π° Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ:

Π― сказал Π²Π°ΠΌ, это Π½Π΅ ракСтостроСниС.

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΌΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ, я Ρ…ΠΎΡ‡Ρƒ ΠΏΠΎΠ±Π»Π°Π³ΠΎΠ΄Π°Ρ€ΠΈΡ‚ΡŒ своСго ΠΊΠΎΠ»Π»Π΅Π³Ρƒ Π”ΠΆΠ΅Ρ€Π΅ΠΌΠΈ Π·Π° Π΅Π³ΠΎ Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»ΡΡŽΡ‰ΡƒΡŽ Π»ΠΎΠ²ΠΊΠΎΡΡ‚ΡŒ с TMP, Π° Ρ‚Π°ΠΊΠΆΠ΅ ВинсСнта, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ всСгда Ρ‚Π°ΠΊ Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΡ‚ΠΊΠ»ΠΈΠΊ Π² идСях.РСбята, Π²Ρ‹ ΠΌΠΎΠ»ΠΎΠ΄Ρ†Ρ‹.

НазначСниС ΠΊΠΎΠ΄Π°

ΠœΡ‹ напишСм API, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ провСряСт, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

НапримСр, учитывая Ρ‚ΠΈΠΏ T, ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ Π·Π½Π°Ρ‚ΡŒ, являСтся Π»ΠΈ T ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌΡ‹ΠΌ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° t Ρ‚ΠΈΠΏΠ° T, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, являСтся Π»ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅:

являСтся Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ. Если T Ρ€Π°Π²Π½ΠΎ int , Ρ‚ΠΎΠ³Π΄Π° Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ допустимо, Π° Ссли T Ρ€Π°Π²Π½ΠΎ std :: string , Ρ‚ΠΎΠ³Π΄Π° Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ.

Π’ΠΎΡ‚ типичная Ρ‡Π°ΡΡ‚ΡŒ TMP, которая Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚:

шаблон
struct is_incrementable: std :: false_type {};

шаблон
struct is_incrementable ())>
>: std :: true_type {};

.

ΠœΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° C ++ ΠΈ D

ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка

  1. Около
  2. ΠŸΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹

  3. Для ΠΊΠΎΠΌΠ°Π½Π΄
  1. ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка
    ΠžΠ±Ρ‰Π΅ΡΡ‚Π²Π΅Π½Π½Ρ‹Π΅ вопросы ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹

  2. ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка для ΠΊΠΎΠΌΠ°Π½Π΄
    Π“Π΄Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈ дСлятся частными знаниями с ΠΊΠΎΠ»Π»Π΅Π³Π°ΠΌΠΈ

  3. Вакансии
    ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ связанныС с Π½ΠΈΠΌ тСхничСскиС возмоТности ΠΊΠ°Ρ€ΡŒΠ΅Ρ€Π½ΠΎΠ³ΠΎ роста

  4. Π’Π°Π»Π°Π½Ρ‚
    НанимайтС тСхничСских спСциалистов ΠΈ создавайтС свой Π±Ρ€Π΅Π½Π΄ работодатСля

  5. Π Π΅ΠΊΠ»Π°ΠΌΠ°
    ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³Π°ΠΌ со всСго ΠΌΠΈΡ€Π°

  6. О компании

Загрузка…

.

c ++ 14 — ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ ΠΌΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° C ++

ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка

  1. Около
  2. ΠŸΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹

  3. Для ΠΊΠΎΠΌΠ°Π½Π΄
  1. ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка
    ΠžΠ±Ρ‰Π΅ΡΡ‚Π²Π΅Π½Π½Ρ‹Π΅ вопросы ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹

  2. ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка для ΠΊΠΎΠΌΠ°Π½Π΄
    Π“Π΄Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈ дСлятся частными знаниями с ΠΊΠΎΠ»Π»Π΅Π³Π°ΠΌΠΈ

  3. Вакансии
    ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ связанныС с Π½ΠΈΠΌ тСхничСскиС возмоТности ΠΊΠ°Ρ€ΡŒΠ΅Ρ€Π½ΠΎΠ³ΠΎ роста

  4. Π’Π°Π»Π°Π½Ρ‚
    НанимайтС тСхничСских спСциалистов ΠΈ создавайтС свой Π±Ρ€Π΅Π½Π΄ работодатСля

  5. Π Π΅ΠΊΠ»Π°ΠΌΠ°
    ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³Π°ΠΌ со всСго ΠΌΠΈΡ€Π°

  6. О компании

.

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

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