Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π—Π«Πš ΠŸΠ ΠžΠ“Π ΠΠœΠœΠ˜Π ΠžΠ’ΠΠΠ˜Π― Π‘# 2005 И ΠŸΠ›ΠΠ’Π€ΠžΠ ΠœΠ .NET 2.0. 3-Π΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 129

Автор Π­Π½Π΄Ρ€ΡŽ ВроСлсСн

Π₯отя Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ лишь Π½Π΅ΠΌΠ½ΠΎΠ³ΠΈΠ΅ программисты ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΡƒΡ‚ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ свои .NET-прилоТСния нСпосрСдствСнно Π½Π° языкС CIL, язык CIL сам ΠΏΠΎ сСбС являСтся Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ интСрСсным ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ для ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ исслСдования. ΠŸΡ€ΠΎΡ‰Π΅ говоря, Ρ‡Π΅ΠΌ Π»ΡƒΡ‡ΡˆΠ΅ Π²Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ CIL, Ρ‚Π΅ΠΌ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Π΅Π΅ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ сСбя Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΌΠΈΡ€Π΅ Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ΅ΠΌΠΎΠ² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ .NET. Если Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ, Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ, ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ΠΌ языка CIL, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅.

β€’ ПониманиС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ языки программирования .NET ΠΏΡ€ΠΎΠ΅Ρ†ΠΈΡ€ΡƒΡŽΡ‚ свои ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π² лСксСмы CIL.

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

β€’ Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ построСния динамичСских ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ элСмСнтов пространства ΠΈΠΌΠ΅Π½ System.Refleсtion.Emit.

β€’ ИcпользованиС Ρ‚Π΅Ρ… возмоТностСй CTS (Common Type System – общая систСма Ρ‚ΠΈΠΏΠΎΠ²), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ управляСмыми языками Π±ΠΎΠ»Π΅Π΅ высокого уровня, Π½ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ CIL. Π―Π·Ρ‹ΠΊ CIL являСтся СдинствСнным языком .NET, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊΠΎ всСм возмоТностям CTS.

НапримСр, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ CIL, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Ρ‡Π»Π΅Π½Ρ‹ ΠΈ поля глобального уровня (Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»Π΅Π½ΠΎ Π² C#).

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

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅ Π½Π΅ прСдлагаСтся всСстороннСС ΠΈ ΠΈΡΡ‡Π΅Ρ€ΠΏΡ‹Π²Π°ΡŽΡ‰Π΅Π΅ описаниС синтаксиса ΠΈ сСмантики CIL. Если Π²Π°ΠΌ трСбуСтся всСсторонний Π°Π½Π°Π»ΠΈΠ· возмоТностСй CIL, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ ΠΊΠ½ΠΈΠ³Π΅ Jason Bock, CIL Programming: Under the Hood of .NET (Apress, 2002).

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹, Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈ ΠΊΠΎΠ΄Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ CIL

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

{new, public, this, base, get, set, explicit, unsafe, enum, operator, partial}

Π’Ρ‹, скорСС всСго, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΈΡ…, ΠΊΠ°ΠΊ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова языка C# (ΠΈ это ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ). Но Ссли ΠΏΡ€ΠΈΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒΡΡ ΠΊ элСмСнтам этого Π½Π°Π±ΠΎΡ€Π° Π±ΠΎΠ»Π΅Π΅ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π²Ρ‹ смоТСтС Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ хотя здСсь ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт ΠΈ являСтся ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом C#, ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Ρ€Π°Π·Π½ΡƒΡŽ сСмантику. НапримСр, ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово enum опрСдСляСт Ρ‚ΠΈΠΏ, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ System.Enum, Π° ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова this ΠΈ base ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ, соотвСтствСнно, Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ»ΠΈ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ класс ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово unsafe ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания Π±Π»ΠΎΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ Π²ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ нСпосрСдствСнно ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ срСдой CLR, Π° ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово operator позволяСт ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ скрытый (ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ) ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ примСняСтС Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ C# (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π½Π°ΠΊ слоТСния).

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠ³ΠΎ высокоуровнСвого языка, ΠΊΠ°ΠΊ C#, язык CIL Π½Π΅ просто опрСдСляСт свой собствСнный Π½Π°Π±ΠΎΡ€ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов. Набор лСксСм, понятных компилятору CIL, раздСляСтся Π½Π° Ρ‚Ρ€ΠΈ большиС ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ, Π² зависимости ΠΎΡ‚ сСмантичСского подтСкста:

β€’ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ CIL;

β€’ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ CIL;

β€’ ΠΊΠΎΠ΄Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ CIL.

КаТдая катСгория лСксСм CIL выраТаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ своих ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… синтаксичСских конструкций, Π° сами лСксСмы ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ получился работоспособный ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ .NET.

Роль Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² CIL

ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, Π΅ΡΡ‚ΡŒ мноТСство извСстных лСксСм CIL, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для описания ΠΏΠΎΠ»Π½ΠΎΠΉ структуры ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° .NET. Π­Ρ‚ΠΈ лСксСмы Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°ΠΌΠΈ. Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ CIL ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄Π»ΠΈ информирования компилятора CIL ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ пространства ΠΈΠΌΠ΅Π½, Ρ‚ΠΈΠΏΡ‹ ΠΈ Ρ‡Π»Π΅Π½Ρ‹, содСрТащиСся Π² ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Π±Π»ΠΎΠΊΠ΅.

БинтаксичСски Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ прСфикса, прСдставлСнного Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ (.) (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, .namespace, .class, .publickeytoken, .override, .method, .assembly ΠΈ Ρ‚.Π΄.). Π’Π°ΠΊ, Ссли ваш Ρ„Π°ΠΉΠ» *.il (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ для Ρ„Π°ΠΉΠ»Π°, содСрТащСго ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ CIL) ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ .namespace ΠΈ Ρ‚Ρ€ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ .сlass, компилятор CIL сгСнСрируСт ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ ΠΎΠ΄Π½ΠΎ пространства ΠΈΠΌΠ΅Π½ .NET ΠΈ Ρ‚Ρ€ΠΈ Ρ‚ΠΈΠΏΠ° класса .NET.

Роль Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² CIL

Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ CIL сами ΠΏΠΎ сСбС ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ нСдостаточно ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Ρ‚ΡŒ ΠΈΡΡ‡Π΅Ρ€ΠΏΡ‹Π²Π°ΡŽΡ‰Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ° .NET ΠΈΠ»ΠΈ Π΅Π³ΠΎ Ρ‡Π»Π΅Π½Π°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ CIL ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°ΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ CIL, ΡΠΎΠΎΠ±Ρ‰Π°ΡŽΡ‰ΠΈΠΌΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ данная Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°. НапримСр, Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° .class ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ public (Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ видимости Ρ‚ΠΈΠΏΠ°), Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ extends (Ρ‡Ρ‚ΠΎΠ±Ρ‹ явно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс Ρ‚ΠΈΠΏΠ°) ΠΈΠ»ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ implements (Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ список интСрфСйсов, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Ρ‚ΠΈΠΏΠΎΠΌ).

Роль ΠΊΠΎΠ΄ΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ CIL

ПослС опрСдСлСния ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° .NET, пространства ΠΈΠΌΠ΅Π½ ΠΈ Π½Π°Π±ΠΎΡ€Π° Ρ‚ΠΈΠΏΠΎΠ² Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… GIL с использованиСм Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² ΠΈ связанных Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² остаСтся ΠΎΠ΄Π½ΠΎ – ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠ°. Π­Ρ‚ΠΎ являСтся Π·Π°Π΄Π°Ρ‡Π΅ΠΉ ΠΊΠΎΠ΄ΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. Π’ соотвСтствии с традициями Π΄Ρ€ΡƒΠ³ΠΈΡ… языков Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня, ΠΊΠΎΠ΄Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ CIL, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΈΠΌΠ΅ΡŽΡ‚ просто нСпроизносимыС Π°Π±Π±Ρ€Π΅Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹. НапримСр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ строки, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π΅ понятный ΠΊΠΎΠ΄ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ LoadString, a ldstr.

Но всС ΠΆΠ΅, Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Ρ€Π°Π΄ΠΎΠ²Π°Ρ‚ΡŒ, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠΎΠ΄Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ CIL Π² точности ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈΡ… Π°Π½Π°Π»ΠΎΠ³Π°ΠΌ Π² C# (это, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, box, unbox, throw ΠΈ sizeof). Π’Ρ‹ смоТСтС ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ CIL всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² контСкстС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‡Π»Π΅Π½Π° ΠΈ, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² CIL, ΠΎΠ½ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ΡΡ прСфиксом, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ.

Различия ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠ½Π΅ΠΌΠΎΠ½ΠΈΠΊΠΎΠΉ ΠΈ ΠΊΠΎΠ΄ΠΎΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ CIL

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ объяснялось, ΠΊΠΎΠ΄Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ldstr, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‡Π»Π΅Π½ΠΎΠ² Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Но Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ лСксСмы (Π² Ρ‚ΠΎΠΌ числС ΠΈ ldstr) ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΌΠ½Π΅ΠΌΠΎΠ½ΠΈΠΊΠ°ΠΌΠΈ CIL, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΌΠΈ Π½Π° самом Π΄Π΅Π»Π΅ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠ΄Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ CIL. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΡΠ½ΠΈΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, созданный срСдствами C#.

static int Add(int x, int Ρƒ) {

 return Ρ… + Ρƒ;

}

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

К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ CIL Π΅ΡΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ ΠΌΠ½Π΅ΠΌΠΎΠ½ΠΈΠΊΠ°. НапримСр, ΠΌΠ½Π΅ΠΌΠΎΠ½ΠΈΠΊΠ° add ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ вмСсто 0X58, sub – вмСсто 0X59, a newobj – вмСсто 0X73. Π’Π²ΠΈΠ΄Ρƒ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠ½Π΅ΠΌΠΎΠ½ΠΈΠΊΠ°ΠΌΠΈ ΠΈ ΠΊΠΎΠ΄Π°ΠΌΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Π½Π΅Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π΄ΠΎΠ³Π°Π΄Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ дСкомпиляторы CIL, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ildasm.exe, пСрСводят Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠ΄Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΌΠ½Π΅ΠΌΠΎΠ½ΠΈΠΊΡƒ CIL.

.method public hidebysig static int32 Add(int32 x, int32 y) cil managed {

 β€¦

 // ЛСксСма 'add' являСтся Π±ΠΎΠ»Π΅Π΅ понятной ΠΌΠ½Π΅ΠΌΠΎΠ½ΠΈΠΊΠΎΠΉ CIL,

 // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ для прСдставлСния ΠΊΠΎΠ΄Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ 0X58.

 add

 β€¦

}

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

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…: стСковая ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π° CIL

ВысокоуровнСвыС языки .NET (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ C#) ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ максимально ΡΠΊΡ€Ρ‹Ρ‚ΡŒ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ слоТности. Одним ΠΈΠ· аспСктов Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ .NET, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ оказываСтся скрытым особСнно Ρ…ΠΎΡ€ΠΎΡˆΠΎ, являСтся Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ CIL являСтся языком, Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ основанным Π½Π° стСковом ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ. Напомним, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ исслСдований пространства ΠΈΠΌΠ΅Π½ System.Collections (см. Π³Π»Π°Π²Ρƒ 7) ΠΌΡ‹ с Π²Π°ΠΌΠΈ выяснили, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ stack ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для добавлСния значСния Π² стСк, Π° Ρ‚Π°ΠΊΠΆΠ΅ для удалСния ΠΈΠ· стСка значСния, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ CIL-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ нСпосрСдствСнно ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ System.Π‘ollections.Stack, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.