شرکت مایکروسافت در جولای سال ۲۰۰۰ میلادی در کنفرانس پیاده کنندگان حرفه ای ( PDC ) ابتکار جدید خود یعنی دات نت را معرفی نمود.
دات نت چیست ؟
در صورتیکه صفحه اختصاصی دات نت در سایت مایکروسافت را مشاهده کرده باشید با تعریف زیر مواجه می گردید : " پلات فورم (Plathform) مایکروسافت برای سرویس های وب XML " . مایکروسافت همچنین دات نت را بعنوان روشی برای توزیع و عرضه سرویس های نرم افزاری مطرح نموده است . تعاریف فوق گرچه برخی از ابعاد مهم دات نت را تشریح می نمایند ولی نگرش فوق صرفا" از یک بعد ساده و از زاویه یک شرکت مورد توجه قرار گرفته است . برای پیاده کنندگان نرم افزار دات نت یک الگوی جدید جهت طراحی و پیاده سازی نرم افزار است . در این مقاله به بررسی الگوی فوق پرداخته و از این رهگذر جایگاه ASP.NET در این پروژه نیز تبین خواهد شد.
نگاهی اجمالی به گذشته
تاکنون از خود پرسیده اید که برنامه های کامپیوتری چگونه کار می کنند ؟ چگونه کدهای نوشته شده به یکی از زبانهای سطح بالا نظیر ویژوال بیسیک و یا ویژوال سی به یک برنامه اجرائی تبدیل می شوند؟
در گذشته عملیات فوق از طریق بکارگیری کامپایلرها ( مترجم ها ) تحقق پیدا می کرد. کامپایلرها برنامه های خاصی هستند که کدهای نوشته شده به یکی از زبانهای سطح بالا را به زبان اختصاصی ماشین ( کد اسمبلی ) ترجمه می نمایند . کدهای اسمبلی و کدهای زبان ماشین کاملا" وابسته به یک پلات فورم خاص خواهند بود. مثلا" کدهای ماشین نوشته شده برای یک پردازنده اینتل قادر به اجراء بر روی هر نوع ماشین دیگر نظیر مکینتاش نخواهند بود. ( در حقیقت کدهای ماشین قادر به اجراء بر روی ماشینی با مجموعه دستورات خاص خواهند بود و در این راستا ماشین دیگر که از پردازنده دیگر و به تبع آن از مجموعه دستورات خاصی استفاده می کند، قابل اجراء نخواهند بود ) .
برنامه های نوشته شده برای ویندوز به زبان ماشین ترجمه شده بگونه ای که قادر به استفاده از مجموعه توابع کتابخانه ای موجود در Win32 باشند. کتابخانه فوق شامل مجموعه ای از صدها تابع مختص ویندوز است . توابع فوق مستقیما" با ویندوز ارتباط و مسئولیت ارتباط با سطوح سطح پایین سخت افزار را برعهده خواهند گرفت .
زمانی که یک برنامه ویژوال بیسیک قصد نمایش یک MessageBox را داشته باشد ، تمامی پردازش های مربوطه تا زمانیکه برنامه ترجمه نشده و به یک فایل اجرائی تبدیل نگردد، آغاز نخواهد شد. پس از ترجمه، برنامه دارای یک فایل اجرائی با انشعاب exe خواهد بود. فایل فوق را می توان بر روی هر محیطی که سیستم عامل ویندوز بر روی آن نصب شده باشد، اجراء نمود. ( در چنین شرایطی دیگر لزومی به حضور ویژوال بیسیک بر روی کامپیوتر مورد نظر نخواهد بود). در حقیقت کامپایلر ویژوال بیسیک کدهای سطح بالا را بگونه ای تبدیل نموده که برای سیستم عامل قابل فهم باشند. در نهایت سیستم عامل کدهای فوق را بگونه ای که قادر به اجراء بر روی یک کامپیوتر خاص باشند، ترجمه و اجراء خواهد نمود.
بنظر عملیات فوق پیچیده بنظر می آید . خوشبختانه تمامی مراحل ترجمه های فوق از دیدگاه استفاده کننده مخفی نگاهداشته شده و برنامه نویسان کافی است تمام تمرکز خود را بر روی نوشتن برنامه معطوف داشته و هیچگونه نگرانی در رابطه با ترجمه نداشته و تمامی عملیات در این راستا را بر عهده کامپایلرها واگذار شده و در نهایت یک فایل اجرائی را تحویل گیرند.
* رویکرد فوق کاملا" وابسته به پلات فورم است . این بدان معنی است که زمانی که یک برنامه را مثلا" با ویژوال بیسیک می نویسید ، برنامه فوق صرفا" بر روی کامپیوترهائی که از ویندوز استفاده می نمایند، قابل اجراء خواهد بود.
* هیچگونه تضمینی وجود ندارد که دو برنامه اجرائی نوشته شده با زبانهای برنامه نویسی متفاوت دارای کدهای مشابه سطح پایین باشند. بنابراین اشتراک مجموعه ای از توابع برای زبانهای برنامه نویسی غیرممکن بنظر می رسد. ( مایکروسافت با ارائه تکنولوژی Com سعی در ارائه راهکاری جهت حل مشکل فوق را داشت ولی عملا در مراحل عملیاتی با مشکل مواجه گردید. مثلا" اگر قصد بکارگیری عناصر COM نوشته شده به زبان ویژوال بیسیک را بهمراه عناصر COM نوشته شده به زبان ویژوال ++C را داشته باشید در زمان انتقال دادن پارامتر بین آنها به مشکلات خاصی برخورد خواهید کرد.
* کتابخانه Win32 API چیزی بیش از مجموعه وسیعی از توابع نیست . توابع فوق هریک دارای تعاریف اختصاصی خود به همراه پارامترهای مربوطه می باشند. در برنامه های ویژوال بیسیک و یا ++C به دفعات ممکن است این نیاز احساس گردد که مستقیما" یکی از توابع موجود در Win32 API فراخوانی گردد ، یافتن تابع مورد نظر جهت فراخوانی کار ساده ای بنظر نمی آید!
به موازات رشد و توسعه نرم افزارها مسئله دوم یکی از اساسی ترین چالش های جدی در زمینه برنامه نویسی گردید. در حالت ایده آل ما این انتظار را داریم که هر مجموعه تابع و یا عناصری را که به کمک یک زبان برنامه نویسی نوشته شده اند را بتوان به اشتراک گذاشت و زمینه استفاده از آنان برای سایر زبانهای برنامه نویسی نیز فراهم گردد.
مسئله فوق از این زاویه نگران کننده تر به نظر خواهد آمد که توجه داشته باشیم هر زبان برنامه نویسی ممکن است نوع های داده ائی اولیه مربوط به خود را دارا باشد. مثلا" در ویژوال بیسیک می توان برداری را داشت که که ایندکس اولین خانه آن از هر محدوده ای شروع گردد در صورتیکه در ++C این تاکید وجود دارد که حتما" می بایست این ایندکس از صفر شروع گردد.
دات نت NET.
مایکروسافت با ارائه دات نت عملا" پاسخ شایسته ای را نیز برای هر یک از مسائل گفته شده ارائه نموده است.
از دیدگاه یک پیاده کننده نرم افزار ، دات نت دارای دو بخش اساسی است :
CLR یا (Common Language Runtime) و کلاس های فریم ورک دات نت (NET framework Classes.)
بخش های فوق به نوعی به مسائل اشاره شده پاسخ های مناسبی را ارائه داده اند.
Common Language Runtime یا ( CLR )
در ابتدای مقاله به نحوه عملکرد کامپایلرهای کلاسیک در رابطه با ترجمه کدهای نوشته شده توسط یکی از زبانهای سطح بالا به دستورات قابل فهم برای کامپیوتر اشاره گردید . در دات نت فرآیند ترجمه یک برنامه سطح بالا به زبان ماشین بصورت کاملا" محسوس تغییر یافته است . کامپایلرهای سازگار با دات نت کدهای نوشته شده توسط یکی از زبانهای برنامه نویسی را به Win32 API Call ترجمه نخواهند کرد. کامپایلرهای فوق کدهای نوشته شده را به یک زبان میانه خاص با نام MSIL یا (Microsoft Intermediate Language) تبدیل خواهند کرد. در ادامه CLR کدهای زبان میانه ای ( IL ) را اخذ و on the fly آنان را به دستورالعمل های اختصاصی ماشین تبدیل خواهند کرد.
توجه داشته باشید که مرحله CLR به Runing Program صرفا" زمانی اتفاق خواهد افتاد که یک برنامه اجراء گردد. کامپایلر فایلی با محتویات کدهای MSIL را ایجاد خواهد کرد. زمانی که فایل فوق اجراء می گردد ، کدهای MSIL به سمت CLR روانه شده و در ادامه با استفاده از مترجم JIT یا ( Just-In-Time ) کدهای IL به دستورات قابل فهم برای کامپیوتر تبدیل خواهند شد. ( یک برنامه در حال اجراء بکمک CLR )
NET FramWork Classes.
در برنامه های نوشته شده تحت ویندوز با استفاده از Win32 API زمینه استفاده از مجموعه ای وسیع از توابع فراهم می گردد. توابع فوق برای انجام عملیات متفاوتی نظیر: رابط گرافیکی کاربر ، عملیات متفاوت در رابطه با سخت افزار و سایر عملیات مرتبط ، باسیستم عامل مرتبط خواهند شد. بنابراین برنامه های تحت ویندوز برای ارتباط با سیستم عامل و بهره مندی از خدمات آن ، خواسته خود را از طریق فراخوانی توابع مربوطه در Win32 API انجام خواهند داد.
برنامه های دات نت چگونه با سیستم عامل مرتبط خواهند شد؟
خوشبختانه Win32 API مربوط به گذشته بوده و برنامه های دات نت از کلاس های فریم ورک دات نت استفاده می کنند. فریمورک فوق مجموعه ای سازمان یافته از کلاس هائی است که به منظور انجام تمامی عملیات مورد نظر یک طراح و پیاده کننده نرم افزار طراحی و پیاده سازی شده اند.
برخلاف Win32 API ، کلاس های دات نت در یک سیستم سلسله مراتبی NameSpace سازماندهی شده اند. هر NameSpace می تواند دارای تعداد نامحدودی از کلاس ها باشد. مثلا" NameSpace پایه ای System شامل کلاس هائی است که از آنها برای نوع داده های اولیه نظیر : System.Int32 , System.Array , System.string و غیره استفاده می شود. NameSpace ،System.Data شامل کلاس ها و سایر Namespace های مربوطه برای دستیابی به داده ها است . NameSpace ، System.IO شامل کلاس های مربوطه برای انجام عملیات متفاوت در رابطه با فایل ها و ورودی و خروجی است . دات نت دارای صدها کلاس بوده که تمامی آنها با استفاده از Namespace ها به درستی سازماندهی شده اند. طراحان و برنامه نویسان می توانند در صورت نیاز اقدام به طراحی کلاس های اختصاصی و NameSpace مربوط به خود نموده و آنها را در برنامه های دات نت خود استفاده نمایند.
دقت داشته باشید که کلاس های فریم ورک دات نت شامل یک کلاس برای هر یک از نوع داده ها در NameSpace ، System می باشد. زبانهای برنامه نویسی دات نت نظیر VB.NET, C# , Jscript.NET می بایست از این نوع ها استفاده نمایند . این بدان معنی است که هر نوع داده به منزله یک کلاس در نظر گرفته خواهد شد. بنابراین زمانی که عملیاتی مطابق زیر را انجام می دهیم :
کد: IN VB.NET: Dim i as Integer
IN C# : int i;
IN Jscript.NET : Var i;
در حقیقت یک نمونه از یک کلاس System.Int32 را ایجاد کرده ایم .
با توجه به این امر که هر یک از زبانهای برنامه نویسی از نوع داده های یکسان استفاده و از مجموعه یکسانی از کلاس ها استفاده می نمایند ، ارتباط متقابل بین زبانها ی برنامه نویسی که زمانی بیش از یک آرزو نبود ، میسر خواهد شد .
بدون دلیل نیست که CLR را Common Language Runtime نامیده اند. برنامه های نوشته شده توسط هر یک از زبانهای برنامه نویسی در نهایت و پس از ترجمه توسط کامپایلرهائی که دات نت را حمایت می نمایند ، به کدهای MSIL تبدیل خواهند شد ، بدین ترتیب این اطمینان و تضمین بوجود خواهد آمد که تا این مرحله ( مرحله ترجمه کدهای نوشته شده با یک زبان برنامه نویسی و ترجمه آنها به MSIL ) تمامی زبانهای برنامه نویسی از نوع داده ها و کلاس های موجود در فریمورک دات نت استفاده کرده اند.
حل مشکلات سه گانه
همان طور که در ابتدای این مقاله اشاره شده ترجمه مستقیم کدهای نوشته شده به کدهای ماشین باعث بروز سه مسئله اساسی :
وابستگی محض به پلات فورم ، بروز مشکل در ارتباط متقابل بین زبانها و ساختار آشقته Win32 API می گردد. دات نت برای سه مسئله فوق راهکارهای مناسبی را ارائه نموده است .
مشکل اول در مرحله تئوری نمی تواند باعث بروز مسائلی گردد . در تئوری مایکروسافت می تواند CLR و کلاس های فریمورک دات نت را برای هر نوع پلات فورم و سیستم عامل ارائه نماید.این بدان معنی است که کدهای MSIL تولیده شده توسط VB.NET را می توان بر روی لینوکس نیز اجراء نمود. در دنیای واقعی مایکروسافت تاکنون در زمینه تامین خواسته هائی اینچنین فعالیت های خاصی را انجام نداده است .
در رابطه با مشکل دوم ( ارتباط متقابل بین زبانها ) با ارائه نوع های داده ائی و توابع مورد نظر که در سطح سیستم عامل فعالیت می نمایند ، با مسئله فوق بدرستی برخورد و راهکار مناسبی ارائه شده است . بر اساس راهکار فوق ،تمامی زبانهای برنامه نویسی مورد حمایت در دات نت می بایست از کلاس های فریمورک دات نت استفاده نموده و پس از ترجمه اولیه کدهای MSIL را تولید نمایند.
در رابطه با مشکل سوم ( ساختار آشفته Win32 API ) فریمورک دات نت ، تمامی کلاس ها را در یک ساختار سلسله مراتبی سازماندهی نموده و از این طریق دستیابی ،استفاده و شناخت عملکرد هر یک از آنان بمراتب راحت تر از win32 API انجام خواهد شد.