بررسی CLR فريمورک دات نت New Page 1



ساير




 

 

 

SAKHA RAVESH CO.

 ا مروز

 پنجشنبه  8  تير  1396  2017  Jun.  29   Thursday ToDay
صفحه اصلی  مقالات نکته هادايره المعارف خودآموزها | تازه ها خود آزمون ها    
  نسخه قابل چاپ  

    5 4 3 2 1 

 عنوان

 نويسنده

  مشاهده

 تعداد آراء

 امتياز

 مفاهيم اوليه CLR فريمورک دات نت ( بخش اول )

 مديريت وب

17272

71

4.4

با توجه به جایگاه داده در عصر حاضر و  لزوم نگاه جامع به این مقوله مهم ، بر آن شدیم تا محوریت فعالیت های خود را بر  روی این موضوع متمرکز نمائیم . از این رو گروه فابک با شعار فناوری اطلاعات برای کسب وکار شکل گرفت و  خدمات خود  را از طریق  سایت www.fabak.ir  به مخاطبان محترم عرضه می نماید

 

مفاهيم اوليه CLR فريمورک دات نت

مفاهيم اوليه CLR  فريمورک دات نت ( بخش اول )

فريمورک دات نت يک محيط اجراء با نام CLR)Common Language Runtime) را ارائه که مسئوليت مديريت اجرای کد و تامين سرويس های لازم بمنظور پياده سازی نرم افزار را  برعهده دارد . CLR ، زيرساخت مستحکمی را بمنظورايجاد انواع نرم افزار در اختيار پياده کنندگان قرار می دهد . يک برنامه ASP.NET  ، يک برنامه فرم های ويندوز ، يک سرويس وب ، يک برنامه مختص موبايل ، يک برنامه توزيعی و يا يک برنامه که چندين مدل از برنامه های فوق را با يکديگر ترکيب می نمايد ، نمونه هائی از برنامه هائی می باشند که می توان آنها را بر اساس زيرساخت ارائه شده ، پياده سازی نمود.  CLR ، دارای مزايای متعددی بمنظور پياده سازی سريع و آسان نرم افزار با قابليت مهم ارتباط و يکپارچگی بين کدهای نوشته توسط زبانهای متفاوت برنامه نويسی است .
 درمجموعه مقالاتی که در اين زمينه ارائه خواهد شد به بررسی
CLR
، خواهيم پرداخت .

CLR ، ابزاری ( Engine) است که دستورالعمل های IL)Intermediate Language) را بعنوان ورودی اخذ و در ادامه آنها را به دستورالعمل های زبان ماشين ترجمه و در نهايت آنان را اجراء می نمايد. موضوع فوق ، بدين معنی نيست که CLR ، دستورالعمل ها را  تفسير می نمايد. عبارت فوق ، بدين دليل بيان شده است که بنوعی به اين موضوع اشاره گردد  که CLR ، محيط لازم بمنظور اجرای کد IL را فراهم می نمايد. بمنظور نيل به اهداف مورد نظر خصوصا" : کارآمدی کدها و قابليت حمل آنان ، هسته اجرائی می بايست، شرايط ومحيط  لازم بمنظور ايجاد کد  با  لحاظ نمودن اهداف موردنظر ( کارآمد ،  قابليت حمل)  را ارائه نمايد.  کارآمدی کدها ، يکی از مسائل کليدی در رابطه با محيط اجراء خواهد بود. اگر کد، با سرعت قابل قبول اجراء نگردد ، تمام ويژگی های ديگر موجود در سيستم ، تحت الشعاع  قرار خواهند گرفت .
 قابليت حمل ، امکان استفاده از نرم افزار را مستقل از نوع پردازنده و دستگاه فراهم می نمايد. بنابراين افزايش تعداد پردازنده ها و دستگاههائی که
CLR  می تواند بر روی آنها اجراء گردد، همواره دارای اهميت خاص خود خواهد بود. ماکروسافت و اينتل برای مدت زمان زيادی ، دارای همکاری مناسبی  در عرصه تجارت بودند. ماکروسافت  کم و بيش از خط پردازنده های اينتل بمنظور اجراء نرم افزارهای خود ، استفاده می کرد.بدين ترتيب ، ماکروسافت ، بدون وجود نگرانی ( حمايت از معماری چندين پردازنده ای و دستورالعمل های مربوطه ) ، اقدام به ايجاد و پياد ه سازی  نرم افزار می نمود. شرکت ماکروسافت هرگز نگران ارائه يک نسخه خاص از محصولات خود برای يک نسخه خاص از پردازنده های Motoral 68XXX ، نبود ، چراکه اصولا" آنها را حمايت نمی کرد . بروز محدوديت در حمايت از پردازنده ها در زمان انتقال از برنامه ها یمبتنی بر Win16 به Win32، بعنوان يک مسئله مهم ،مطرح گرديد. ( ما عملا" دارای API با نام Win16 نبوده ايم ، ولی می توان اين واژه را برای API قبل از Win32 استفاده کرد) . ماکروسافت اگر می خواهد همچنان بعنوان يکی از شرکت های فعال در زمينه توليد و طراحی نرم افزار در سطح جهان مطرح باشد ، می بايست تدابير لازم در خصوص قابليت حمل نرم افزارهای پياده سازی شده خود را بر روی محيط های متفاوت فراهم نمايد. باتوجه به تغييرات بنيادين و مهم در طراحی و پياده سازی برنامه های مبتنی بر وب طی ساليان اخير  و ضرورت استفاده از دستگاههای متعدد بمنظور ارتباط به اينترنت و در نهايت استفاده از خدمات برنامه های موجود ، ما با واقعيت بزرگ ديگری نيز مواجه هستيم و آن اينکه هر يک از دستگاههای موجود ( تلفن های موبايل ، کامپيوترهای hand-held ، tablet ، ) دارای معماری و پردازنده اختصاصی خود می باشند. با توجه به وضعيت موجود، می بايست تمهيدات و تدابير خاصی در رابطه با طراحی و پياده سازی انديشيده گردد که ماحصل آن قابليت حمل نرم افزار از يک معماری خاص به معماری ديگر باشد .
 ماکروسافت نيز در صدد حضوری فعال تر و ارائه نرم افزار در رابطه با دستگاه های فوق ، است ، بديهی است می بايست اقدامی صورت می گرفت که پاسخگوی واقعيت های جديد صنعت نرم افزارباشد . ماکروسافت در پاسخ به محدوديت های موجود، خواسته های جديد و حل مشکل قابليت حمل به ساير پردازنده ها ، تصميم به ايجاد يک محيط اجراء و يا
CLR نمود ه  است .
در ادامه اين مقاله ، قصد داريم بدون درگير شدن به جزيئات مربوطه ، به بررسی محيط اجراء پرداخته  امکانات آن را در رابطه با اجرای برنامه های
managed
، بررسی نمائيم .

مروری بر  Runtime 
قبل از دات نت، يک برنامه اجرائی معمولا" بصورت يک فايل با انشعاب
exe. ارائه می گرديد ( برنامه  صرفا" شامل يک فايل بود) . بمنظور اجراء کارآمد تمامی سيستم ، برنامه می بايست از کدهائی استفاده نمايد که بصورت اشتراکی باشند ( معمولا" يک فايل با انشعاب dll. ) اگر در زمان استفاده از کد مشترک ، مسائلی ايجاد می گرديد، می توان  از يک کتابخانه وارداتی استفاده و يا  يک DLL را در زمان اجراء ، load کرد ( با استفاده از LoadLibrary,LoadLibraryEx و GetProcAddress

در دات نت ، واحد اجراء و بکارگيری ، اسمبلی (Assembly ) است . فرآيند اجراء، همواره با يک اسمبلی که  دارای  انشعاب exe . می باشد ، آغاز می گردد . برنامه می تواند  از کد اشتراکی بکمک  Importing  اسمبلی که شامل کد مشترک بهمراه يک مرجع صريح است ، استفاده نمايد ( برای اضافه نمودن مرجع ، می توان  از AddReference در ويژوال استوديو دات نت استفاده کرد )  برنامه ها همچنين می توانند با استفاده از  Assembly.Load و يا Assembly.loadForm  ، اقدام به استقرار يک اسمبلی در حافظه  نمايند .
در ادامه  ، لازم است با برخی از اصطلاحات آشنا و تعريف مناسبی از آنها را ارائه نمائيم  .

  •  اسمبلی(Assembly ) . اسمبلی واحد اوليه بکارگيری نرم افزار در فريمورک دات نت است .يک اسمبلی می تواند شامل مراجعی به ساير اسمبلی ها و ماژول ها باشد .

  • ماژول( Module )  . ماژول، فايلی شامل محتويات اجرائی است . يک اسمبلی می تواند يک و يا بيش از يک ماژول را کپسوله نمايد.  يک ماژول بدون اينکه يک اسمبلی به آن مراجعه ای  داشته باشد ، Stand alone  نمی گردد . کلاسی در کنابخانه کلاس پايه ( System) ، مسئوليت کپسوله نمودن اکثر ويژگی های يک " ماژول " را برعهده دارد ( مشابه اسمبلی ).  اين کلاس Module ، نام دارد.

  • APPDomain ،  بعنوان يک  پردازه کم حجم ( سبک )  در نظر گرفته می شود.قبل از دات نت ، ايزولاسيون  از طريق جداسازی  پردازش ها  از يکديگر و بکمک سيستم عامل انجام می گرديد. اگر پردازه ای ، عمليات نامشحص و تعريف نشده ای  را  انجام   که باعث بروز مشکل برای ادامه حيات خود می گرديد ، حرکت وی باعث بروز اختلال در تمام سيستم  نشده  و صرفا" مشکل بوجود آمده در ارتباط با پردازه  خواهد بود . با توجه به اينکه "نوع ها"  ،بصورت کاملا" هدايت شده توسط فريمورک دات نت کنترل می گردند ، می توان از روش هائی بمنظورپياده سازی سطح مشابهی  ايزولاسيون در ارتباط با  يک پردازه استفاده کرد . اين روش Application Domain ويا AppDomain ناميده می شود. همانند اسمبلی و ماژول ، يک کلاس در کتابخانه کلاس فريمورک دات نت ، اکثر ويژگی ها و پتانسيل های  مربوط به يک Application Domain را کپسوله می نمايد. کلاس فوق ، AppDomain ناميده شده و در namespace با نام System قرار دارد .

  • IL  يا MSIL .  واژه IL از Intermediate Language و MSIL از Microsoft Intermediate Language ، اقتباس شده اند . IL  ، زبانی است که  اسمبلی ها  توسط آن نوشته شده و شامل مجموعه ای از دستورالعمل هائی است که کد مربوط به برنامه را ارائه می نمايند. به زبان فوق بدين دليل بدين دليل " ميانی " ( Intermediate )  ، اطلاق می گردد ، چون هنوز  بصورت native code  درنيامده است . در زمان مورد نطر ، کدهای IL توسط کمپايلر JIT به native code ، ترجمه خواهند شد .

  • JIT . واژه JIT از کلمات Just-In-Time اقتباس شده است . از کمپايلر فوق ، بمنظور ترجمه کدهای IL به native code استفاده می شود.

 پس ازاستقرار کد در حافظه ( Loading ) ، امکان اجرای آنان فراهم می گردد . از اين مرحله به بعد ( آغاز عمليات اجراء کد ) ، تفاوت محسوسی را بين  برنامه های قديمی ( قبل از دات نت ) و برنامه های جديد ( دات نت ) ، شاهد خواهيم بود . در حالت کد غيرمديريت يافته ( Unmanaged) ، کمپايلر و linker  بر روی کدهای مربوطه عمليات خود را آغاز و آنها را به native code تبديل می نمايند . بدين ترتيب  ،دستورالعمل ها می توانند بلافاصله اجراء گردند. لازم است به اين نکته مهم اشاره گردد که در صورتيکه قصد استفاده از برنامه نوشته شده بر روی محيط های متفاوت ( ساير پلات فرم ها ) وجود داشته باشد ، می بايست برای هر يک نسخه ای جداگانه را کمپايل کرد. در برخی حالات ، امکان ايجاد و ترجمه نسخه های متعدد بمنظور اجراء بر روی محيط های متفاوت ، امری مطلوب بنظر نمی رسد ، در چنين مواردی سعی می گردد ، صرفا" يک نسخه ارائه گردد. نسخه فوق ، بگونه ای طراحی و پياده سازی می گردد که بتواند با محيط های متفاوت سازگار باشد . بدين ترتيب ، امکان اجراء نرم افزارهای توليدی در محيط های متفاوت ، فراهم خواهد شد . وجود پتانسيل در بطن يک دستگاه سخت افزاری يک موضوع است و ارائه برنامه ای که زمينه بهره برداری از پتانسيل های مربوطه را فراهم  و برنامه ای که از پتانسيل های دستگاه فوق ، در نهايت استفاده می نمايد ، موضوعات ديگری است . مثلا" امروز ما کمتر شاهد ارائه نرم افزار از طرف شرکت های توليد کننده ای می باشيم که تاکيد و اصرار بر استفاده از يک محيط سخت افزاری  نظير وجود يک " شتاب دهنده گرافيک " ، داشته باشند . در چنين موارد علاوه بر اينکه توليد کننده " شتاب دهنده گرافيک " ، می بايست برای هر " کارت شتاب دهنده گرافيک " ، برنامه ای خاص را ارائه نمايد ، بلکه همچنين پياده کنندگان می بايست از برناهه های مجزائی برای هر يک از کارت ها ی عرضه  شده ، استفاده نمايند . " شتاب دهنده گرافيک " ، صرفا" يک نمونه در اين رابطه بوده و می توان به مواردی ديگر نظير :  disk cache,memory cache ، شبکه های با سرعت بالا ،   سيستم های مبتنی  بر چندين پردازنده  و  سخت افزارهای خاص بمنظور پردازش تصاوير، اشاره کرد .

يکی از اولين مراحلی که CLR  در ارتباط  با اجراء يک برنامه انجام می دهد ، بررسی متدی است که می بايست اجراء گردد ( آيا  به native code ،تبديل شده است ؟) . در صورتيکه متد به native code ، تبديل نشده باشد ، کد موجود در متد بصورت  JITd) Just - In - time compild) خواهد بود . تاخير در ترجمه يک متد ،  دارای دو مزيت است :

  • يک شرکت می تواند نسخه ای از نرم افزار توليد ی خود را براحتی بر روی محيط مورد نظر خود منتقل ( در محيط فوق نسخه ای از CLR نصب شده است ) و از CLR   بمنظور مديريت و سفارشی نمودن  کدها،  متناسب با محيط سخت افزاری مربوطه ، استفاده نمايد .

  •  کمپايلرهای JIT قادر به استفاده از مزايای بهينه سازی می باشند . بدين ترتيب ، امکان  اجراء سريعتر يک برنامه نسبت به يک برنامه همه منظور( نسخه unmanaged برنامه )  ، فراهم می گردد . سيستم هائی که دارای پردازنده های 64 بيتی می باشند ، دارای يک مد " سازگاری "  خواهند بود  که به برنامه های سی و دو بيتی   اجازه می دهد بدون اعمال تغييرات  بر روی يک پردازنده 64 بيتی اجراء گردند .اگر برنامه ای به IL ترجمه گردد ، می تواند از مزايای پردازش 64 بيتی بهره مند گردد (موتور JIT ، قادر به target نمودن پردازنده جديد 64 بيتی است) .

فرآيند استقرار يک متد در حافطه ( Loading )  و ترجمه آن ، در صورت نياز تکرار  تا زمانيکه تمام متدها ی موجود در برنامه ترجمه  و يا برنامه متوقف گردد .

شروع يک متد
CLR ، درارتباط با هر متد به اطلاعات زير نياز خواهد داشت . تمامی اطلاعات مورد نياز CLR  از طريق  متاديتا  ( Metadate)  موجود در هر اسمبلی در دسترس و ارائه خواهد شد .

  • دستورالعمل ها . CLR ، نيازمند ليستی از دستورالعمل های MSIL است . هر متد دارای اشاره گری به مجموعه دستوراتی است که بعنوان بخشی از متا ديتا ی مورد نظری است که به آن مرتبط شده است.

  • Signature .  هر متد دارای يک Signature است و CLR نيازمند استفاده از يک signature برای هر متد است . signature ،  برگرداندن نوع ، تعداد پارامتر و نوع پارامترها  را تشريح می نمايد.

  • Exception Handling Array .  دستورالعمل خاصی از IL که مربوط به برخورد با exception باشد ، وجود ندارد . در اين رابطه از  دايرکتيوهائی خاص در مقابل دستورالعمل های IL ، استفاده می گردد . در مقابل دستورالمل های Exception-handling ، اسمبلی دارای  ليستی از exceptions است . ليست فوق،  شامل نوع exception ، يک آدرس offest به اولين دستورالعمل پس از بلاک exception try   ، طول مربوط به بلاک try  ، است . ليست فوق ، همچنين شامل آفست  به handler code ، طول handler code ، و يک token  که مسئول تشريح کلاسی  است که از آن بمنظور کپسوله نمودن exception استفاده می گردد .

  • اندازه Evaulation stack . داده فوق ، از طريق متا ديتا اسمبلی قابل دسترس خواهد بود. می توان آن را از طريق  maxstack   x در ليست ILDASM مشاهده نمود. مقدار  x  ، اندازه پشته مورد نظر است . اندازه منطقی پشته  که توسط  x  ، مشخص شده است ، حداکثر  آيتم هائی را که می توان در پشته ، مستقر ( Push ) نمود ، مشخص می نمايد. اندازه فيزيکی آيتم ها و پشته  به CLR  واگذار تا در زمان اجراء آن را مشخص نمايد (زمانيکه  متد JITd است ) .

  • تشريح بردارهای محلی . هر متد نيازمند تعريف و  ذخيره سازی محلی آيتم های مورد نياز است.  evaluation stack ،(  برداری منطقی از آيتم ها  بهمراه  نوع هر آيتم)  و استفاده از يک flag در متاديتا بمنظور  مشخص نمودن ضرورت  مقداردهی اوليه ( مقدارصفر )  متغيرهای محلی در ابتدای فراخوانی يک متد ، نمونه هائی در اين زمينه می باشند.

با استفاده از اطلاعات فوق ، CLR ، قادر به ايجاد يک abstraction از چيزی خواهد بود که native stack frame است. عموما" هر پردازنده و يا ماشين يک stack frame را شکل که شامل آرگومانها ( پارامترها ) و يا مرجع به آرگومانها ی مربوط به متد است . در وضعيتی مشابه ، متغيرهای برگردانده شده در stack frame بر اساس  فراخوانی که وابسته به يک پردازنده و يا ماشين خاص است ، ذخيره می گردند. اولويت پارامترهای ورودی و خروجی در رابطه با  يک ماشين خاص ، مشخص می گردد . با توجه به اينکه تمام اطلاعات مورد نياز برای هر متد در دسترس است ، CLR  ، قادر به تشخيص وضعيت مورد نظر  stack frame ، در زمان اجراء است .
فراخوانی يک متد بگونه ای انجام خواهد شد که CLR دارای حداقل کنترل در رابطه با اجراء متد و حالت آن باشد .زمانيکه CLR ، يک متد را فرامی خواند ، متد  و حالت آن تحت کنترل CLR  خواهد بود ( Thread of control ) .
دربخش دوم اين مقاله به بررسی  نوع ها ی حمايت شده توسط
IL ، خواهيم پرداخت .



جستجو

مقالات                 
دايره المعارف       
دوره های آموزشی


 

 

مشاهده گروه ها



              

 

 تهيه شده در شرکت سخا روش -  1382