بررسی نوع ها ی حمايت شده و فراخوانی متد New Page 1



ساير




 

 

 

SAKHA RAVESH CO.

 ا مروز

 شنبه  6  خرداد  1396  2017  May  27   Saturday ToDay
صفحه اصلی  مقالات نکته هادايره المعارف خودآموزها | تازه ها خود آزمون ها    
  نسخه قابل چاپ  

    5 4 3 2 1 

 عنوان

 نويسنده

  مشاهده

 تعداد آراء

 امتياز

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

 مديريت وب

8305

1

4

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

 

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

مفاهيم اوليه CLR  فريمورک دات نت ( بخش دوم )
در بخش اول اين مقاله به بررسی مفاهيم اوليه CLR ، آشنائی با Runtime و نحوه شروع بکار متدها ، اشاره گرديد . در اين بخش به بررسی نوع ها ی حمايت شده توسط IL و فراخوانی متدها ،  خواهيم پرداخت .

نوع ها ی حمايت شده در
IL
مجموعه ای از نوع ها ی متفاوت در سطح
IL ارائه شده است . نوع های فوق را می توان  مستقيما" و از طريق دستورالعمل های IL  استفاده نمود .برخی از نوع های حمايت شده در IL  عبارتند از :

  • int8 :  هشت بيتی علامت دار ( متمم دو ) 
  • Unsigned int8 :  هشت بيتی بدون علامت
  • int16 :  شانزده بيتی علامت دار
  • Unsigned int16  : شانزده بيتی بدون علامت 
  •  int32 : سی و دو بيتی علامت دار
  • Unsigned int32 : سی و دو بيتی بدون علامت 
  • int64 : شصت و چهار بيتی علامت دار
  • Unsigned : شصت و چهار بيتی بدون علامت 
  • float32 :  سی و دو بيتی اعشاری
  • float64  : شصت و چهار بيتی  اعشاری
  • native int : نوع فوق ، دارای اندازه Native بوده و اعداد علامت دار متمم دو را در خود نگهداری می نمايد.
  • native unsigned int : نوع فوق ،  دارای اندازه Native بوده و مقادير بدون علامت باينری را در خود نگهداری می نمايد .
  • F :  متغير اعشاری Native size . اين متغير برای CLR داخلی بوده و برای کاربر مشهود نيست .
  • O . يک شی با اندازه native  بمنظور اشاره به حافظه مديريت يافته (اداره شده ).
  • & . اشاره گر مديريت يافته( اداره شده )  با اندازه native 

نوع های فوق ، قابل ارائه در حافظه بوده ولی در ارتباط با پردازش آنان ، برخی محدوديت ها وجود دارد . CLR ، پردازش های  لازم در ارتباط با نوع های  فوق را از طريق يک پشته ارزيابی  ( evaluation stack) که بعنوان بخشی از حالت داده در رابطه با هر متد می باشد ، انجام می دهد .  پشته فوق ، قادر به ارائه يک آيتم با هر اندازه ای می باشد. تنها عمليات مجاز در اين رابطه ، تکثير آنان به حافظه ( و يا از حافظه )  و محاسبه آدرس نوع های تعريف شده توسط کاربر است . تمامی عملياتی که شامل مقادير اعشاری می باشند از يک نمايش داخلی برای ارائه اعداد اعشاری استفاده که به سبک خاصی پياده سازی  شده است ( يک مقدار F ) .
ساير نوع های داده ، بجزء مقاير اعشاری که به آنان اشاره گرديد ، دارای يک اندازه
native می باشند : native int  ، native unsigned int ، مرجع شی ( O ) و اشاره گر مديريت يافته ( &)  . نوع های داده فوق ، مکانيزمی برای CLR بمنظور تاخير در انتخاب اندازه نوع مورد نظر می باشد . مثلا" ، مکانيزم فوق ، اين امکان را فراهم می آورد که  يک native int  بر روی يک ماشين شصت و چهار بيتی ، 64 بيت  و در يک ماشين سی و دو بيتی ،  32 بيت در نظر گرفته شود.
دو نوع از داده های فوق(
native ) ،  بنظر مشابه يکديگر می باشند . نوع O ( با اندازه native و اشاره به شی ) و نوع & ( با اندازه native اشاره گر مديريت يافته ) . يک متغير از نوع O ، به يک شی مديريت يافته ، اشاره و استفاده از آن محدود به دستورالعمل هائی است که با صراحت يک عمليات بر روی يک شی مديريت يافته را انجام  و يا دستورالعمل هائی که متايتا آنان امکان  اشاره به يک شی  مديريت يافته  را اجازه داده باشد، . نوع O ، به خارج از شی  و يا تمام شی اشاره می نمايد . نوع & ، نيزبه يک شی مديريت يافته ، اشاره نموده با اين محدوديت که صرفا" به يک فيلد شی و يا عنصری از بردار ، اشاره خواهد کرد . نوع های  O و & ، توسط CLR رديابی شده و می توانند با توجه به نتايج  جمع آوری اطلاعات زائد ( garbage collection) ، تغيير نمايند .
يکی از موارد خاص استفاده از نوع های
native ، اشاره گرهای غير مديريت يافته است . با اينکه نوع اشاره گره های غيرمديريت يافته را می توان توسط متاديتا ، مشخص نمود ولی  آنان بعنوان native unsigned int در کد IL نشان داده می شوند . بدين ترتيب ، CLR دارای انعطاف لازم بمنظور نسبت دهی يک اشاره گر غيرمديريت يافته به يک فضای آدرس دهی بزرگ و بر روی پردازنده ای است که آن را حمايت ولی الزامی دررابطه با درگير شدن حافظه بمنظور ذخيره سازی مقادير فوق بر روی  پردازنده هائی که دارای قابلیيت آدرس دهی چنين فضای  آدرس دهی بزرگی نمی باشند ، وجود نخواهد داشت .
برخی از دستورالعمل های
IL نيازمند وجود يک آدرس در پشته می باشند ، دستورالعمل های زير : calli    ، cpblk ، initblk  نمونه هائی در اين زمينه می باشند. استفاده از يک نوع native ، قابليت حمل مناسبی در ارتباط با عملياتی که شامل نوع فوق می باشند را فراهم و تضمين می نمايد . در صورتيکه آدرس مشخص شده ، يک عدد 64 بيتی صحيح را مشخص نمايد ،  در ادامه ،قابليت حمل آن در صورت دنبال نمودن مراحل موردنظر بمنظور اطمينان از تبديل مقدار به يک آدرس فراهم می گردد .در صورتيکه يک آدرس بعنوان يک عدد سی و دو بيتی و يا کوچکتر مشخص گردد ، کد هرگز قابل حمل نخواهد بود، ولواينکه ممکن است بر روی اکثر ماشين های سی و دو بيتی امکان اجرای آن وجود داشته باشد.  در اکثر موارد ، رويکرد فوق ، ماحصل نتايج  توليد کننده IL و يا کمپايلر بوده و نمی بايست نسبت به اين موضوع نگران گرديد . در اين رابطه لازم است به اين نکته توجه شود که با استفاده غير صحيح از دستورالعمل ها ، ممکن است قابليت حمل کد ، حذف و عملا" امکان چنين پتانسيل ارزشمندی از يک برنامه و يا بخشی از برنامه نوشته شده ، سلب گردد .

مقادير عددی کوچک ( آنانی که  که کمتر از چها ر بايت می باشند ) ، در زمان لود ( زمانيکه از حافظه در پشته قرار می گيرند ) به چهار بايت تبديل  و در زمان ذخيره سازی محدودتر خواهند شد ( کپی از پشته به حافظه ) . هر نوع عملياتی که شامل يک مقدار عددی کوچک  باشد ،  بعنوان يک عمليات چهار بايتی در نظر گرفته شده و با آن برخورد خواهد شد . دستورالعمل های خاص IL که با نوع های عددی کوچک سروکار دارند عبارتند از :

  • عمليات لود و ذخيره سازی به / از حافظه : ldelem, ldind, stind و stelem
  • تبديل داده : conv ,conv.ovf
  • ايجاد آرايه ( بردار ) : newarr

بعبارت ديگر ، IL صرفا" عمليات علامت دار را حمايت می نمايد . تفاوت بين عمليات علامت دار و بدون علامت ، به نحوه تفسير مقدار برمی گردد. برای عملياتی که نحوه تفسير مقدار مورد نظر حائز اهميت است ،  عمليات انجام شده ،  دارای يک نسخه بدون علامت ويک نسخه علامت دار می باشد  .

منزلگاه مقادير
بمنظور رديابی اشياء ، CLR مفهوم جديدی با نام  محدوده ( منزلگاه ) يک شی را  معرفی نموده است . . منزلگاه شی ، محلی است که مقدار شی ذخيره و می بايست دارای مکانيزمی بمنظور مشخص نمودن  نوع شی توسط کمپايلر JIT ، باشد . زمانيکه يک شی بصورت Reference ( ارسال اشاره گری به شی ) ، پاس داده میشود ، شی فوق ، می بايست دارای يک منزلگاه  باشد، چراکه آدرس منزلگاه  بعنوان مرجع ارسال می گردد . در اين رابطه دو نوع داده وجود داشته که بی خانمان ! ( بدون منزلگاه ) بوده و نمی توان آنان را  بصورت Reference  ارسال نمود : مقادير ثابت و ميانی در پشته ارزيابی از دستورالعمل های IL و يا مقادير برگردانده شده توسط متدها .  CLR  منزلگاه های  زير را در ارتباط با  اشياء حمايت می نمايد :

  • آرگومان incoming .  دستورالعمل های ldarg و ldarga ،  آدرس يک آرگومان منزلگاه را مشخص می نمايند. signature متد،  نوع مربوطه را مشخص خواهد نمود.

  • متغيرهای محلی . دستورالعمل های ldloca و يا idloc ، آدرس يک متغير محلی را مشخص می نمايند. پشته ارزيابی محلی ، نوع متغيرهای محلی را بعنوان بخشی از متاديتا  مشخص خواهد نمود.

  • فيلد ( نمونه و يا ايستا ) . استفاده از ldflda برای نمونه ای از فيلد  و ldsflda برای يک فيلد ايستا ، آدرس فيلد مورد نظر رامشخص می نمايد . متا ديتا ئی که با اينترفيس کلاس و يا ماژول مرتبط است ، نوع فيلد را  مشخص خواهد نمود.

  • عنصر آرايه . استفاده از ldelema ، آدرس يک عنصر بردار را مشخص می نمايد. نوع المان بردار، نوع المان را مشخص خواهد نمود.

Method Flow Control
CLR ، مجموعه گسترده ای از دستورالعمل های کنترلی را ارائه می نمايد : 

  • پرش شرطی و غير شرطی . کنترل می تواند در هر محلی از يک متد انتقال يابد، مشروط به اينکه انتقال فوق ، با کرانه های يک محدوده حفاظت شده ، تلاقی ننمايد. يک محدوده حفاظت شده ، در متاديتا تعريف  وناحيه ای  است که با يک exception handler  مرتبط شده است . در سی شارپ ناحيه فوق ، يک try block ناميده  شده و با يک catch block که بعنوان يک handler می باشد ، مرتبط می گردد . CLR ، قابليت اجرای انواع متفاوتی از exception handler  ها را دارا بوده که در بخش بعدی اين مقاله در رابطه با آنان توضيح داده خواهد شد . نکته مهمی که لازم است به آن اشاره گردد ،عدم امکان پرش شرطی و يا غير شرطی به مقصدی است  که با محدوده يک  execption تلاقی می نمايد .

  • فراخوانی متد. دستورالعمل های متفاوتی امکان فراخوانی متدها  توسط متدهای ديگر را فراهم می نمايد.

  • فراخوانی دنباله . نوع خاصی پيشوند است که بلافاصله مقدمات فراخوانی يک متد را فراهم و به  متد فراخوانده شده اعلام می نمايد که فريم پشته را قبل از فراخوانی متد مورد نظر ناديده و رها نمايد . بدين ترتيب ،  متد فراخوانده شده به نقطه ای مراجعت می نمايد که متد صدازننده می بايست مراجعه نمايد .

  • مراجعت . نوع ساده ای بمنظور مراجعت از يک متد است .

  • پرش متد . نوع بهينه شده ای از  فراخوانی "دنباله " بوده که آرگومانها و کنترل يک متد را به متد ديگر منتقل می نمايد ( با signature مشابه )

  •  Exception . شامل مجموعه ای از دستورالعمل ی لازم بمنظور ايجاد يک execption  بوده که کنترل  را به خارج از يک ناحيه حفاظت شده منتقل می نمايد.

CLR ، در موارديکه کنترل درون  يک متد منتقل می گردد ، از مجموعه ای قوانين استفاده می نمايد .

  • کنترل نمی تواند درون يک Exception handler منتقل گردد ( بجز درموارديکه بعنوان نتيجه يک Exception باشد ) . قانون فوق ، نشاندهنده اين واقعيت است که مقصد يک پرش نمی تواند با يک ناحيه حفاظت شده تلاقی نمايد .

  • پس از استقرار در يک handler مرتبط با  يک ناحيه حفاظت شده ، امکان انتقال به خارج از handler  صرفا" از طريق مجموعه ای محدود از دستورالعمل های exception ( نظير : Leave,  end.finally ,end.filter و end.catch ) وجود خواهد داشت .

  • هر اسلات در پشته ارزيابی ، می بايست نگهداری نوع مربوط به خود را در مدت زمان عمر مفيد پشته ارزيابی ( طبيعتا" عمر مفيد متد ) ، انجام دهد . بعبارت ديگر ، نمی توان نوع يک اسلات ( متغير)  در پشته ارزيابی را تغيير داد . موضوع فوق ، مسئله ای خاص را بدنبال نخواهد داشت ، چراکه پشته ارزيابی برای کاربران در دسترس نخواهد بود .

  • اين امکان وجود نخواهد داشت که کنترل بسادگی به حيات خود خاتمه دهد . در اين رابطه لازم است ، تمامی مسيرهای اجراء متوقف گردند . ( استفاده از دستورالعمل های  ret ، Jmp,throw و يا * . tail )

فراخوانی متد
CLR ، قادر به فراخوانی متدها با استفاده از سه روش متفاوت است . تفاوت هر يک از روش های فوق صرفا" به روشی که call site descriptor مشخص می نمايد ، بستگی دارد.call site descriptor ، به CLR و موتور JIT اطلاعات کافی در رابطه با فراخوانی متد را ارائه می نمايد. بنابراين، امکان ايجاد  يک فراخوانی native فراهم ، آرگومان های مناسب امکان دستيابی به متد را ايجاد  و اطلاعات مورد نياز بمنظور مراجعت ايجاد می گردد.

  • دستورالعمل calli ، ساده ترين نوع فراخوانی متد می باشد . دستورالعمل فوق،  زمانيکه آدرس مقصد در زمان اجراء محاسبه می گردد ، استفاده می شود.
  • دستورالعمل call ، در موارديکه آدرس تابع در زمان کمپايل شناخته شده باشد ، استفاده می گردد .
  • دستورالعمل callvirt ، متدی در رابطه با نمونه ای خاص از يک شی را فرامی خواند .

روش فراخوانی متد
CLR از يک روش خاص بمنظور فراخوانی در تمامی کد IL استفاده می نمايد. اگر متدی که صدا زده شده است ، متدی مربوط به يک نمونه باشد ،  يک مرجع به نمونه شی مورد نظر بهمراه  هر يک از آرگومانهای متد با اولويت چپ به راست در پشته مستقر می گردند . بدين ترتيب ، اشاره گرفوق ، در ابتدا  توسط متد فراخوانده شده از پشته برداشته شده ( pop ) و  در ادامه نوبت به هر يک از آرگومان ها  خواهد رسيد ( شروع با آرگومان صفر تا آرگومان شماره n ) . اگر متد فراخوانده شده يک متد ايستا باشد ، اشاره گر مرتبط با نمونه شی مربوطه وجود نداشته و پشته صرفا" شامل آرگومانها خواهد بود . برای دستورالعمل calli ، آرگومانها  با اولويت چپ به راست و بدنبال آن  اشاره گر تابع  درون پشته مستقر می گردند .

ارسال پارامتر متدها
CLR، از سه روش متفاوت برای ارسال  پارامتر  ( parameter-passing )  استفاده می نمايد :

  • By value . در اين روش ، مقدار شی درون پشته قرار خواهد گرفت . برای نوع های از قبل ايجاد شده ، نظير inreger و float ، بسادگی مقدار مورد نظر  درون پشته مستقر می گردد . برای اشياء ، يک نوع مرجع  O مرتبط با شی ، درون پشته قرار خواهد گرفت . برای اشاره گرهای مديريت يافته و غير مديريت يافته ، آدرس در پشته مستقر خواهد شد. برای نوع های تعريف شده توسط کاربر ، می توان  يک مقدار را در پشته ارزيابی مستقر تا زمينه فراخوانی يک متد رابه دو صورت فراهم  نمايد : روش اول :  می توان با استفاده از دستورالعمل های   ldarg , ldloc , ldfld و يا ldsfld مقدار مورد نظررا مستقيما" در پشته قرار داد، . روش دوم : آدرس مقدار مورد نظر محاسبه و مقدار مربوطه را می توان با استفاده از دستورالعمل ldobj  در پشته مستقر نمود.

  • By Reference . با استفاده از روش فوق ، آدرس پارامتر در مقابل مقدار مورد نظر به متد ارسال می گردد.بدين ترتيب ،يک متد قادر به تغيير پارامتر در صورت لزوم می باشد . در اين رابطه صرفا" مقاديری که دارای منزلگاه  می باشند را می توان با استفاده از روش فوق ، ارسال نمود( عملا" آدرس منرلگاه ارسال می گردد ) . بمنظور بررسی امنيت نوع ها ، می بايست از دستورالعمل های * . ldind و* . stind ( به ترتيب ) برای  ارسال و مراجعه به پارامترها ، استفاده گردد.

  •  Type reference . روش فوق ، مشابه يک پارامتر Reference نرمال بوده که بهمراه آن يک نوع داده ايستا بهمراه مرجع داده ارسال می گردد .

در بخش سوم اين مقاله به بررسی Exception Handling خواهيم پرداخت .



جستجو

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


 

 

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



              

 

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