چهارشنبه ۲۶ شهریور ۱۳۹۳
 
 
 
کلمه عبور خود را فراموش کرده اید؟
 

 
 
 C# 5.0، تصويري از آينده!
.NET C#
تاریخ ثبت:  ۸۹/۷/۱۱
تعداد نمایش:  ۷۹۰۲
  نویسنده: ابوالفضل حسن الدين
 
   ۲۸  نفر تا این لحظه به این مقاله امتیاز داده اند.
 
   Bookmark and Share

مقدمه

حدود دو سال است كه از سري مقالات سي شارپ 4.0 نگاهي به آينده، مي گذرد. در آن زمان نسخه اوليه يعني CTP سي شارپ 4.0 توسط مايكروسافت در اختيار توسعه دهندگان و برنامه نويسان سراسر جهان قرار گرفت. با انتشار نهايي ويژوال استوديو 2010 و دات نت فريم ورك 4.0، مي توان گفت كه تغييرات اندكي در نسخه نهايي ايجاد شده است و 90% محتواي مقالات سه گانه، مرجعي جامع براي نسخه سي شارپ 4.0 محسوب مي شود.



آندرس هلسبرگ در مصاحبه اي اعلام كرد كه بيش از ده هزار درخواست براي نسخه سي شارپ 4.0 از برنامه نويسان سراسر جهان توسط تيم توسعه دريافت شد. يكي از وظايف تيم توسعه سي شارپ اين است كه ويژگي هاي درخواستي را بررسي كرده و مهم ترين و پركاربردترين آن ها را پياده سازي كند.

اگر گشتي در وب بزنيد و عنوان سي شارپ 5.0 را جستجو كنيد، هيچ منبع رسمي از مايكروسافت و يا اعضاي رسمي تيم توسعه سي شارپ نخواهيد يافت. شايد يكي از دلايل اين باشد كه مدت زمان زيادي از انتشار سي شارپ 4.0 نمي گذرد و مدتي براي جا افتادن نسخه جديد و تسلط كامل برنامه نويسان به ويژگي هاي آن لازم باشد. در عوض مطالب بسيار جالب و خواندني در وبلاگ هاي شخصي برنامه نويسان و فروم ها خواهيد يافت كه مملو از ايده و درخواست براي نسخه بعدي سي شارپ مي باشند. آنچه كه در ادامه اين مقاله ارائه خواهد شد، جمع بندي كوتاه از درخواست ها و ايده هاي فعلي موجود در عرصه وب براي نسخه سي شارپ 5.0 مي باشد.

سي شارپ به كجا رسيده است؟

تاكنون چهار نسخه ي زبان سي شارپ از زمان عرضه آن به جهان برنامه نويسي، منتشر شده است. در نمودار تكاملي سي شارپ ويژگي هاي اصلي هر نسخه نمايش داده شده اند.

ويژگي هاي نسخه هاي سي شارپ
  • C# 1.0 Managed code
  • C# 2.0 Generics
  • C# 3.0 Language integrated query
  • C# 4.0 Dynamic programming
  • C# vNext Compiler as a service
همانطور كه در نمودار ديده مي شود، تنها يك ويژگي از سي شارپ 5.0 قطعي است. اين ويژگي تحت عنوان Compiler as Service، در كنفرانس PDC 2008 توسط آندرس هلسبرگ در يك دموي بسيار جالب معرفي شده است.

سرويس كامپايلر سي شارپ!

اين ويژگي را مي توان به عنوان مهم ترين دست آورد تيم توسعه سي شارپ تاكنون دانست. براي خوانندگاني كه اولين بار با اين عنوان برخورد مي كنند، ممكن است اين سوال مطرح شود كه سرويس كامپايلر سي شارپ چيست؟
حتما حكايت معروف مرغ و تخم مرغ را شنيده ايد! يك سوال فلسفي در اين حوزه مطرح است : مرغ اول به وجود آمد يا تخم مرغ؟! اين سوال در حوزه زبان هاي برنامه نويسي تغيير شكل يافته است : كامپايلر يك زبان برنامه نويسي با چه زباني نوشته مي شود؟! سوال جالبي ست و در پاسخ بايد گفت كه ممكن است از زبان هاي موجود در طراحي كامپايلر يك زبان جديد استفاده شود. كامپايلرهاي اوليه نيز با تبديل مستقيم دستورات آنها به زبان سطح ماشين به وجود آمده اند.

كامپايلر موظف است سورس كدهاي نوشته شده را پس از تحليل لغوي و معنايي، به زبان ماشين مشخصي تبديل كرده و  يك پيمانه اجرايي توليد كند. در اين فرآيند ممكن است مراحل تكميلي مانند لينك كردن و افزودن منابع به پيمانه اجرايي نيز انجام شود.

دياگرام كاركرد كامپايلر

حال متصور شويد كه تمامي اين مراحل در زمان اجرا در اختيار شما باشند! يعني API كامپايلر در اختيار شما باشد و شما در زمان اجرا بتوانيد رشته هاي حاوي كد را كامپايل كرده و نمود اجرايي به آنها ببخشيد.
براي كساني كه نمي خواهند درگيري آكادميك! با اين ويژگي داشته باشند يك مثال عملي ارائه مي دهم :

CSharpEvaluator ev = new CSharpEvaluator ();
ev.Add("System");
Action<int> PdSqrFunc = ev.Eval("int Sqr(int x) { return x * x; }");
int result = PdSqrFunc(5);

 بله، به همين راحتي به همين سادگي! خط سوم مثال ارائه شده يك انقلاب محسوب مي شود. جايي كه از يك رشته (String) به كد IL مي رسيم.

انقلاب #C نزديك است!

اگر سرويس كامپايلر سي شارپ در اختيار شما باشد، چه استفاده اي از آن خواهيد برد؟ يكي از كاربران وب سايت در فروم سوالي مطرح كرد تحت اين عنوان كه "مي خواهم در گره هاي (Node) كنترل درخت (TreeView) نام تابع خاصي را نگهداري كنم و پس از كليك كاربر، آن تابع را فراخواني كنم." چگونه؟ شايد در مقطع فعلي بتوان با Reflection به مقصود مورد نظر رسيد به اين صورت كه از طريق نوع (Type) مورد نظر و Reflection اطلاعات تابع را استخراج كرده و فراخواني غيرمستقيم آنرا انجام داد. اما سرويس كامپايلر اين عمليات را با چند خط كد ميسر خواهد كرد!

اما هدف از ارائه كامپايلر سي شارپ به عنوان سرويس فراتر از اين صحبت هاست. روند برنامه نويسي دنيا به سمت برنامه هاي مقيم در حافظه است. برنامه هاي نسل آينده، اين امكان را خواهند داشت كه بدون بسته شدن برنامه، امكانات جديدي به آنها افزوده شود. و اين در مقطع فعلي يك انقلاب محسوب مي شود.

چه ويژگي هاي ديگري را مي توان براي #C نسخه 5.0 متصور شد؟

در ادامه برخي از ويژگي هاي پيشنهادي و درخواستي برنامه نويسان و توسعه دهندگان سراسر دنيا را بررسي خواهيم كرد.

Non-Nullability: به كمك اين ويژگي مي توان انواعي را تعريف كرد كه هرگز نتوانند مقدار null اختيار كنند. در حال حاضر Null Reference يكي از خطاهاي متداول و پردردسر براي همه برنامه نويسان محسوب مي شود. انتظاري كه ازين ويژگي مي رود اين است كه در زمان اجرا در صورت اختيار كردن مقدار null توسط نوعي كه نبايد هرگز اين مقدار را اختيار كند، Exception صادر شود.

Safe Navigation Operator (?.): اين اپراتور مي تواند بسيار مفيد باشد. در ويژگي قبلي به مشكل Null Reference اشاره شد. فرض كنيد نوعي مانند Person تعريف كرده ايد و مي خواهيد به يكي از مشخصه هاي آن مثل Name دسترسي داشته باشيد. چنانچه نمونه (Instance) شما در زمان اجرا مقدار تهي داشته باشد حتما با خطاي Null Reference برخورد خواهيد كرد : person.Name اما اگر عملگري مانند person.?Name داشته باشيد كه چك كند person مقدار دارد و بعد دسترسي به Name را فراهم كند، ديگر با خطا مواجه نمي شويد.

Binding Operators: عملگرد انقياد واسط كاربري مي تواند بسيار مفيد باشد و حجم كدهاي اين حوزه را به مقدار زيادي تقليل دهد. براي اين مورد عملگر :=: پيشنهاد مي شود كه يك عملگرد دو طرفه است. فرض كنيد شما دو كنترل متفاوت داريد و مي خواهيد كه وارد شدن مقدار در يكي از كنترل ها، كنترل دوم را تحت تاثير قرار دهد:

textbox.Text :=: slider.Value;

با خط كد بالا شما اين امكان را در برنامه فراهم مي كنيد كه تغيير مقدار slider، مقدار متن textbox را تغيير دهد. عكس اين مورد نيز صادق مي باشد. در صورت لزوم نيز مي توان انقيادهاي يك طرفه به وجود آورد. مثلا:

textbox.Text := slider.Value;

به اين ترتيب تنها مقدار متن textbox با تغيير slider تغيير خواهد كرد.

Smart Case Support: آيا تاكنون در كار با switch - case احساس محدوديت كرده ايد؟ "اي كاش مي شد جاي مقدير ثابت رشته اي از كدهاي واقعي استفاده كرد" مثلا:

switch(pdObj)
{
   case string.IsNullorEmpty(otherPdObj):
         ...
   case otherPdObj.Trim().Lower:
         ...
}

Inline Assembly: زبان هاي C و ++C به برنامه نويسان اجازه مي دهند كه بتوانند بلوك هاي كد اسمبلي را مستقيما (Inline) در كدهاي خود تعريف كنند. اضافه شدن اين ويژگي به سي شارپ نيز مي تواند مفيد باشد. اما مفيدتر از آن اضافه شدن Inline IL خواهد بود مانند:

public static unsafe int Multiply(int i, int j)
{
    cil
    {
        ldarg.0
        ldarg.1
        mul.ovf
        ret
    }
}

حوزه اين تعاريف به صورت unsafe گوياي عدم اطمينان مي باشد. ولي وجود اين امكان و نيز تسلط به IL، در توليد برنامه هاي پويا فوق العاده موثر خواهد بود.

Dependency Properties:
يكي از ويژگي ارائه شده در WPF بحث Dependency Property مي باشد. در حال حاضر نحو (Syntax) نسبتا پيچيده اي در اين حوزه استفاده مي شود كه نحو ساده تر به صورت زير پيشنهاد مي شود:

public dependency class PdPerson
{
    public dependency string Name
    {
        get;
        set;
        default { return "Abolfazl Hosnoddinov"; }
        change { Console.WriteLine("Old: {0}, New: {1}", oldvalue, newvalue); }
    }
}

همه چيز واضح و گوياست و به نظرم كارايي فوق العاده بالايي مي تواند داشته باشد.

منابع براي مطالعه بيشتر

چنانچه به اين مباحث علاقمند شده ايد و يا دوست داريد خود در اين حوزه صاحب نظر باشيد و شايد روزي به ويژگي هاي سي شارپ بيافزاييد، منابع زير براي مطالعه و ثبت نظر پيشنهاد مي شوند:

ويدئو ديدني ارائه ويژگي هاي سي شارپ 4.0 توسط آندرس هلسبرگ در PDC 2008 : در انتهاي اين ويدئو دمويي از هلسبرگ در خصوص كامپايلر سي شارپ به صورت عيني ارائه شده است كه بهت و تحسين همگان را برانگيخت.

TechOff : Ideas for C# 5.0

StackOverflow: C# Language Speculation (4.5/5.0)

5 nice things to have in C# 5.0

  Binding Operators for C# 5

كلام آخر

اين مقاله، اولين مقاله اي است كه توسط آپلود آنلاين وب سايت ارائه مي شود و به زودي پس از تست نهايي در اختيار عموم علاقمندان و همراهان سايت قرار خواهد گرفت. اميدوارم كه شاهد حضور پر رنگ تر شما عزيزان باشيم. مثل هميشه از همراهان گرامي، همكاران عزيز و خوانندگان ارجمند وب سايت، خواهشمندم ما را از نكته نظرات و پيشنهادات خود بهره مند سازند. با بحث و گفتگو مي توانيم بر پرباتر شدن مطالب سايت بيافزاييم.

( هر گونه استفاده از مقالات اختصاصي PersiaDevelopers منوط به درج منبع و نام نويسنده بلامانع مي باشد.)

  کیفیت مقاله ارائه شده از نظر شما   
برای دادن رتبه به این مقاله می بایست Login کرده باشید.
  درباره نویسنده
ابوالفضل حسن الدين
On my own in the programming world
همه مقاله های نوشته شده توسط این کاربر (۲۵)
 
  پیام جدید
صفحه ۱ - پیامهای اصلی ۱ تا ۱۰ از مجموع ۱۱ پیام اصلی
اولین قبلی بعدی

 عنوان فرستنده تاریخ
 
تشکر مجید سامانی ۱۳۹۲/۱/۱۹
 
تشکر سعید صادق نژاد ۱۳۹۰/۳/۲۵
پاسخ به: تشکر ابوالفضل حسن الدين ۱۳۹۰/۳/۲۵
 
خیلی خوب شبیر عباس زاده ۱۳۸۹/۷/۲۰
پاسخ به: خیلی خوب ابوالفضل حسن الدين ۱۳۸۹/۷/۲۰
 
بسيار عالي محمد رضا معطر ۱۳۸۹/۷/۱۹
پاسخ به: بسيار عالي ابوالفضل حسن الدين ۱۳۸۹/۷/۱۹
 
خبر : ميزان مشاركت در بحث %1.75! ابوالفضل حسن الدين ۱۳۸۹/۷/۱۸
 
مثل هميشه عالي الهام رضائي ۱۳۸۹/۷/۱۴
پاسخ به: مثل هميشه عالي ابوالفضل حسن الدين ۱۳۸۹/۷/۱۵
 
تصویری از آینده مرتضی صحراگرد ۱۳۸۹/۷/۱۴
پاسخ به: تصویری از آینده ابوالفضل حسن الدين ۱۳۸۹/۷/۱۴
پاسخ به: تصویری از آینده الهام رضائي ۱۳۸۹/۷/۱۴
پاسخ به: تصویری از آینده ابوالفضل حسن الدين ۱۳۸۹/۷/۱۵
 
تشكر و پيشنهاد کاوش حسینی ۱۳۸۹/۷/۱۳
پاسخ به: تشكر و پيشنهاد ابوالفضل حسن الدين ۱۳۸۹/۷/۱۳
 
خیلی جالب! فربد صالحی ۱۳۸۹/۷/۱۳
پاسخ به: خیلی جالب! ابوالفضل حسن الدين ۱۳۸۹/۷/۱۳
پاسخ به: خیلی جالب! فربد صالحی ۱۳۸۹/۷/۱۳
 
ویژگیهای جالبیه مجید شهاب فر ۱۳۸۹/۷/۱۱
پاسخ به: ویژگیهای جالبیه ابوالفضل حسن الدين ۱۳۸۹/۷/۱۴
اولین قبلی بعدی

Copyright © 2006 - 2014 All Rights Reserved.
Please direct your questions or comments to