ساختار برنامه نویسی غیرهمزمان :
در مقاله دوم از سری مقالات سی شارپ 5.0، برنامه نویسی غیرهمزمان معرفی شد. برنامه نویسی غیرهمزمان این امکان را فراهم می کند که فراخوانی توابع مورد نظر (که با کلمه کلید async مشخص می شوند)، به صورت غیرهمزمان انجام شود. به این معنا که اجرای برنامه منتظر اتمام فراخوانی تابع نمانده و ادامه پیدا می کند. در نتیجه می توان در فاصله زمانی بین فراخوانی تابع غیرهمزمان و اتمام آن، پردازش های دیگری انجام داد.

در این مقاله قصد بر آن است تا ساختار برنامه نویسی غیرهمزمان مورد بحث و بررسی قرار گیرد. اما پیش از آن تاریخچه ای از برنامه نویسی غیرهمزمان ارائه می شود.


تاریخچه

برنامه نویسی غیرهمزمان به عنوان بخشی از نسخه آینده سی شارپ یعنی 5.0 معرفی شده است و همانطور که در مقاله قبلی هم اشاره شد، این ویژگی قبلا توسط زبان های رسمی دات نت از جمله سی شارپ و ویژوال بیسیک پشتیبانی نمی شده است. به جای آن ساختارهایی در دات نت فریم ورک وجود داشتند که پیاده سازی الگوهای برنامه نویسی غیرهمزمان را ممکن می ساختند. اما نگاهی به تاریخچه دات نت نشان می دهد که برنامه نویسی غیرهمزمان مبحثی جدید نبوده بلکه گرد و غبار تاریخ بر روی آن نشسته است!


Cω (سی اُمِگا)، نواده ای از سلسله C که هرگز به قدرت نرسید!

شرکت مایکروسافت، واحدی به نام دارد که تحقیق و توسعه در زمینه های پایه ای و کاربردی علوم کامپیوتر و مهندسی نرم افزار را عهده دار است. یکی از زمینه هایی که Microsoft Research در آن ایفای نقش می کند، تولید و توسعه ی زبان های جدید برنامه نویسی ست. نمونه ای موفق در این عرصه، زبان جدید برنامه نویسی است که در قالب ویژوال استودیو 2010 با عنوان ویژوال #F به صورت رسمی ارائه شد. #F یکی از Microsoft Research بوده که توسعه آن سال ها طول کشیده است.

#C زبان شی گرایی است که همزمان با توسعه پلتفرم دات نت به عنوان اولین زبان دات نت طراحی شد (باقی زبان ها، نسخه های قبلی خود را با پلتفرم دات نت سازگار ساخته و پسوند Net. گرفته اند). در طراحی آن سعی شده است از ساختار و استایل بزرگان دنیای برنامه نویسی یعنی C و ++C استفاده شود. حال این سوال مطرح می شود که آیا سلسله زبان های C دنباله دار است؟ جواب را باید در Microsoft Research جستجو کرد. نام پرابهت در بین اسامی زبان های توسعه یافته بر مبنای سی شارپ به چشم می خورد.

Cω در ابتدا با نام کد #X شناخته می شده است که توسط تیم داده مایکروسافت در اس کیو ال سرور و با همکاری تحقیقات مایکروسافت در بریتانیا طراحی شد. بعد از ترکیب شدن آن با یک زبان تحقیقاتی دیگر به نام به Cω تغییر نام یافت. هدف از ارائه Cω تسهیل کار با انباره های داده مانند فایل های XML و پایگاه داده ها بوده است که امروزه این ویژگی ها در LINQ نمود عینی پیدا کرده است! نکته جالب این است که #Polyphonic C امکان را به Cω افزود که این ویژگی نیز قرار است در نسخه سی شارپ 5.0 ظهور کند!


نمونه فراخوانی در Cω برای انتخاب داده ها

در Cω آمده است: "در Cω توابع می توانند به دو صورت همزمان و غیرهمزمان فراخوانی شوند. هنگامی که تابعی به صورت همزمان فراخوانی می شود، فراخواننده تا زمان بازگشت اجرا از تابع، بلوک می شود مانند روال نرمال فراخوانی ها در #C. اما زمانی که تابعی به صورت غیرهمزمان فراخوانی می شود، اجرا بدون بلوک کردن فراخواننده و بدون دریافت نتیجه ادامه پیدا می کند. بنابراین از نقطه نظر فراخوانی کننده، تابع غیرهمزمان مانند یک تابع void با تضمین بازگشت بلافاصله بعد از فراخوانی می باشد." حتی در حوزه برنامه نویسی غیرهمزمان ارائه شده است. به عنوان مثال به ساده ترین آن ها توجه کنید:

public class Buffer {
public async Put(string s);
public string Get() & Put(string s) { return s; }
}


کلمه کلیدی async با رنگی متمایز مشخص شده است.

در پایان این تاریخچه، مطالعه در سال 2005 با آندرس هلسبرگ بسیار جالب خواهد بود. در این مصاحبه چندین سوال در مورد Cω مطرح شده است.