1-Bob: CLR Bajarish Modeli

Common Language Runtime (CLR) qanday ishlashini va .NET ilovalaringiz qanday bajarilishini tushunish

~45 daqiqaO'qish vaqti
8 ta mavzuShu bobda
Boshlang'ichDaraja
3-31 betAsl kitobda

Microsoft .NET Framework ko'plab tushunchalar, texnologiyalar va atamalarni taqdim etadi. Ushbu bobdagi maqsadim — sizga .NET Framework qanday tuzilganligini umumiy ko'rinishda tushuntirish, framework o'z ichiga olgan texnologiyalarni tanishtirib berish va siz foydalana boshlaganingizda duch keladigan atamalarning ko'pchiligini aniqlashdir. Shuningdek, men sizni manba kodingizni ilovaga yoki qayta foydalanish mumkin bo'lgan komponentlarga (fayllar) aylantirish jarayoni bilan tanishtirib o'taman va keyin ilovangiz qanday bajarilishini tushuntiraman.

Manba Kodini Boshqariladigan Modullarga Kompilatsiya Qilish

Demak, siz .NET Framework ni o'z dasturlash platformangiz sifatida tanlashga qaror qildingiz. Ajoyib! Birinchi qadamingiz — qanday turdagi ilova yoki komponent qurishni aniqlash. Faraz qilaylik, bu mayda-chuyda masalani hal qildingiz; hamma narsa loyihalangan, spetsifikatsiyalar yozilgan va siz dasturlashni boshlashga tayyorsiz.

Endi qaysi dasturlash tilini ishlatishni tanlashingiz kerak. Bu vazifa odatda qiyin, chunki turli tillar turli imkoniyatlarni taklif qiladi. Masalan, boshqarilmaydigan C/C++ da siz tizimning past darajasini juda yaxshi boshqarishingiz mumkin — xotirani o'zingiz boshqarish, oqimlarni yaratish va hokazo. Microsoft Visual Basic 6.0 esa UI ilovalarini tez qurish imkonini beradi va COM obyektlari hamda ma'lumotlar bazalari bilan ishlashni osonlashtiradi.

Common Language Runtime (CLR) — nomidan ko'rinib turibdiki, bu turli xil dasturlash tillari tomonidan foydalanish mumkin bo'lgan runtime muhiti. CLR ning asosiy xususiyatlari (xotirani boshqarish, assembly yuklash, xavfsizlik, istisnolarni qayta ishlash va oqimlarni sinxronizatsiya) — bularning barchasi CLR ni nishonga oladigan barcha dasturlash tillari uchun mavjud. Masalan, runtime xatolarni istisno sifatida xabar qiladi, shuning uchun runtime ni nishonga oladigan barcha tillar ham xatolarni istisno orqali oladi.

Aslida, ish vaqtida (runtime) CLR dasturchi manba kodi uchun qaysi dasturlash tilini ishlatganini bilmaydi. Bu shuni anglatadiki, siz o'z niyatingizni eng yaxshi ifodalovchi dasturlash tilini tanlashingiz kerak. Siz kodingizni istalgan tilga yozishingiz mumkin — shart shuki, kompilyatoringiz kodingizni CLR ga moslashtirib kompilatsiya qilsin.

Xo'sh, agar men aytganimday bo'lsa, bir dasturlash tilining boshqasidan ustunligi nima? Men kompilyatorlarni sintaksis tekshiruvchilari va "to'g'ri kod" analizatorlari deb bilaman. Ular sizning manba kodingizni ko'rib chiqadi, yozgan narsangiz ma'noli ekanligiga ishonch hosil qiladi va keyin niyatingizni tavsiflovchi kodni chiqaradi. Turli dasturlash tillari turli sintaksislar yordamida dasturlashga imkon beradi.

Microsoft runtime ni nishonga oladigan bir nechta til kompilyatorlarini yaratgan: C++/CLI, C# ("C sharp"), Visual Basic, F# ("F sharp") va IL Assembler. Microsoft dan tashqari, boshqa kompaniyalar, kollejlar va universitetlar ham CLR ni nishonga oladigan kodlarni yaratuvchi kompilyatorlar yaratishgan. Men Ada, APL, Caml, COBOL, Eiffel, Forth, Fortran, Haskell, Lexico, LISP, LOGO, Lua, Mercury, ML, Mondrian, Oberon, Pascal, Perl, PHP, Prolog, RPG, Scheme, Smalltalk va Tcl/Tk uchun kompilyatorlar borligini bilaman.

1-1 rasm manba kod fayllarini kompilatsiya qilish jarayonini ko'rsatadi. Rasmdan ko'rinib turibdiki, siz CLR ni qo'llab-quvvatlovchi istalgan dasturlash tilida manba kod fayllarini yaratishingiz mumkin. So'ngra tegishli kompilyator yordamida sintaksisni tekshirishingiz va manba kodini tahlil qilishingiz kerak. Qaysi kompilyatorni ishlatishingizdan qat'i nazar, natija — boshqariladigan modul (managed module). Boshqariladigan modul standart 32-bitli Windows portativ bajariladigan (PE32) fayli yoki 64-bitli Windows portativ bajariladigan (PE32+) fayli bo'lib, bajarilish uchun CLR talab qiladi.

C# manba
kod fayllar
C#
kompilyator
Boshqariladigan modul
(IL + metadata)
VB manba
kod fayllar
VB
kompilyator
Boshqariladigan modul
(IL + metadata)

1-1 rasm: Manba kodini boshqariladigan modullarga kompilatsiya qilish

1-1 jadval boshqariladigan modulning qismlarini tasvirlaydi.

QismTavsif
PE32 yoki PE32+ sarlavhaStandart Windows PE fayl sarlavhasi. Fayl turi (GUI, CUI yoki DLL), vaqt tamg'asi va boshqa ma'lumotlarni o'z ichiga oladi.
CLR sarlavhaCLR tomonidan tafsirlanadigan ma'lumotlarni o'z ichiga oladi: CLR versiyasi, MethodDef metadata tokeni (Main metodi), metadata joylashuvi va hajmi va boshqalar.
MetadataHar bir modul metadata jadvallarini o'z ichiga oladi: manba kodda aniqlangan turlar va a'zolarni tavsiflovchi jadvallar va manba kod tomonidan havola qilingan turlar va a'zolarni tavsiflovchi jadvallar.
IL kodKompilyator manba kodini kompilatsiya qilganda yaratgan kod. Ish vaqtida CLR IL ni native CPU ko'rsatmalariga kompilyatsiya qiladi.

Native kod kompilyatorlari ma'lum bir CPU arxitekturasini (x86, x64 yoki ARM) nishonga olgan kodlar ishlab chiqaradi. CLR ga mos barcha kompilyatorlar esa buning o'rniga IL kodi ishlab chiqaradi. (Men IL kodi haqida keyinroq batafsilroq gaplashaman.) IL kodi ba'zan managed code (boshqariladigan kod) deb ham ataladi, chunki CLR uning bajarilishini boshqaradi.

IL kodiga qo'shimcha ravishda, CLR ni nishonga oladigan har bir kompilyator to'liq metadata (ma'lumotlar haqida ma'lumot) chiqarishga majbur. Qisqacha aytganda, metadata — bu modulda aniqlangan narsalarni (turlar va ularning a'zolari) tavsiflovchi ma'lumotlar jadvallari to'plami. Bundan tashqari, metadata shuningdek modulning import qilgan turlarini va ularning a'zolarini ko'rsatuvchi jadvallarni ham o'z ichiga oladi.

Metadata ko'p maqsadlarda foydalaniladi:

  • Metadata kompilatsiya vaqtida native C/C++ sarlavha va kutubxona fayllariga bo'lgan ehtiyojni yo'q qiladi, chunki turlar/a'zolar haqidagi barcha ma'lumotlar IL kodini o'z ichiga olgan faylda joylashgan.
  • Visual Studio metadata yordamida IntelliSense xizmatini taqdim etadi — turning qanday metodlar, xususiyatlar, hodisalar va maydonlar taklif qilishini ko'rsatadi.
  • CLR ning kod tekshirish jarayoni metadata dan foydalanib kodingiz faqat "tur-xavfsiz" amallarni bajarishini ta'minlaydi.
  • Metadata obyektning maydonlarini xotira blokiga seriyalash (serialization) va boshqa mashinaga yuborish, so'ngra o'sha mashinada deserializatsiya qilish imkonini beradi.
  • Metadata garbage collector ga obyektlarning umrini kuzatib borish imkonini beradi.

Boshqariladigan Modullarni Assembly-ga Birlashtirish

CLR aslida modullar bilan emas, assemblylar bilan ishlaydi. Assembly — bu bir yoki bir nechta modullar va resurs fayllarining mantiqiy guruhi. Assembly qayta foydalanish, xavfsizlik va versiyalashning eng kichik birligi hisoblanadi. Kompilyator yoki vositalaringiz bilan qanday tanlov qilishingizga qarab, bir faylli yoki ko'p faylli assembly yaratishingiz mumkin. CLR dunyosida assembly — bu biz komponent deb ataydigan narsadir.

Boshqariladigan
modul (IL)
Vosita
(CSC.exe, AL.exe)
Assembly
(Manifest + Modullar
+ Resurslar)

1-2 rasm: Boshqariladigan modullarni assemblylarga birlashtirish

Odatda, kompilyatorlar chiqarilgan boshqariladigan modulni assemblyga aylantirish ishini bajaradi. Ya'ni, C# kompilyatori manifest o'z ichiga olgan boshqariladigan modulni chiqaradi. Manifest assembly faqat bitta boshqariladigan moduldan iboratligini ko'rsatadi va hech qanday resurs yoki ma'lumot faylilar yo'qligini bildiradi.

Assembly mantiqiy va fizik tushunchalarni ajratib, qayta foydalanish mumkin bo'lgan, xavfsiz va versiyalanadigan komponentni yaratish imkonini beradi. Siz o'z kodingiz va resurslaringizni turli fayllar o'rtasida qanday taqsimlashni o'zingiz hal qilasiz.

Assembly modullari havola qilingan assemblylar haqidagi ma'lumotni (shu jumladan ularning versiya raqamlarini) ham o'z ichiga oladi. Bu ma'lumot assemblyni o'z-o'zini tavsiflovchi (self-describing) qiladi. Boshqacha aytganda, CLR assemblydagi kodni bajarish uchun assemblyning bevosita bog'liqliklarini aniqlashi mumkin. Registr yoki Active Directory Domain Services da qo'shimcha ma'lumot talab qilinmaydi.

Common Language Runtime ni Yuklash

Siz yaratgan har bir assembly bajariladigan ilova yoki turlar to'plamini o'z ichiga olgan DLL bo'lishi mumkin. Albatta, bu assemblylar ichidagi kodni boshqarish uchun CLR javobgardir. Bu .NET Framework xost mashinaga o'rnatilgan bo'lishi kerakligini anglatadi.

.NET Framework o'rnatilganligini %SystemRoot%\System32 papkasida MSCorEE.dll faylini qidirish orqali aniqlash mumkin. Bu fayl mavjudligi .NET Framework o'rnatilganligini bildiradi. Biroq, .NET Framework ning bir nechta versiyalari bitta mashinaga bir vaqtda o'rnatilishi mumkin.

.NET Framework SDK tarkibida CLRVer.exe degan buyruq qatori vositasi mavjud bo'lib, u mashinaga o'rnatilgan CLR ning barcha versiyalarini ko'rsatadi.

Eslatma

Agar assembly fayllari faqat tur-xavfsiz boshqariladigan kodni o'z ichiga olsa, siz yozayotgan kod 32-bit ham, 64-bit ham Windows versiyalarida ishlaydi. Hech qanday manba kodi o'zgartirishlari talab qilinmaydi.

C# kompilyatori /platform buyruq qatori kalitini taklif qiladi. Bu kalit natijadagi assembly 32-bit, 64-bit yoki ARM Windows versiyalarida ishlaydimi yoki yo'qligini aniqlash imkonini beradi. Agar siz platformani belgilamasangiz, standart anycpu qiymati ishlatiladi — bu natijadagi assembly Windows ning istalgan versiyasida ishlay olishini bildiradi.

/platform kalitiNatija modulx86 Windowsx64 WindowsARM Windows RT
anycpu (standart)PE32/agnostik32-bit64-bit32-bit
anycpu32bitpreferredPE32/agnostik32-bit32-bit (WoW64)32-bit
x86PE32/x8632-bitWoW64Ishlamaydi
x64PE32+/x64Ishlamaydi64-bitIshlamaydi
ARMPE32/ARMIshlamaydiIshlamaydi32-bit

Windows bajariladigan faylni ishga tushirganda, EXE faylining sarlavhasini tekshirib, 32-bit yoki 64-bit address space talab qilishini aniqlaydi. PE32 sarlavhali fayl 32-bit address space da, PE32+ sarlavhali fayl esa 64-bit address space da ishlaydi. Windows shuningdek sarlavha ichidagi CPU arxitektura ma'lumotini tekshirib, kompyuterdagi CPU turiga mos kelishini ta'minlaydi.

Assembly Kodini Bajarish

Oldinroq aytib o'tilganidek, boshqariladigan assemblylar metadata va IL ni o'z ichiga oladi. IL — bu CPU ga bog'liq bo'lmagan mashina tili bo'lib, Microsoft tomonidan bir nechta tashqi tijorat va akademik kompilyator yozuvchilari bilan maslahatlashib yaratilgan. IL ko'pchilik CPU mashina tillariga qaraganda yuqori darajadagi tildir. IL obyekt turlariga kira oladi va ularni manipulyatsiya qila oladi, obyektlarda virtual metodlarni chaqira oladi, massiv elementlarini to'g'ridan-to'g'ri manipulyatsiya qila oladi. Hatto xatolarni qayta ishlash uchun istisnolarni tashlash va qo'lga olish ko'rsatmalari ham mavjud. IL ni obyektga yo'naltirilgan mashina tili sifatida tasavvur qilishingiz mumkin.

Odatda, dasturchilar yuqori darajadagi tillar — C#, Visual Basic yoki F# da dasturlashadi. Bu tillar uchun kompilyatorlar IL ishlab chiqaradi. Biroq, boshqa har qanday mashina tili singari, IL ham assembly tilida yozilishi mumkin. Microsoft IL Assembler (ILAsm.exe) va IL Disassembler (ILDasm.exe) taqdim etadi.

Metodni bajarish uchun uning IL kodi avval native CPU ko'rsatmalariga aylantirilishi kerak. Bu CLR ning JIT (just-in-time) kompilyatorining ishidir.

CLR Kompilatsiya Jarayoni
C# Manba Kodi
.cs fayllar
C# Kompilyator
csc.exe / Roslyn
IL Kodi
+ Metadata
JIT Kompilyator
Runtime
Mashina Kodi
CPU bajaradi
C# kodi bir necha bosqichdan o'tib, CPU tushunadigan mashina kodiga aylanadi

1-4 rasm metod birinchi marta chaqirilganda nima sodir bo'lishini ko'rsatadi.

Main() metodi
Console.WriteLine("Salom");
JITCompiler
funksiyasi
Native CPU
ko'rsatmalari

1-4 rasm: Metodni birinchi marta chaqirish

Main metodi WriteLine ga birinchi marta murojaat qilganda, JITCompiler funksiyasi chaqiriladi. JITCompiler funksiyasi qaysi metod chaqirilayotganini va bu metodni qaysi tur aniqlaganini biladi. So'ngra u assembly metadata dan ushbu metod uchun IL ni qidiradi. JITCompiler IL kodni tekshiradi va native CPU ko'rsatmalariga kompilyatsiya qiladi. Native CPU ko'rsatmalari dinamik ravishda ajratilgan xotira blokiga saqlanadi. Keyin, JITCompiler turning ichki ma'lumotlar tuzilmasidagi chaqirilgan metod uchun yozuvga qaytadi va uni avval IL ko'rsatmalariga yo'naltirgan manzilni native CPU ko'rsatmalari joylashgan xotira blokining manzili bilan almashtiradi. Nihoyat, JITCompiler xotira blokidagi kodga o'tadi. Bu kod WriteLine metodining realizatsiyasidir.

Main endi WriteLine ni ikkinchi marta chaqiradi. Bu safar, WriteLine kodi allaqachon tekshirilgan va kompilyatsiya qilingan, shuning uchun chaqiruv to'g'ridan-to'g'ri xotira blokiga boradi, JITCompiler funksiyasini butunlay chetlab o'tib. Unumdorlik yo'qotilishi faqat metod birinchi marta chaqirilganda sodir bo'ladi.

JIT kompilyatori native CPU ko'rsatmalarini dinamik xotirada saqlaydi. Bu shuni anglatadiki, kompilyatsiya qilingan kod ilova tugatilganda o'chiriladi. Shuning uchun, agar siz ilovani qayta ishga tushirsangiz yoki ikkita nusxasini bir vaqtda ishga tushirsangiz, JIT kompilyatori IL ni native ko'rsatmalarga qaytadan kompilyatsiya qilishi kerak bo'ladi.

Ko'pchilik ilovalar uchun JIT kompilyatsiyasi tufayli yuzaga keladigan unumdorlik kamayishi ahamiyatsiz. Ilovalar bir xil metodlarni qayta-qayta chaqiradi. Bu metodlar unumdorlik ta'sirini faqat bir marta qabul qiladi.

CLR ning JIT kompilyatori native kodni boshqarilmaydigan C++ kompilyatorining orqa qismiga o'xshab optimallashtiradi. Bu biroz ko'proq vaqt talab qilishi mumkin, lekin kod optimallashtirilmagan bo'lganiga qaraganda ancha yaxshiroq ishlaydi.

Muhim

Men dasturlash tillari o'rtasida boy integratsiya bilan oson almashish qobiliyati CLR ning ajoyib xususiyati deb hisoblayman. C# va Visual Basic I/O operatsiyalari uchun mukammal tillar. APL muhandislik yoki moliyaviy hisob-kitoblar uchun ajoyib til. CLR orqali siz ilovangizning I/O qismlarini C# da, muhandislik hisob-kitoblarini APL da yozishingiz mumkin.

IL va Tekshirish (Verification)

IL stek-ga asoslangan tildir, ya'ni uning barcha ko'rsatmalari operandlarni bajarilish stekiga suradi va natijalarni stekdan oladi. IL registrlarni boshqarish uchun ko'rsatmalar taklif qilmaydi, shuning uchun yangi tillar va CLR ni nishonga oladigan kompilyatorlar yaratish oson.

IL ko'rsatmalari turlarga ham bog'lanmagan. Masalan, IL oxirgi ikkita operandni qo'shuvchi add ko'rsatmasini taklif qiladi. 32-bit va 64-bit versiyalari alohida emas. add ko'rsatmasi bajarganda, u stekdagi operandlar turlarini aniqlaydi va tegishli amalni bajaradi.

IL ning eng muhim afzalligi shundaki, u CPU ni mavhumlashtiradi. IL ning eng katta foydalari — ilova mustahkamligi va xavfsizlik. IL ni native CPU ko'rsatmalariga kompilatsiya qilishda CLR tekshirish (verification) jarayonini amalga oshiradi. Tekshirish yuqori darajadagi IL kodini ko'rib chiqadi va hamma narsa xavfsiz ekanligiga ishonch hosil qiladi. Masalan, tekshirish har bir metod to'g'ri sonli parametrlar bilan chaqirilganligini va har bir parametr turining to'g'ri ekanligini tekshiradi.

Boshqariladigan kodni tekshirish orqali siz kodning xotiraga noto'g'ri murojaat qilmasligini va boshqa ilova kodiga salbiy ta'sir ko'rsatmasligini bilasiz. Bu sizga bitta Windows jarayonida bir nechta boshqariladigan ilovalarni xavfsiz ishlatish imkonini beradi.

Xavfli (Unsafe) Kod

Standart holda Microsoft ning C# kompilyatori xavfsiz kod ishlab chiqaradi. Biroq, C# kompilyatori dasturchilarga xavfli (unsafe) kod yozish imkonini beradi. Xavfli kod to'g'ridan-to'g'ri xotira manzillari bilan ishlashga va bu manzillardagi baytlarni manipulyatsiya qilishga ruxsat beradi. Bu juda kuchli xususiyat bo'lib, odatda boshqarilmaydigan kod bilan interop qilishda yoki vaqtga juda sezgir algoritmlarning unumdorligini oshirishda foydali.

Diqqat!

Xavfli kod ishlatish jiddiy xavf tug'diradi: u ma'lumotlar tuzilmalarini buzishi va hatto xavfsizlik zaifliklarini ochishi mumkin. Shu sababli, C# kompilyatori xavfli kodni o'z ichiga olgan barcha metodlar unsafe kalit so'zi bilan belgilanishini talab qiladi va kompilyatsiya uchun /unsafe kalitini ishlatishni talab qiladi.

Microsoft PEVerify.exe degan vositani taqdim etadi. Bu vosita assemblyning barcha metodlarini tekshiradi va xavfli kodni o'z ichiga olgan metodlar haqida xabar beradi.

NGen.exe — Native Kod Generator Vositasi

NGen.exe vositasi .NET Framework bilan birga keladi va ilova foydalanuvchining mashinasiga o'rnatilganda IL kodni native kodga kompilatsiya qilish uchun ishlatilishi mumkin. Kod o'rnatish vaqtida kompilyatsiya qilinganligi sababli, CLR ning JIT kompilyatori IL ni ish vaqtida kompilyatsiya qilishi shart emas va bu ilova unumdorligini yaxshilashi mumkin.

NGen.exe vositasi ikki holatda qiziqarli:

  • Ilova ishga tushish vaqtini yaxshilash: Kod allaqachon native kodga kompilyatsiya qilinganligi sababli, ish vaqtida kompilyatsiya talab qilinmaydi.
  • Ilova ishchi to'plamini kamaytirish: Agar assembly bir vaqtning o'zida bir nechta jarayonlarga yuklanishi kerak deb hisoblasangiz, NGen.exe IL ni native kodga kompilyatsiya qiladi va natijani alohida faylda saqlaydi. Bu faylni bir nechta jarayon address space lariga xotira-xaritalash mumkin.

Biroq, NGen'd fayllar bilan bir nechta potentsial muammolar mavjud:

  • Intellektual mulk himoyasi yo'q: IL va metadata saqlanishi shart, chunki CLR ularga ish vaqtida murojaat qiladi.
  • NGen'd fayllar sinxronsizlanishi mumkin: CLR versiyasi, CPU turi yoki assembly versiyasi o'zgarganda NGen'd fayllar yaroqsiz bo'lib qoladi.
  • Ish vaqtida past unumdorlik: NGen bajarilish muhiti haqida JIT kompilyator kabi ko'p taxmin qila olmaydi, shuning uchun NGen'd ilovalar JIT-kompilyatsiya qilinganlariga qaraganda ~5% sekinroq ishlashi mumkin.

Framework Class Library (FCL)

.NET Framework Framework Class Library (FCL) ni o'z ichiga oladi. FCL — bu har bir tur ba'zi funksionallikni ta'minlaydigan bir necha ming turdagi ta'riflarni o'z ichiga olgan DLL assemblylar to'plami. Microsoft qo'shimcha kutubxonalar ham ishlab chiqaradi — Windows Azure SDK va DirectX SDK.

Quyida dasturchilar bu assemblylar yordamida yarataishi mumkin bo'lgan ilovalar turlarining ba'zilari keltirilgan:

  • Web xizmatlari — Internet orqali xabarlarni qayta ishlovchi metodlar
  • Web Forms / MVC HTML-ga asoslangan ilovalar — ma'lumotlar bazasi so'rovlari va veb xizmatlarni chaqirib, boy HTML interfeysda taqdim etuvchi ilovalar
  • Boy Windows GUI ilovalari — Windows Store, WPF yoki Windows Forms texnologiyalari
  • Windows konsol ilovalari — oddiy UI talab qiladigan kompilyatorlar va vositalar
  • Windows xizmatlari — Windows Service Control Manager orqali boshqariladigan xizmatlar
  • Ma'lumotlar bazasi protseduralar — SQL Server, DB2 va Oracle da saqlangan protseduralar
  • Komponent kutubxonalari — mustaqil assemblylar (komponentlar)

FCL minglab turlarni o'z ichiga olganligi sababli, tegishli turlar to'plami dasturchiga bitta namespace (nomlar fazosi) ichida taqdim etiladi. 1-3 jadvalda ba'zi umumiy FCL namespace lari keltirilgan:

NamespaceTavsif
SystemHar bir ilova foydalanadigani asosiy turlar
System.DataMa'lumotlar bazasi bilan muloqot qilish turlari
System.IOOqimli I/O, papka va fayllar bilan ishlash turlari
System.NetPast darajadagi tarmoq aloqasi turlari
System.SecurityMa'lumotlarni himoya qilish turlari
System.TextTurli kodlashlar (ASCII, Unicode) bilan ishlash turlari
System.ThreadingAsinxron operatsiyalar va resurslarga sinxron kirish turlari
System.XmlXML sxemalari va ma'lumotlarini qayta ishlash turlari

Common Type System (CTS)

Hozirgacha sizga aniq bo'lishi kerakki, CLR turlar haqida. Turlar ilovangizga va boshqa turlarga funksionallikni ta'minlaydi. Turlar — bu bir dasturlash tilida yozilgan kod boshqa tilda yozilgan kod bilan gaplashishi mumkin bo'lgan mexanizm. Turlar CLR ning markazida joylashganligi sababli, Microsoft rasmiy spetsifikatsiya — Common Type System (CTS) — yaratdi. Bu spetsifikatsiya turlarning qanday aniqlanishi va qanday xatti-harakat ko'rsatishini belgilaydi.

CTS spetsifikatsiyasi tur nol yoki undan ortiq a'zolarga ega bo'lishi mumkinligini belgilaydi. Quyida ularning qisqacha tavsifi:

  • Field (Maydon) — obyekt holatining bir qismi bo'lgan ma'lumot o'zgaruvchisi
  • Method (Metod) — obyektda amal bajaradigan funksiya, odatda holatni o'zgartiradi
  • Property (Xususiyat) — chaqiruvchiga maydon kabi ko'rinadigan, lekin amalga oshiruvchiga metod kabi ishlaydigan a'zo
  • Event (Hodisa) — obyekt va boshqa qiziquvchi obyektlar o'rtasida xabarnoma mexanizmi

CTS turlar ko'rinuvchanlik va a'zolarga kirish qoidalarini ham belgilaydi:

  • private — a'zoga faqat bir xil klass turidan kiriladi
  • family — a'zoga hosila turlardan kiriladi (protected)
  • family and assembly — a'zoga faqat bir xil assemblydagi hosila turlardan kiriladi
  • assembly — a'zoga bir xil assemblydagi har qanday koddan kiriladi (internal)
  • family or assembly — a'zoga istalgan assemblydagi hosila turlardan kiriladi (protected internal)
  • public — a'zoga istalgan assemblydagi har qanday koddan kiriladi

Yana bir muhim CTS qoidasi: barcha turlar oldindan aniqlangan System.Object turidan meros olishi kerak. System.Object — bu barcha boshqa turlarning ildizi bo'lib, har bir tur misoliga quyidagi minimal xatti-harakatlar to'plamini kafolatlaydi:

  • Ikkita misolni tenglik uchun solishtirish
  • Misol uchun xesh kodini olish
  • Misolning haqiqiy turini so'rash
  • Misolning sayoz (bitwise) nusxasini yaratish
  • Misolning joriy holatining matn tasvirini olish

Common Language Specification (CLS)

COM turli tillarda yaratilgan obyektlar o'rtasida muloqot o'rnatish imkonini bergan. CLR esa hozir barcha tillarni integratsiya qiladi va bir tilda yaratilgan obyektlarga butunlay boshqa tilda yozilgan kod tomonidan teng munosabatda bo'lish imkonini beradi. Bu integratsiya CLR ning standart turlar to'plami, o'z-o'zini tavsiflovchi metadata va umumiy bajarilish muhiti tufayli mumkin.

Garchi tillararo integratsiya ajoyib maqsad bo'lsa-da, haqiqat shuki, dasturlash tillari bir-biridan juda farq qiladi. Masalan, ba'zi tillar katta-kichik harflarni farqlamaydi, ba'zilari imzosiz butun sonlarni qo'llab-quvvatlamaydi.

Agar siz boshqa dasturlash tillaridan oson foydalanilishi mumkin bo'lgan turlar yaratmoqchi bo'lsangiz, faqat dasturlash tilingizning barcha boshqa tillarda kafolatlangan xususiyatlaridan foydalanishingiz kerak. Bunga yordam berish uchun Microsoft Common Language Specification (CLS) ni aniqlagan. CLS kompilyator ishlab chiqaruvchilarga ularning kompilyatorlari qo'llab-quvvatlashi kerak bo'lgan minimal xususiyatlar to'plamini batafsil ko'rsatadi.

C# using System; // Kompilyatorga CLS muvofiqligini tekshirishni aytish [assembly: CLSCompliant(true)] namespace SomeLibrary { public sealed class SomeLibraryType { // Ogohlantirish: qaytarish turi CLS ga mos emas public UInt32 Abc() { return 0; } // Ogohlantirish: faqat katta-kichik harf bilan farqlanadi public void abc() { } // Ogohlantirish yo'q: private metod private UInt32 ABC() { return 0; } } }

Bu kodda [assembly: CLSCompliant(true)] atributi qo'llanildi. Bu kompilyatorga ochiq turda boshqa dasturlash tillaridan foydalanishga to'sqinlik qiladigan konstruktsiyalar yo'qligini tekshirishni aytadi.

CLS qoidalarini juda oddiy qilib aytaman: CLR da turning har bir a'zosi maydon (ma'lumot) yoki metod (xatti-harakat) bo'ladi. Har bir dasturlash tili maydonlarga kira olishi va metodlarni chaqira olishi kerak. Ma'lum maydonlar va metodlar maxsus usullarda ishlatiladi. Dasturlash tillari odatda qo'shimcha abstraksiyalarni taklif qiladi — enum, massiv, property, indeksator, delegat, hodisa, konstruktor, finalizator, operatorni qayta yuklash va boshqalar. Kompilyator bu konstruktsiyalarni uchratganda, ularni CLR va boshqa dasturlash tillari foydalana oladigan maydonlar va metodlarga tarjima qilishi kerak.

Boshqarilmaydigan Kod bilan Interoperabillik

.NET Framework boshqa dasturiy ta'minot platformalari ustidan ko'plab afzalliklarni taklif qiladi. Biroq, juda kam kompaniyalar barcha mavjud kodlarini qayta loyihalash va qayta yozishga imkoniyat topa oladi. Microsoft buni tushunadi va CLR ni shunday quriganki, u boshqariladigan va boshqarilmaydigan qismlardan iborat ilovaga imkon beradi. Xususan, CLR uchta interoperabillik stsenariyni qo'llab-quvvatlaydi:

  • Boshqariladigan kod DLL dagi boshqarilmaydigan funksiyani chaqirishi mumkin: Boshqariladigan kod P/Invoke (Platform Invoke) mexanizmi yordamida DLL lardagi funksiyalarni osongina chaqirishi mumkin. Aslida, FCL da aniqlangan turlarning ko'pchiligi Kernel32.dll, User32.dll va boshqalardan funksiyalarni chaqiradi.
  • Boshqariladigan kod mavjud COM komponentini ishlatishi mumkin: Turdagi kutubxonadan foydalanib, COM komponentini tavsiflovchi boshqariladigan assembly yaratilishi mumkin. Boshqariladigan kod ushbu assemblydagi turga xuddi boshqa boshqariladigan tur kabi murojaat qilishi mumkin.
  • Boshqarilmaydigan kod boshqariladigan turni ishlatishi mumkin: Ko'plab mavjud boshqarilmaydigan kodlar to'g'ri ishlashi uchun COM komponentini talab qiladi. Bu komponentlarni boshqariladigan kod yordamida amalga oshirish ancha oson — reference counting va interfeyslar bilan ishlamasdan. Masalan, C# da ActiveX boshqaruv elementi yoki shell kengaytmasini yaratishingiz mumkin.

Windows 8 bilan Microsoft yangi Windows API — Windows Runtime (WinRT) — ni taqdim etdi. Bu API ichki ravishda COM komponentlari orqali amalga oshiriladi. .NET Framework kutubxona tomonidan yaratilgan ECMA standart metadata orqali API ni tavsiflovchi tur kutubxonalari o'rniga, COM komponentlari o'z API larini metadata orqali tavsiflovchi fayllardan foydalanadi. Bu .NET tilida yozilgan kodning (aksariyat hollarda) WinRT API lari bilan muammosiz muloqot qilishi mumkinligini anglatadi.