تبلیغات
شمع آنلاین=منبع دانلود - C# 4.0، نگاهی به آینده - قسمت سوم

C# 4.0، نگاهی به آینده - قسمت سوم

نویسنده : Admin چهارشنبه 20 مهر 1390 04:42 ب.ظ  •    ارسال شده در: آموزش c#

#C

در مقالات قبلی از سری C# 4.0، نگاهی به آینده پیرامون ویژگی آرگومان های اختیاری - نامی و واریانس بحث كردیم. در این مقاله و مقاله بعدی ، برنامه نویسی پویا، بارزترین و جدیدترین ویژگی C# 4.0 را معرفی خواهیم كرد.

در مقالات قبلی از سری C# 4.0، نگاهی به آینده  پیرامون ویژگی آرگومان های اختیاری - نامی و واریانس بحث كردیم. در این مقاله و مقاله بعدی ، برنامه نویسی پویا، بارزترین و جدیدترین ویژگی C# 4.0 را معرفی خواهیم كرد.

توجه داشته باشید كه تمام تكنولوژی فعلی در حال توسعه و تكامل می باشد و یكی از دلایلی كه مایكروسافت CTP آن را در اختیار عموم قرار داده است، دریافت نظرات و فیدبك های بیشتر به منظور ارائه جامع محصول نهایی می باشد. آنچه كه در سری مقالات C# 4.0، نگاهی به آینده ارائه  می شود، بر پایه نسخه اولیه بوده و نام برگزیده شده برای این سری گویای این امر است.

برنامه نویسی پویا

برنامه نویسی پویا بحث داغ دات نت فریم ورك 4.0 می باشد. طراحان و توسعه دهندگان این كتابخانه عظیم در صدد هستند تا با فراهم كردن بستر مناسب، امكان فراخوانی های پویا را برای زبان های تحت دات نت از جمله سی شارپ فراهم كنند. این وظیفه را Dynamic Language Runtime و به اختصار DLR در محیط فریم ورك فراهم خواهد كرد.

برنامه نویسی پویا مربوط به زمان اجرا (Run Time) بوده كه نقطه مقابل زمان كامپایل می باشد (Compile Time). در زمان كامپایل سه عمل زیر انجام می شود:

  • تحلیل لغوی: در این مرحله كد نوشته شده به سمبل ها، كلمات و اعداد شكسته می شود. كامپایلر بر اساس نحو (syntax) زبان، كد را بررسی كرده، در صورت برخورد با خطای لغوی -  مثل جا انداختن نقطه ویرگول در پایان عبارت - پیغام خطای مناسب را نمایش خواهد داد.

  • تحلیل معنایی: در این مرحله عبارات به دست آمده از مرحله قبل از نظر معنایی مورد ارزیابی كامپایلر قرار می گیرند. به عنوان مثال حاصلضرب دو مقدار اعشاری را نمی توان در یك مقدار صحیح قرار داد و با وجود اینكه از نظر لغوی عبارت مذكور درست است كامپایلر خطای معنایی را نمایش خواهد داد.

  • تولید كد ماشین: در این مرحله در صورت عدم وجود خطا، كد ماشین معادل، تولید شده و در یك پیمانه اجرایی (فایل exe) یا كتابخانه (فایل dll) ذخیره می شود.

كامپایلرهای مختلف ممكن است عملیات بیشتری علاوه بر آنچه كه بیان شد، در زمان كامپایل انجام دهند كه مرحله لینك نمونه ای از این مراحل می باشد. 

تمامی زبان های دات نت در مرحله تولید كد ماشین، به زبان میانی مایكروسافت (MSIL) ترجمه شده و در فایل اسمبلی اعم از فایل اجرایی یا كتابخانه ای ذخیره می شوند. از این رو هنگام اجرای فایل اسمبلی در محیط CLR، كامپایلری تحت عنوان Just In Time Compiler زبان میانی مایكروسافت را به زبان ماشین ترجمه می كند.

افزودن ویژگی پویا به كامپایلر زبان برنامه نویسی این امكان را فراهم می كند كه كامپایلر از تحلیل معنایی تعاریف و بلوك های پویا صرف نظر كند. از این رو تحلیل معنایی به زمان اجرا موكول می شود و اگر خطایی در معنای تعاریف یا بلوك های پویا وجود داشته باشد، پیغام خطای زمان اجرا صادر خواهد شد. 

نوع جدید dynamic در سی شارپ

در سی شارپ 4.0 برنامه نویسی پویا از طریق نوع جدید گنجانده شده در زبان یعنی dynamic امكان پذیر خواهد بود. كلمه كلیدی dynamic در تمامی جاهایی كه امكان تعریف و استفاده از نوع وجود دارد، قابل استفاده می باشد. به نمونه كد زیر توجه كنید:

dynamic d = GetDynamicObject();
d.M(7);

كامپایلر سی شارپ اجازه خواهد داد كه توابعی با نام و آرگومان های دلخواه بر روی d فراخوانی شوند. چون d از نوع پویا است كامپایلر هیچ تفسیر معنایی از فراخوانی(M(7 نخواهد داشت و تفسیر آن را به زمان اجرا موكول خواهد كرد.

علاوه بر تابع، فراخوانی عضو، خصیصه، عملیات اندیس، عملگر و نماینده بر روی نوع پویا امكان پذیر خواهد بود.

d.f = d.P; // getting and settings fields and properties
d["one"] = d["two"]; // getting and setting through indexers
int i = d + 3; // calling operators
string s = d(5,7); // invoking as a delegate

تنها نقش كامپایلر سی شارپ در زمان كامپایل این سناریو ، بسته بندی اطلاعاتی است كه بیان می كنند "چه اتفاقی برای d رخ داده است". در زمان اجرا تفسیر دقیق هر یك از این فراخوانی ها مشخص خواهد شد.

تفسیر نوع پویا در زمان اجرا

در مثال قبل با تعریف نوع پویا d، این امكان را فراهم كردیم كه كامپایلر به بسته بندی اطلاعات موجود در زمینه فراخوانی ها و عملیات انجام شده بر روی d اكتفا كند تا در زمان اجرا تفسیر واقعی این اطلاعات به دست آید. این تكنیك اصطلاحا پیگرد پویا (dynamic lookup) نامیده می شود.

در زمان اجرا، ذات d نوع تفسیر ها را مشخص خواهد كرد. d می تواند یكی از انواع پویا زیر باشد:

  • شیئی از نوع COM:  چنانچه d شیئی از نوع COM باشد، DLR، تفسیر پویا آن را از طریق واسط IDispatch كه نوع COM فراهم می كند، انجام خواهد داد. فراخوانی پویا شیء COM، امكان استفاده از ویژگی های COM را كه نقطه مقابلی در زبان سی شارپ ندارند،  فراهم خواهد كرد. خصیصه های اندیس دار (indexed properties) و خصیصه های پیش فرض (default properties) نمونه ای از این ویژگی ها  هستند .

  • شیء پویا (Dynamic Object): اگر d واسط IDynamicObject را پیاده سازی كند، از نوع پویا محسوب خواهد شد. پیاده سازی واسط IDynamicObject، این امكان را فراهم می كند كه نوع جدید تمامی عملیات پویا را به دلخواه خود سربارگذاری كند. این ویژگی برای توسعه زبان های پویا مانند IronPython و IronRuby در توصیف مدل پویا آبجكت ها مورد استفاده قرار می گیرد. برای استفاده از API به كار رفته در مدل HTML DOM و دسترسی به خصیصه های آبجكت های آن نیز از این روش استفاده خواهد شد.

  • شیء ساده (Plain Object): چنانچه d هیچ یك از دو نوع بالا نباشد، می توان نتیجه گرفت كه d شیء استاندارد دات نت بوده كه تفسیر پویا آن از طریق Reflection و Runtime Binder سی شارپ انجام خواهد شد. این بخش از كامپایلر سی شارپ به عنوان مؤلفه در زمان اجرا برای "اتمام پردازش نوع پویا" مورد استفاده قرار می گیرد.

موارد استفاده از ویژگی پویا

با توجه به انواع اشیاء پویا می توان به سه سناریوی زیر كه بیشترین بهره را از ویژگی پویا خواهند برد، اشاره كرد:

  • اتوماسیون آفیس و دیگر اینتراپت های COM: ویژگی پویا باعث خواهد شد كه نسخه بعدی اتوماسیون آفیس ساده تر از قبل شود. از این رو نیازی به استفاده از تایپ های بزرگ و فراخوانی توابع با آرگومان های زیاد وجود نخواهد داشت.

  • استفاده از زبان های پویا دیگر:  محبوبیت زبان های پویا از قبیل IronPython و IronRuby رو به افزایش است. در حال حاضر این زبان ها به راحتی می توانند از كدهای سی شارپ و دیگر زبان های دات نت بهره مند شوند در حالیكه عكس آن امكان پذیر نیست. فعال شدن ویژگی پویا باعث خواهد شد كه فراخوانی اشیاء زبان های پویا و ساختارهای متغییر مانند HTML DOM در زبان های دات نت فراهم شود. توسعه دهندگان قادر خواهند بود ضمن استفاده از كدهای موجود، به توسعه ی آن ها و تولید كدهای جدید بپردازند.

  • فراخوانی راحت تر Reflection: در حال حاضر توسعه دهندگان و برنامه نویسان از طریق فضای نام Reflection قادر به تولید كلاس ها و فراخوانی توابعی هستند كه در زمان كامپایل نامشخص اند. ویژگی پویا كامپایلر سی شارپ چنین فراخوانی هایی را به مراتب ساده تر خواهد كرد.

توسعه  آبجكت های پویا

همانطور كه اشاره شد، واسط IDynamicObject امكان تعریف نوع پویا با رفتار دلخواه را فراهم می كند. IDynamicObject برای توصیف رفتار پویا خود، از كلاسی به نام MetaObject استفاده می كند. از طریق سربارگذاری توابع زیر كه توسط MetaObject ارائه می شوند، تفسیر پویا فراخوانی ها در زمان اجرا مشخص می شود:

همانطور كه مشاهده می شود، هر تابع بیانگر یك عمل انجام شده بر روی نوع پویا است. به عنوان مثال تابع Call برای سربارگذاری نحوه فراخوانی توابع بر روی آبجكت پویا به كار می رود. توابع GetMember و SetMember برای سربارگذاری نحوه فراخوانی خصیصه بر روی نوع پویا استفاده می شوند. تمامی توابع، دو آرگومان استاندارد در لیست پارامترهای خود دارند. پارامتر اول از نوع نماینده بوده كه اطلاعاتی پیرامون نوع عمل انجام یافته بر روی نوع پویا را شامل می شود. پارامتر دوم نیز آرایه ای از  آرگومان های عمل صورت گرفته بر روی نوع پویا می باشد. به عنوان مثال اگر تابعی بر روی نوع پویا با یك پارامتر فراخوانی شده باشد، نماینده حاوی تابع و آرایه حاوی پارامتر این تابع خواهد بود.

نسخه CTP به صورت كامل و نهایی از ویژگی های پویا معرفی شده در این مقاله پشتیبانی نمی كند. همانطور كه در لیست توابع ارائه شده برای سربارگذاری مشاهده می شود، توابع مربوط به سربارگذاری indexor و delegate گنجانده نشده اند.

در ادامه مثال ساده ای برای مرور مفاهیم بیان شده در این مقاله معرفی می كنیم. نوع پویا PdDynamicType را به شكل زیر تعریف كرده ایم :

 تابع Call را سربارگذاری كردیم تا Runtime Binder در زمان اجرا با برخورد به فراخوانی تابع دلخواه بر نوع PdDynamicType نام آن را در كنسول چاپ كند. علاوه بر تعریف نوع پویا، نوع ساده PdType به شكل زیر تعریف شده است:

در نهایت تعاریف بالا به شكل زیر در تابع Main به كار رفته اند:

تابع  PdDynamicCall سه بار و هر بار با نوعی متفاوب فراخوانی شده است. این تابع نوع پویا dynamicType را به عنوان آْرگومان دریافت  كرده و تابعی به نام PdFunc را بر روی آن فراخوانی می كند. در زمان كامپایل، تنها اطلاعی كه كامپایلر سی شارپ از dynamicType دارد این است كه تابع PdFunc بر روی آن فراخوانی شده است و اینكه این تابع چیست و چه كاری انجام می دهد، تنها در زمان اجرا مشخص خواهد شد. به خروجی حاصل از این اجرا توجه كنید:

همانطور كه مشاهده می شود در زمان اجرا، تابع PdFunc نوع int پیدا نشده است و لذا استثنای زمان اجرا نمایش داده شده است. به همین دلیل است كه كد تابع PdDynamicCall داخل بلوك try - catch نوشته شده است. PdType تعریفی برای تابع PdFunc ارائه كرده است. فراخوانی آن در زمان اجرا منجر به چاپ خط دوم در كنسول شده است. در نهایت فراخوانی PdFunc بر روی نوع پویا PdDynamicType صورت گرفته است كه سربارگذاری تابع Call، باعث چاپ نام تابع در خط سوم كنسول شده است.

كلام آخر

در مقاله بعدی به بحث و بررسی بیشتر پیرامون نوع پویا C# 4.0 خواهیم پرداخت.

به اطلاع علاقمندان می رساند كه سفارش CTP Visual Studio 2010 برای اجرای كدهای ارائه شده در این مقاله و كار با C# 4.0 از طریق فروشگاه وب سایت امكانپذیر می باشد.

در پایان این مقاله تقاضا داریم كه با انعكاس نظر خود در بخش پیام در ارائه بهتر كمی و كیفی مقالات آینده ما را همراهی كنید. پیشاپیش از نظرات و انتقادات شما سپاسگزارم.

  نویسنده:الدینف

منیع:persiadevelopers



برچسب ها: آموزش ، آموزش برنامه نویسی ، c# ، آموزش c# ، C# 4.0 ،
آخرین ویرایش: - -

 
لبخندناراحتچشمک
نیشخندبغلسوال
قلبخجالتزبان
ماچتعجبعصبانی
عینکشیطانگریه
خندهقهقههخداحافظ
سبزقهرهورا
دستگلتفکر