چارچوب NET. و ارتباط آن با #C
در فصل قبل مقداري با زبان برنامه نويسي #C و محيط ويژوال استوديو آشنا شدي . م اما بهتر است قبل از اينكه درگير برنامه نويسي با اين زبان و كار با اين محيط شويم، مقداري در رابطه با چارچوب NET.و ارتباط آن با ويژوال استوديو و #C صحبت كنيم .در اين فصل ابتدا نگاهي كلي به تكنولوژي NET. خواهيم داشت و بعد از معرفي اجزاي آن سعي مي كنيم ا رتباط آنها را با يكديگرشرح دهيم . NET. هنوز يك تكنولوژي جديد محسوب مي شود و داراي مباحث فني زيادي است كه فراگيري آنهـا در ابتـدا كمـي مشكل به نظر مي رسد .
مشكل بودن آن نيز به اين علت است كه NET. يك چارچوب يا فريم ورك است و يك فريم ورك، راه وروش جديدي را براي طراحي و توسعه نرم افزار ارائه مي دهد . در طول اين فصل سعي مي كنيم مفاهيم جديد ارائه شده در NET.را به طور خلاصه و اجمالي بررسي كنيم .
چارچوب NET. چيست؟
چارچوب NET. چگونه كار مي كند و چه چيزي باعث شده است كه به يك فريم ورك پرطرفدار تبديل شود؟
با زبان #C چه برنامه هايي را مي توان نوشت؟
چارچوب NET. چيست؟
قبل از هر چيز بهتر است كه تعريف دقيقي از كلمات فريم ورك يا چارچوب و همچنين پلتفرم ارائه دهيم .در تعريف NET. مي توانيم بگوييم كه : “چارچوب NET. يك پلتفرم جديد است كه توسط مايكروسافت براي طراحي و توسـعه نرم افزار ايجاد شده است.”نكته جالبي كه در اين تعريف وجود دارد ابهام زيادي است كه در اين تعريف به كار برده ام، اما براي اين كار دليل خـوبي وجـود دارد .براي شروع، توجه كنيد كه در اين تعريف نگفته ام “طراحي و توسعه نرم افزار بـراي سيـستم عامـل وينـدوز .” اگرچـه مايكروسـافت چارچوب NET. را براي اجرا بر روي سيستم عامل ويندوز منتشر كرده است، بـه زودي نـسخه هـاي ديگـري از ايـن چـارچوب را مشاهده خواهيد كرد كه بر روي سيستم عامل هاي ديگر مانند لينوكس نيز اجرا مي شوند . يكي از اين نسخه هـا مونـواسـت .
مونـو
يك نسخه متن باز از چارچوب NET. است (كه شامل يك كامپايلر #C نيز هست ) كه براي سيستم عامل هاي گونـاگوني ماننـدنسخه هاي مختلف لينوكس و مكينتاش منتشر شده است . پروژه هاي بسيار ديگري مشابه مونو در حال اجرا هستند كه ممكن اسـت هنگام انتشار اين كتاب در اختيار شما قرار گرفته باشند . به عـلاوه مـي توانيـد بـا اسـتفاده از نـسخه فـشرده ايـن چـارچوب بـه نـام Microsoft .NET Compact Framework كه زير مجموعه اي از چارچوب NET. است براي وسـايل هوشمند مانند موبايل ها نيز برنامه بنويسيد (با اين چارچوب در فصل بيست و دوم بيشتر آشنا خـواهيم شد
اگر به تعريفي كه در بالا براي چارچوب NET. آورده شده است دقت كنيد، مشاهده مي كنيد كه اين تعريف محدود به نوع خاصـي از برنامه ها نيست . در حقيقت در مورد نوع برنامه هايي كه مي توان با NET. نوشت هيچ محدوديتي وجود ندارد كه بخواهيم آن را ذكر كنيم . از چارچوب NET. مي توانيد براي طراحي برنامه هاي تحت ويندوز، برنامه هاي تحت وب، سرويسهاي مبتني بـر وب و … استفاده كنيد .
چارچوب NET. يك چارچوب كلي است و محدود به زبان برنامه نويسي خاصي نيست . شما مي توانيـد برنامـه خودتـان را بـه هـر زباني كه بخواهيد بنويسيد . در اين كتاب برنامه نو يسي به زبان #C را بررسي مي كنيم، اما علاوه بر اين زبان مي توانيد از زبانهـايي مانند ++C، ويژوال بيسيك، جاوا و حتي زبانهاي قديمي مانند COBOL نيز استفاده كنيـد . بـراي هـر كـدام از ايـن زبانهـا يـك كامپايلر خاص NET. ارائه مي شود . به وسيله اين كامپايلر، برنامه هاي نو شته شده به اين زبانها نه تنهـا مـي تواننـد بـا چـارچوب NET. ارتباط داشته باشند، بلكه مي توانند با برنامه هاي زبانهاي ديگر كه تحت NET. نوشته شده اند نيز ارتباط داشـته باشـند .
براي مثال يك برنامه كه به زبان #C نوشته شده است به راحتي مي تواند از كدي استفاده كند كه ب ه زبان ويـژوال بيـسيك نوشـته شده است و يا برعكس . مواردي كه تا كنون گفتيم سطح بالاي تنوع در NET. را نشان مي دهند. اين تنـوع يكـي از دلايلـي اسـت كـه باعـث مـي شـود چارچوب NET. چنين دورنماي جذابي داشته باشد .
پس دقت داشته باشيد كه NET. يك زبان برنامه نويسي، يك مدل برنامه نويسي مانند برنامه نويسي تحت ويندوز، يك نوع برنامه نويسي براي سيستم عاملي خاص مانند برنامه نويسي تحت ويندوز و يا مواردي از اين قبيل نيست . بلكه NET. يـك روش بـراي طراحي و توسعه ي نرم افزار است كه به وسيله ي مايكروسافت معرفي شده است و مي تواند در تمامي موارد ي كه در بالا ذكـر شـد مورد استفاده قرار گيرد .
چارچوب NET. از چه اجزايي تشكيل شده است؟
يكي از اجراي اصلي چارچوب NET. كتابخانه كلاس عظيم آن است كه مـي توانيـد از آن در برنامـه هـاي خـود اسـتفاده كنيـد .
كتابخانه كلاس يك مجموعه از توابع و كلاسها است كه براي انجام ام ور مختلف مورد استفاده قرار مي گيرد . بـراي مثـال يـك كتابخانه كلاس، شامل توابعي براي كنترل ورودي و خروجي، استفاده از امكانات چاپ، كار با انواع مختلف شبكه ها و … اسـت . ايـن توابع و كلاسها كه با استفاده از تكنيكهاي برنامه نويسي شيئ گرا نوشته شده اند ، در NET. بـه گـروه هـا و يـا فـضاي نامهـاي مختلفي دسته بندي مي شوند. با مفهوم فضاي نام در فصل 9 بيشتر آشنا خواهيم شد.
در نوشتن يك برنامه، مي توانيد هر كدام از فضاي نامها را كه نياز داشتيد به برنامه اضافه كنيد . براي مثال يكي از اين فـضاي نامهـا براي برنامه نويسي تحت ويندوز به كار مي رود، يكي ديگر براي برنامه نويسي شبكه مورد استفاده قرار مي گيرد، فضاي نام ديگـري براي برنامه نويسي تحت وب به كار مي رود . بعضي از اين فضاي نامها خود به فضاي نامهاي كوچكتري تقسيم مي شوند كـه بـراي كاربرد خاصي در آن قسمت استفاده مي شوند . براي مثال فضاي نام برنامه نويسي تحت وب شامل يك فضاي نام كوچكتر است كـه براي نوشتن سرويسهاي تحت وب به كار مي رود .
بايد توجه داشته باشيد كه تمام سيستم عامل ها، همه توابع موجود در اين فضاي نامها را پشتيباني نمي كنند . براي مثال يك دسـتيار ديجيتال شخصي از توابع اصلي چارچوب NET. پ شتيباني مي كند، اما يك سري از توابع كه در ايـن وسـايل كـاربردي نـدارد بـه وسيله آنها پشتيباني نمي شود .
بخش ديگري از چارچوب NET.، يك سري نوع هاي داده اي ابتـدايي را تعريـف مـي كنـد . نـوع هـاي داده اي بـراي نگهـداري اطلاعات يك برنامه در طول اجراي آن مورد استفاده قرار مي گيرند. نوع هاي داده اي كه در ايـن قـسمت از NET. تعريـف مـي شوند به صورت بسيار پايه اي هستند (مانند “عدد صحيح علامت دار 32 بيتي “). نوع هاي داده اي پيـشرفته تـري كـه در زبانهـاي برنامه نويسي مبتني بر NET. مانند #C و يا ويژوال بيسيك وجود دارند بايد بر اساس يكي از اين نوع هاي داده اي تعريف شـده در اين قسمت از چارچوب NET. باشند . اين مورد باعث هماهنگي بين زبانهاي برنامه نويسي مي شـود كـه از چـارچوب .NET استفاده مي كنند . اين قسمت از چارچوب NET.، سيستم نوع داده اي عمومي و يا به اختصار CTS ناميده مي شود . با نوع هـاي داده اي در فصل بعد بيشتر آشنا خواهيم شد .
علاوه بر كتابخانه كلاسي كه ذكر شد، چارچوب NET. شامل بخشي به نام زبان عمومي زمان اجرا و يا به اختصار CLRاسـت .اين بخش از چارچوب NET. (كه مهمترين بخش آن نيز محسوب مي شود ) مسئول كنترل و مديريت اجراي تمـام برنامـه هـايي است كه با استفاده از كتابخانه كلاس NET. نوشته شده اند
چگونه با استفاده از چارچوب NET. برنامه بنويسيم؟
نوشتن برنامه با استفاده از چارچوب NET. به معني نوشتن كد به هر كدام از زبانهايي كه توسط NET. پشتيباني مـي شـوند، بـااستفاده از كتابخانه كلاس NET. است . همانطور كه گف تم در طول اين كتاب از محيط طراحي مجتمـع ويـژوال اسـتوديو (IDE)براي طراحي و برنامه نويسي استفاده مي كنيم . مزيت استفاده از اين محيط اين است كه مي توانيد بـه راحتـي از ويژگيهـايي كـه دربخشهاي قبلي از چارچوب NET. معرفي كرديم استفاده كنيد . كدي كه شما براي نوشتن برنا مه ها در طول اين كتاب استفاده مـيكنيد كلاً به زبان #C است، اما در طول برنامه ها از چارچوب NET. و همچنين از يك سري ويژگي هـا و ابزارهـايي كـه محـيطويژوال استوديو در اختيار ما قرار مي دهد استفاده خواهيم كرد .
يك برنامه كه به زبان #C نوشته شده است قبل از اجرا باي د به كدي تبديل شود كه براي سيستم عامل قابل فهم باشد . به اين كـد، كد محلي مي گويند . تبديل يك كد از هر زباني به كد محلي كه براي سيستم عامل قابل فهم باشد را كامپا لي كردن مي گوينـد وعملي است كه به وسيله كامپا لري انجام مي شود. در چارچوب NET. اين بخش از دو مرحله تشكيل شده است .
JIT و MSIL
هنگامي كه برنامه اي كه در آن از توابع موجود در كتابخانه كلاس NET. استفاده شده است را كامپايل مـي كنيـد، بلافاصـله كـدقابل فهم براي سيستم عامل و يا كد محلي توليد نمي شود . در عوض كد شما به زباني به نام زبان سطح مياني مايكروسافت و يا بـهMSIL اختصار تبديل مي شود . اين كد براي سيستم عامل خاصي نيست و همچنين منحصر به زبان #C نيز نيـست . بـه عبـارت ديگر كد زبانهاي ديگر نيز مي تواند به MSIL تبديل شود (و البته بايد تبديل شـوند ). كـدهاي زبانهـاي ديگـري كـه از چـارچوب NET. استفاده مي كنند نيز (مانند و يژوال بيسيك ) هنگام كامپايل ابتدا به زبان MSIL تبديل مي شوند . هنگام استفاده از ويژوال استوديو براي نوشتن برنامه، اين مرحله از كامپايل توسط ويژوال استوديو انجام مي شود .
اما براي اجراي يك برنامه توسط سيستم عامل يك مرحله ديگر نيز مورد نياز است . اين مرحله وظيفه ي JIT كامپا یلري است. اين كامپايلر كد MSIL يك برنامه را دريافت كرده و آن را به كدي تبديل مي كندكه به وسيله سيستم عامل قابل اجرا باشد . بعد از اينكه اين تبديل توسط JIT انجام شد، سيستم عامل مي تواند برنامه را اجرا كنـد .
همانطور كه از اسم اين قسمت نيز مشخص است (Just-In-Time) كدهاي زبان MSIL فقط هنگامي به زبان محلي قابل فهم براي سيستم عامل تبديل مي شوند، كه بخواهند اجرا شوند .
در گذشته براي اينكه بتوانيد برنامه خود را بر روي سيستم عامل هاي مختلف اجرا كنيد نياز داشتيد كه بـراي هـ ر نـسخه از سيـستم عامل، آن كد را يك مرتبه به طور كامل كامپايل كنيد . اما در چارچوب NET. نيازي به اين كار نيست. زيرا براي هر نوع پردازنده و نيز هر نوع سيستم عامل يك نسخه از JIT وجود دارد. برنامه شما در هر سيستم عاملي كه اجرا شود، كامپايلر JIT موجود در آن سيستم عامل، كد MSIL برنامه ي شما را كه مستقل از سيستم عامل و نوع پردازنده است دريافت كرده و كد محلي مناسبي توليـد مي كنند كه براي سيستم عامل قابل فهم باشد .
فايده استفاده از اين روش در اين است كه وظيفه برنامه نويس را به شدت كاهش مي دهد . در حقيقت مي توان گفت كه بـ ه عنـوان برنامه نويس، هنگام نوشتن كد مي توانيد سيستم عاملي كه قرار است برنامه روي آن اجرا شود را فراموش كـرده و فكـر خـود را بـر روي كد و منطق برنامه متمركز كنيد .
اسمبلي ها :
هنگامي كه يك برنامه را كامپايل مي كنيد، كد MSIL توليد شده در فايلهايي به نام اسمبلي ذخيره مي شوند . فايلهاي اسـمبلي مي توانند شامل برنامه هايي باشند كه بدون نياز به برنامه اي ديگر بتوانند بر روي سيستم عامل اجرا شوند (ايـن گونـه فايلهـا داراي پسوند exe. هستند ) و يا شامل كتابخانه هايي از كلاسها و توابع براي استفاده در ديگر برنامه ها باشند (ايـن گ ونـه فايلهـا داراي پسوند dll. هستند ). فايلهاي اسمبلي علاوه بر كدهاي MSIL، شامل اطلاعات متا (اطلاعاتي راجع به اطلاعـات ذخيـره شـده در فايـل اسـمبلي و ) همچنين منابع اختياري (اطلاعات اضافي كه به وسيله كدهاي MSIL استفاده مي شـوند، هماننـد فايلهـاي صـوتي و يـا فايلهـاي تصويري) نيز هستند . اطلاعات متا باعث مي شوند كه يك فايل اسمبلي بتواند اطلاعات داخل خود را به طور كامل توصيف كند . بـه عبارت ديگر براي استفاده از يك اسمبلي به هيچ اطلاعات و يا كارهاي اضافي مانند ثبت آن در رجيستري سيستم نيازي نداريـد . بـه اين ترتيب از مشكلاتي كه عموماً هنگام كار با اين نوع فايلها در محيطهاي ديگر به وجود مي آمد نيز جلوگيري مي شود .
يكي ديگر از خاصيتهاي اين مورد در اين است كه توزيع يك نرم افزار به سادگي كپي كردن تمام فايلهاي آن بر روي كامپيوتر مقصد است. به علت اينكه براي اجراي يك فايل اسمبلي به هيچ مورد ديگري نياز نيست، مي توانيد به سادگي فولـدر حـاوي برنامـه را بـر روي كامپيوتر مقصد كپي كنيد و سپس با كليك كردن بر روي فايل اجرايي آن، برنامه را اجرا كنيد و از آن استفاده كنيـد (بـا فـرض اينكه CLR كه مهمترين بخش NET. است، قبلا در آن كامپيوتر نصب شده باشد ). در مورد چگونگي توزيـع يـك نـرم افـزار در فصل بيست و يكم بيشتر صحبت خواهيم كرد .
البته ممكن است در بعضي مواقع بخواهيد از توابع موجود در يك فايل DLL، در چند برنامه استفاده كنيد. براي اين كار لازم نيـست فايل مذكور را در فولدر تمام برنامه هايي كه از آن استفاده مي كنند قرار دهيد. بلكه مي توانيد آن را يك بار در يك مكـان مـشخص قرار دهيد و سپس تمام برنامه هاي كه به آن نياز دارند، از آن استفاده كنند . در چارچوب NET. اين مكان مشخص كه بـراي قـرار گرفتن فايلهاي اسمبلي عمومي در نظر گرفته شده است، Global Assembly Cache و يا GAC نـام دارد . بـرايينكه يك فايل اسمبلي را در اين قسمت قرار دهيد، كافي است به سادگي فايل مورد نظر را در فولدر مشخص شده براي GAC كپي كنيد، زيرا برنامه ها مي توانند علاوه بر اسمبلي هاي خود به همه اسمبلي هاي موجود در اين فولدر نيز دسترسي داشته باشند
كدهاي مديريت شده :
همانطور كه گفتم برنامه ي شما هنگام كامپايل ابتدا به كد MSIL تبديل مي شود، سپس اين كد قبل از اجرا به وسـيله JIT بـه كد محلي تبديل شده و كد محلي به وسيله سيستم عامل اجرا مي شود . تمام اين قسمتها بخشي از وظايف CLR است، امـا وظـايف CLR به اين موارد ختم نمي شود . برنامه اي كه به وسيله NET. نوشته شده است در طول زمان اجرا توسط CLR مديريت مـيشود. به عبارت ديگر در طول اجراي برنامه هاي نوشته شده با CLR ،.NET مسئول كنترل امنيت آنها، مديريت حافظه برنامه ها،كنترل بخشهاي خطا يابي در برنامه ها و … است. به همين دليل به برنامه ه ايي كه با NET. نوشته شده اند، برنامه هاي مـديريت شده مي گويند . در مقابل، برنامه هايي كه تحت كنترل CLR اجرا نمي شوند بـه برنامـه هـاي مـديريت نـشدهمعـروف هـستند وزبانهاي مشخصي مانند ++C مي توانند چنين برنامه هايي را توليد كنند . از كدهاي مديريت نشده بيشتر در مواق عي استفاده مي شودكه قابليت استفاده از كدهاي مديريت شده نباشد، همانند فراخواني توابع سطح پايين سيستم عامل . البته با استفاده از زبان #C نمـيتوان كدهاي مديريت نشده توليد كرد و تمام كدهاي توليد شده به وسيله كامپايلر #C تحت كنترل CLR اجرا مي شوند .