یک ران تایم برای اجرا کردن همه!

با CLR که آشنا هستید!؟ یکی از اجزای اصلی پلت فرم دات نت مایکروسافت است. CLR یک پیاده سازی از CLI استاندارد است و محیطی برای اجرای کدهای برنامه های دات نت ایجاد می کند. کامپایلر های سی شارپ و ویژوال بیسیک دات نت کد ماشین تولید نمی کنند، بلکه کدی تولید می کنند به صورت byte code که ماشین به تنهایی قادر به تفسیر و اجرای آن نیست. کامپایلر ابتدا کد CIL یا همان MSIL را تولید می کند. سپس هنگام اجرای برنامه مورد نظر CLR وارد عمل شده و با کامپایلر just in time یا JIT کد CIL برنامه مورد نظر را به کدی که برای سیستم عامل قابل درک باشد، تبدیل می کند.

clr

وظیفه CLR تنها تبدیل بایت کد CIL به کد ماشین نیست، CLR وظایف مدیریت حافظه، پردازش استثناها (Exception Handling)، مدیرت نخ ها (Thread Management)، Garbage Collection و تامین امنیت را به بهترین نحو انجام می دهد.

CLR پیاده سازی CLI استاندارد برای سیستم عامل ویندوز است. پیاده سازی های دیگر CLI مثل Mono و Portable.NET برای سیستم عامل های غیر ویندوز بوجود آمده اند، زیرا CLR فقط روی ویندوز اجرا می شود.

ایده نوشتن این مطلب و عنوان آن، طرح تی شرت زیر است. بقیه تی شرت های تیم CLR را ببینید!

clr_shirt

طرح این تی شرت، شما را به یاد ارباب حلقه ها نمی اندازد!؟ 🙂

تعریف برخی از اصطلاحات بکار رفته در این مطلب :

  • CLI : مشخصات بازی (=open specification) است که توسط مایکروسافت توسعه داده می شود که کد اجرایی و محیط ران تایمی که هسته دات نت فرم ورک و نرم افزارهای آزاد Mono و Portable.NET را شکل می دهند، توضیح می دهد. این مشخصات محیطی را تعریف می کند که به زبان های برنامه نویسی سطح بالا امکان استفاده در پلت فرم های مختلف را بدون باز نویسی برای یک معماری خاص، می دهد. CLI مخفف Common Language Infrastructure است.
  • CIL : زبان سطح پائینی در CLI است که زبان های تحت دات نت پس از کامپایل شدن به آن ترجمه می شوند. CIL معادل دات نت زبان اسمبلی برای یک CPU است. پس از تبدیل سورس کد یکی از زبان های دات نت به کدهای CIL، این کدها به بایت کد تبدیل می شوند و یک اسمبلی دات نت ایجاد می شود. CIL قبلاً با اسم MSIL نیز شناخته می شد. CIL به صورت «sil» (سیل) تلفظ می شود و مخفف Common Intermediate Language است.
  • JIT Compiler : به عنوان «ترجمه پویا» نیز شناخته می شود و تکنیکی است برای بهبود کارایی یک برنامه کامپیوتری. JIT کد تولید شده قبل از اجرای برنامه را به کدی که به صورت Native اجرا می شود، تبدیل می کند. برای مثال بایت کد را به کد ماشین تبدیل می کند. بسیاری از محیط های ران تایم مدرن مانند دات نت مایکروسافت و بسیاری از پیاده سازی های جاوا از JIT برای اجرای کد با سرعت بالا استفاده می کنند.
  • Garbage Collection : یک شکل از مدیریت حافظه خودکار است که برای باز پس گیری حافظه اشیائی که دیگر مورد استفاده قرار نمی گیرند، کاربرد دارد.
  • Mono : مونو پروژه اوپن سورس و آزادی است که توسط ناول برای پیاده سازی دات نت فریم ورک روی پلت فرم های غیر ویندوزی بوجود آمده است. مونو می تواند روی انواع توزیع های لینوکس (ماننده اوبونتو و زوزه)، مک، سولاریس، سیستم عامل های سازگار با یونیکس و BSD اجرا شود. این پروژه شامل ابزارهای سازگار با دات نت مثل یک IDE، کامپایلر سی شارپ و یک پیاده سازی CLR است. (بخوانید : آیا برنامه دات نت شما روی لینوکس اجرا می شود!؟)
  • Portable.NET : قسمتی از پروژه DotGNU است و محیط ران تایم آزاد و اوپن سورسی برای برنامه های مبتنی بر CLI استاندارد است. این پروژه از کلاس های پایه دات نت، XML و Windows Forms پشتیبانی می کند.

منبع : ویکی پدیا

farasun.wordpress.com

مطالب مرتبط :

اگر تمايل به دنبال کردن مطالب اين وبلاگ داريد، مي توانيد مشترک فيد فراسان شويد.

چطور مشترک شويم؟

نوشتن کدهای نا امن در سی شارپ

همان طور که می دانید در برنامه های تحت دات نت به صورت نرمال وظیفه تخصیص حافظه و آزادسازی آن بر دوش برنامه نویس نیست و به کدهایی که به زبان سی شارپ نوشته می شوند به اصطلاح «کدهای مدیریت شده» می گویند. در مقابل کدهای مدیریت شده، کدهای نا امن یا مدیریت نشده قرار دارند. خیلی از برنامه نویسان سی شارپ شاید هیچ وقت از این قابلیت استفاده نکنند و خیلی ها فکر می کنند نوشتن این کدها تخصص خاصی می خواهد و پیچیدگی های زیادی دارد. پس از خواندن این مقاله خواهید فهمید که نوشتن کدهای نا امن آن قدرها هم سخت و ترسناک نیست.

در کدهای نا امن (=Unsafe) یا مدیریت نشده (=Unmanaged) شما قادر به تعریف و استفاده از اشاره گرها (=Pointer) هستید. اما سوال اینجاست که کدهای نا امن به چه دردی می خورند!؟ اگر ما قصد دسترسی مستقیم به حافظه یا ارتباط مستقیم با سیستم عامل داشته باشیم و یا بخواهیم الگوریتم خاصی را پیاده سازی کنیم، اشاره گرها قدرت و انعطاف زیادی به ما خواهند داد. من در اینجا قصد ندارم در مورد مزایا یا معایب کدهای نا امن و یا ساختار آن ها در دات نت صحبت کنم، فقط می خواهم با مثال های ساده نحوه نوشتن این کدها را به شما آموزش دهم.

در سی شارپ با استفاده از کلمه کلیدی unsafe، می توانید به صورت صریح به کامپایلر بگوئید که قصد نوشتن کدهای نا امن را دارید. نوشتن کدهای نا امن در سی شارپ مثل این است که شما بخواهید در میان کدهای سی شارپ از کدهای زبان C استفاده کنید! بهتر است برای درک موضوع به مثال اول توجه کنید :

using System;
class sample {
	public static void Main() {
	        int data = 10;
		int* Pdata = &data;
		Console.WriteLine("Data is " + data);
		Console.WriteLine("Address is " + (int)Pdata);
	}
}

توضیح : در برنامه بالا متغیری به نام data ساختیم از نوع صحیح، در خط بعد با استفاده از * اشاره گری از نوع صحیح (int) به متغیر data ساختیم. عملگر & آدرس متغیر را در حافظه بر می گرداند.

برنامه بالا یک نمونه استفاده از کدهای نا امن است. خب، برنامه را اجرا کنید. کامپایلر به شما خطای زیر را می دهد.

Microsoft (R) Visual C# Compiler Version 7.00.9030 [CLR version 1.00.2204.21]
Copyright (C) Microsoft Corp 2000. All rights reserved.
um1.cs(6,8): error CS0214: Pointers may only be used in an unsafe context
um1.cs(8,27): error CS0214: Pointers may only be used in an unsafe context

به صورت نرمال، کامپایلر سی شارپ به شما اجازه استفاده از کدهای نا امن را نمی دهد. شما باید با استفاده از کلمه unsafe به کامپایلر سی شارپ بفهمانید که قصد نوشتن کدهای نا امن را دارید. حالا برنامه بالا را طوری تغییر می دهیم که دیگر خطایی مشاهده نکنیم.

using System;
class sample {
	public unsafe static void Main() {
	        int data = 10;
		int* Pdata = &data;
		Console.WriteLine("Data is " + data);
		Console.WriteLine("Address is " + (int)Pdata);
	}
}

در برنامه بالا، تابع Main با کلمه unsafe همراه شده است. این بدین معنی است که تمامی کدهای داخل این تابع به صورت نا امن نوشته شده اند. شاید این سئوال برای شما هم پیش بیاید که چطور می توان فقط قسمتی از کدهای تابع Main را به صورت نا امن نوشت. خب، حالا برنامه بالا طوری تغییر می دهیم که فقط بدنه تابع به صورت نا امن اجرا شود و همچنین این بار به جای مقدار متغیر data، مقداری که Pdata به آن اشاره می کند روی صفحه چاپ شود.

using System;
class sample {
	public static void Main() {
	   unsafe {
                int data = 10;
		int* Pdata = &data;
		Console.WriteLine("Data is " + Pdata->ToString());
		Console.WriteLine("Address is " + (int)Pdata);
	   }
       }
}

در برنامه بالا با استفاده از کلمه unsafe فطعه ای از کدها را به صورت نا امن نوشتیم. همچنین مقداری که Pdata به آن اشاره می کند را با تابع ToString به خروجی فرستادیم.

در مقالات بعدی بیشتر با کدهای unsafe آشنا خواهیم شد و مثال های کاربردی تری ارائه خواهیم داد. برای اینکه ایم مقالات را از دست ندهید مشترک فراسان شوید. چگونه مشترک فرسان شوم!؟

farasun.wordpress.com

Subcribe to Farasun feedمشترک فراسان شويد

farasun.wordpress.com

مطالب مرتبط :

طراحی سایت، ثبت دامین، میزبانی فضا و بهینه سازی سایت در موتورهای جستجو