در ابتدای پیدایش علوم کامپیوتر، برنامهنویسان کدهایی در سطح ماشین مینوشتند.
به همین دلیل بیشتر توجه آنان معطوف به مجموعه دستورات ماشین بود.
به تدریج زبانهای سطح بالا ایجاد شد و در نتیجه توجه برنامهنویسان بیشتر به اصل مسئله معطوف گردید.
اکنون سطح انتزاعی بر روی کامپیوترهای مختلف ایجاد شده است.
یعنی برنامهی نوشته شده روی هر ماشین اجرا میشود.
در زبانهای ساختیافته ، برنامه را به تعدادی روال تقسیم مینمودند، بدین صورت که هر روال کار خاصی را انجام میداد.
برنامهنویسی شیگرایی اجازه میدهد تا سیستمی دارای اشیای مرتبط و همکار داشته باشید.
کلاس ها این امکان را فراهم میکنند که جزییات پیادهسازی را پشت واسط برنامهنویسی پنهان نمایید.
چندشکلی یا چندریختی ، رفتار و واسط مشترکی را برای مفاهیم مشابه نشان میدهد.
بدین وسیله قادر خواهید بود تا پیمانههای خاص و جدیدی را بدون نیاز به دستکاری در پیادهسازی مفاهیم پایه ایجاد نمایید.
روشهای برنامهنویسی و زبانها در واقع راه ارتباط با ماشین را تعریف میکنند.
هر روش جدید، شیوههای نو را برای تجزیهی مساله ارائه میدهد که عبارتند از: کد ماشین، کد مستقل از ماشین، روالها، کلاسها و غیره.
هر شیوهی جدید، نگرشی تازه جهت تبدیل نیازهای سیستم به زیرساختهای برنامهنویسی ارائه میدهد.
تکامل این نوع شیوههای برنامهنویسی امکانی را فراهم مینماید تا سیستمهای پیچیدهتری ایجاد کنید.
عکس این مطلب نیز صادق میباشد.
یعنی سیستمهای پیچیده میتوانند پیادهسازی شوند.
اکنون، برنامهنویسی شیگرا به عنوان روش ایجاد پروژههای نرمافزاری استفاده میشود.
این شیوه قدرت خود را در مدلسازی رفتارهای معمولی نشان داده است.
اما این روش به خوبی نمیتواند بر روی رفتارهایی که بین چندین پیمانه مشترک وجود دارند، کار کند.
برعکس، شیوهی جنبهگرا تا حد قابل توجهی این مشکل را برطرف میکند.
در سال 1972 پارانز مفهومی به نام جداسازی دغدغهها را مطرح کرده که امروزه جزء مفاهیم اساسی در فرآیند مهندسی نرمافزار به شمار میآید.
این مفهوم به صورت زیر تعریف شده است:
قابلیت تشخیص، کپسولهسازی و کار با دغدغه، هدف و یا مقصود هستند
دغدغه را میتوان به عنوان محرکی برای تقسیم نرمافزار به بخشهای قابل مدیریت درنظر گرفت.
برای نمونه، یک وظیفهمندی خاص نرم افزار و مسائلی که به خواستههای غیروظیفهمندی مرتبط میشوند مانند ثبت وقایع، امنیت و غیره، همگی به عنوان دغدغه هستند، البته با توجه به جداسازی دغدغهها آنها را در قالب واحدهای مستقل کپسوله کردهاند.
در سال 1997، مشهورترین رویکرد زبان جنبهگرا به نام AspectJ ابتدا توسط گروهی درXerox PARC عمومیت یافت.
این گروه روی پروتکلها و ایدهی مدلسازی دغدغههای مشترک کار میکردند.
در همان حال، گروهی در شرکت IBM برنامهنویسی موضوعگرا را مطرح کردند.
برنامهنویسی موضوعگرا و عناوین بعدی آن، تحت نام جداسازی چندبعدی دغدغهها، به جداسازی و ادغام پیمانههای مختلف برنامهنویسی بر پایهی دغدغههایی در ابعاد مختلف پرداختهاند.
[1]
نخستین کار در دانشگاه Twente هلند انجام یافت که در مورد فیلترهای ادغامسازی کار میکردند.
به طوری که در پیادهسازی فیلترهایی که رفتار شی را در اجرا پیشرفت میدادند دخیل بودند.
در دانشگاه Northeastern نیز انتزاعی از ساختار کلاسها انجام گرفت که پشتیبانی بهتری از مفهوم دانش و رفتار عملیاتی ارائه میداد.
در سال 1997، کریستیانا لوپز از هر دو مقاله استفاده کرد و زبان D-Java را به عنوان اولین مجموعهی رسمی از زبان جنبهگرا ارائه نمود.
شیوهی موضوعی اولین روشی بود که مفاهیم جنبهگرایی را با زبان مدلسازی یکپارچه ادغام کرد.
این کار مشترکی از چندین گروه با گروه برنامهنویسی موضوعگرا است.
برنامهنویسی موضوعگرا به طراحی موضوعگرا تبدیل شده و در سال 2001 به Theme/UML تبدیل گردید.
تعریف و نمایش دغدغهها برای نخستین بار در مستندات الیسا و گیل مورفی از دانشگاه British Columbia ارائه شد و در سال 2003 به عنوان بخشی از شیوهی موضوعی طراحی جنبهگرا به نام Theme/Doc مطرح گردید.
حدود یک دههی قبل، به دنبال موفقیت درخور توجه ابزار CASE ، چیکوفسکی و کراس مبحث مهندسی معکوس و بازیابی طراحی را مطرح نمودند.
تعریفی که آنها از مهندسی معکوس داشتند در زیر ارائه شده است:
مهندسی معکوس، تحلیل یک سیستم به منظور تشخیص اجزا، ترکیبات فعلی، روابط بینابین آنها، استخراج و تولید تجریدهای موجود در سیستم و دادههای مربوط به طراحی است.
[2]
در دو دههی قبل، محققان امکاناتی را به منظور کشف، اعمال تغییر، تحلیل، جمعبندی، تولید، تجزیه و به تصویر کشیدن محصولات نرمافزاری ابداع کردند.
این امکانات شامل تهیهی اسناد نرمافزاری در شکلهای گوناگون، نمایش کد میانی، داده و معماری بود.
اغلب ابزارهای مهندسی معکوس بر استخراج ساختار درونی سیستم موجود با هدف انتقال آن به ذهن مهندس نرم افزار تمرکز دارد.
در هر صورت، این ابزارها راه زیادی در پیش دارند تا به مرحلهای برسند که مورد استفادهی روزانهی مهندسان نرمافزار قرار گیرند.
مطالعه و درک برنامه در صنعت نرمافزار به منظور کنترل هزینه و ریسک چرخهی تحولات سیستمهای نرمافزاری از اهمیت بالایی برخوردار میباشد {1.2}
 بررسی زبان دات نت 
1- 1 - مروری بر.
Net Framework 
Net Framework ، تمامی لایه های پیاده سازی نرم افزار را از سطح سیستم عامل به بالا، تحت پوشش قرار می دهد.
Framework فوق، سطحی مناسب وقدرتمند از ارتباط و همبستگی بین تکنولوژی Presentation ، تکنولوژی های Component و تکنولوژی های Data را ارائه می نماید ( نظیر این ارتباط و همبستگی تاکنون در پلات فرم ویندوز مشاهده نشده است) .
معماری فوق ، امکان طراحی و پیاده سازی برنامه های مبتنی بر اینترنت و محیط های Desktop ، را بسادگی فراهم و نیازهای هر گروه از نرم افزارهای فوق را بخوبی جواب می دهد.
اجزای اصلی Net Framework.
در شکل ( 1-1) نشان داده شده است
 Net Framework ، تمامی لایه های پیاده سازی نرم افزار را از سطح سیستم عامل به بالا، تحت پوشش قرار می دهد.
در شکل ( 1-1) نشان داده شده است شکل 1-1- اجزاء دات نت .
Net Framework.
از لایه پائین با عملیاتی نظیر مدیریت حافظه آغاز و بسمت بالا بمنظور ارائه اینترفیس های برنامه ها و کاربران ، دنبال می شود.
در بین لایه ها ، لایه های سیستمی دیگر که هر یک دارای پتانسیل های خاصی برای پیاده کنندگان می باشند ، وجود دارد.
CLR( Common Language Runtime) ، بمنزله قلب فریمورک دات نت محسوب و engine لازم بمنظور ارائه قابلیت های کلیدی را ارائه می نماید .
CLR ، شامل عناصر اساسی دیگری نظیر (Common Type System) CTS است.
علاوه بر مدیریت حافظه ، CLR ، مراجعات به اشیاء و عملیات Garbage Collection را نیز انجام می دهد .
در لایه میانی ، ما شاهد نسل جدیدی از سرویس های استاندارد نظیر ADO.NET و XML می باشیم .سرویس های فوق، تحت کنترل Framework بوده و امکان بکارگیری آنها بصورت جامع و استاندارد در بین تمامی زبانها ، فراهم می گردد.
بالاترین لایه، شامل اینترفیس های برنامه و کاربر است.
فرم های ویندوز، روشی جدید بمنظور ایجاد برنامه های Desktop مبتنی بر win32 می باشند.
فرم های وب، یک رابط کاربر مناسب برای برنامه های مبتنی بر وب را ارائه می نمایند.
سرویس های وب ، مکانیزمی بمنظور ارتباط برنامه ها از طریق اینترنت و با استفاده از SOAP، می باشد.
سرویس های وب، قابل مقایسه با عناصر COM و DCOM بوده با این تفاوت مهم که در این راستا از تکنولوژی های متعدد اینترنت، استفاده می گردد.
فرم های وب و سرویس های وب ، اینترفیس اینترنت دات نت را تشکیل و پیاد ه سازی آنان از طریق بخش دیگری در فریمورک دات نت که ASP.NET ، نامیده می شود ، محقق می گردد.
پتانسیل های موجود در هر لایه فریمورک دات نت ، توسط هر یک از زبان های سازگار با دات نت، قابل استفاده خواهد بود.
در پایان لازم است به این نکته اشاره گردد که در این رابطه ( Net Framework.
) می توان از اینترفیس های مبتنی بر متن ( کاراکتر) نیز استفاده کرد.
این نوع برنامه ها اصطلاحا "" Console Application، نامیده می شوند .
[1و2] 1 – 2 - معماری داتنت داتنت امکانات متنوعی را برای برنامهنویسی در اختیار ما قرار میدهد تا برای کامپیوترهای شخصی و موبایل کامپیوترها سیستمهای قدرتمندی بنویسیم.
از مزایای داتنت این است که برنامهها و دستگاهها را با استفاده از استانداردهایی همچون XML ،HTTP ،SOAP یکپارچه میسازد.
همچنین داتنت زیربنای کنترلی از راهدور را برای ما فراهم میسازد که به ما اجازه میدهد برنامهها را در پروسههای مختلف و روی کامپیوترهای مجزا اجرا کنیم و اطلاعات را با استفاده از باینری و پروتکل HTTP جابهجا سازیم.
ابزارهایی که دات در اختیار ما قرار میدهد، عبارت است از: - وبسرویسها -NET Server Infrastructure.
- نرمافزارهای Smart Client - Visual Studio .NET شکل (1-2 ) کامپوننتهای داتنت را نشان میدهد همانطور که در این شکل مشاهده میکنید، هسته مرکزی XML Web Service است که به برنامه کلاینت اجازه میدهد اطلاعاتش را با سرور یا کلاینتهای دیگر مبادله کند.
شکل1-2- کامپوننتهای داتنت NET Framework.
در حقیقت ساختار زیربنایی برای ساختن برنامههای داتنت است.
مدل برنامهنویسی NET Framework.
مدلی شیءگرا است.
برای ساخت برنامهای در داتنت ابتدا کلاس اصلی آن را میسازیم.
سپس عملکرد آن را در قالب متدهای آن کلاس قرار میدهیم.
نکته مهمی که در اینجا باید به آن اشاره نمود این است که کلاسی که مثلاً با کدهای C#.NET نوشته شده است، میتواند به راحتی به VB.NET تغییر یابد.
ECMA یا European Computer Manufactures Association، زبان عمومی، شامل نقشهایی برای این تبدیل شدن کدها و قابلیت Interoperability، را به نام CLR یا Common Language Runtime تعیین کرده است.
از آن جایی که کدهایی که با CLR هماهنگ هستند، موقع کامپایل به کدهایی به نام IL یا Intermediate Language تبدیل میشوند (و این کدها هستند که در واقع اجرا میشوند).
کدهای برنامههایی که با CLR سازگار هستند، میتوانند به کدهای دیگر زبانهایی که با CLR هماهنگ هستند تبدیل میشود.
زبانهایی که با CLR هماهنگ هستند، عبارتند از: - Microsoft Visual Basic.NET - #Microsoft Visual C - Microsoft Visual C++.NET - Microsoft Visual J# .NET شایان ذکر است که در بین این زبانها #C بهعنوان زبان استاندارد بینالمللی توسط ECMA معرفی شده است.
کدهایی که با این زبانها نوشته میشوند، همه به کدهای میانی به نام MSIL یا Microsoft Intermediate Language تبدیل میشوند.
پس میتوان با هر یک از زبان های بالا برنامه را آماده کرد و این برنامه میتواند با برنامههای دیگری که به زبان متفاوت دیگری نوشته شده است، سازگار باشد.
همانطور که قبلاً بیان شد یکی از امکاناتی که معماری داتنت در اختیار ما قرار میدهد به نام Side by Side Execution معروف است.
بدینمعنا که با استفاده از داتنت فریمورک برنامهنویسان میتوانند با استفاده از اسمبلیها نسخههای چندتایی از یک برنامه را در یک سیستم داشته باشند.
اسمبلیها شامل کدهای IL و Metadata (مسئول نگهداری اطلاعاتی همچون نام و نسخه برنامه) هستند.
CLR در حقیقت با استفاده از Metadata و جمعآوری اطلاعات نسخههای برنامه میتواند نیازهای برنامه را پیدا کند و به ما اجازه دهد نسخههای مختلف از یک برنامه را به صورت Side By Side اجرا کنیم.
همانطور که در شکل (1-3 ) مشاهده میکنید، فریمورکداتنت شامل دو کامپوننت است: کتابخانه کلاسها و CLR.
کتابخانه کلاسها در حقیقت Typeهایی که در داتنت عمومی هستند را مشخص میکنند و با استفاده از این کلاسها برنامهنویسان میتوانند برنامههای گوناگون از قبیل Windows Forms ،Web Forms و XML Web Serviceها را تهیه کنند.
از طرف دیگر، قسمت CLR شامل کامپوننتهایی است که کدهای IL را اجرا میکند و امنیت، صحت نوع دادهها و...
را کنترل میکند.
کدهایی که درون CLR اجرا میشوند را اصطلاحاً Managed Code و اگر خارج از CLR اجرا شوند، Unmanaged Code مینامند.
[1و2] شکل 1-3- معماری کلی داتنت 1 – 3 -زبان مشترک در داتنت همانطور که اشاره شد CLR یکی از اجزای مهم فریمورکداتنت است.
کار اصلی CLR ایجاد محیط اجرایی برنامه و ارایه سرویس به برنامهها است.
در واقع اجزای CLR دائماً با همدیگر در ارتباط هستند و کار میکنند تا بتوانند محیطی زیربنایی در داتنت برای اجرا شدن مهیا سازند.
(شکل 1-4 ) معماری CLR را نشان میدهد.
کار اصلی این کامپوننتها لودکردن کدهای IL برنامه، کامپایل کردن و اجرای آن کدها است.
شکل1-4 – نمایش کامپوننت های دات نت کامپوننتهای CLR که در شکل (1-4 ) نیز مشاهده میکنید عبارتند از: - لودکننده کلاسها یا Class Loader برای Load کردن کلاسها در حین اجرای برنامه - کامپایلر تبدیلکننده کدهای MSIL به Native Code - مدیر کدها یا Code Manager که مسئول مدیریت کدها در زمان اجرای برنامه است.
- GB یا Garbage Collector برای مدیریت حافظه - موتور مدیریت امنیت در سیستم - چککننده نوع پارامترها - پشتیبانیکننده Threadها - مدیریتExceptionها - موتور اشکالزدایی (debug) سیستم - COM Marshaler برای مدیریت تبادل اطلاعات بین برنامههای داتنت و برنامههای COM - Base Class Library برای اینکه یک برنامه بتواند در CLR اجرا شود، باید به یکی از زبانهای NET.
و CLS-Compliant نوشته شود.
کامپایلر داتنت این کدها را به کدهای MSIL و Metadata تبدیل میکند.
این کدها شامل اطلاعاتی از قبیل نحوه لود شدن، ذخیرهشدن و چگونگی فراخوانی متدها در کلاسها میشود.
کدهای MSIL همچنین شامل دستورات خاصی برای کار با عملیات ریاضی، چگونگی مدیریت خطاها و...
نیز هست.
مدیریت خودکار حافظه در داتنت یکی از مزایای داتنت مدیریت خودکار حافظه است که موقع اجرای برنامهها استفاده