سوال 1 - چه نوع شیوه های برنامه نویسی برای ++C/C توسط کامپایلری مثل ++Visual C وجود دارد؟

دو نوع : 1- بومی (Native) و 2- مدیریت شده (Managed)

1) در نوع native که قدرتمند ترین نوع برنامه نویسی می باشد (مدیریت نشده) ، برنامه شما به طور مستقیم توسط پردازنده مرکزی (CPU) اجرا می شود و می تواند بر روی نسخه های مختلف سیستم عامل ویندوز اجرا شود (این مورد شامل ویندوز CE و ویندوز mobile برای تلفن های همراه نیز می شود ).
لذا برنامه های native دسترسی مستقیم به سیستم عامل و سخت افزار دارند و این به شما قدرت و کارآیی (Performance) بسیار بالایی می دهد. اما نکته ای که باید توجه کنید این است که قدرت بالا ، به دقت ، مسئولیت پذیری و تمرین بیشتری نیاز دارد تا موارد به درستی انجام شود.
که البته این شیوه محدود به ++Visual C نیست و می توان از سایر کامپایلر ها که SDK ویندوز را داشته باشند نیز همچون DevC++‎/minGW استفاده کرد.

تذکر مهم : ضمنا حتی یادگیری این شیوه برای افرادی که با سایر زبان ها ، چه دات نت و چه غیر دات نت مثل #Delphi ، C و... کار می کنند ، شدیدا توصیه می شود و در برخی موارد یک ضرورت می باشد. به عنوان نمونه در اکثر شرکت های برنامه نویسی سراسر دنیا افرادی که از دانش برنامه نویسی Native در کنار زبان های مبتنی بر دات نت بهره می برند ، از اولویت و ارجحیت بالاتری برخوردارند.

2) در نوع managed که یک محیط runtime به نام CLR برای شما فراهم می کند ، شما را از این پیچیدگی کار و قرار دادن تحت سیستم عامل و سخت افزار جدا می کند و برنامه نویسی را بسیار سریع تر و آسان تر می کند. اما در هر حال این جدایی ، انعطاف پذیری (flexibility) و به احتمال غریب به یقین کارآیی (Performance) کمتری دارد ، که البته این موارد بستگی به پروژه مورد نظر دارد که آیا کارآیی ، مورد اهمیت می باشد یا خیر.
ضمنا این مورد نیاز به نصب .Net در سیستم مورد نظر دارد.

به عنوان نمونه در بسیاری از سیستم های پایگاه داده ای که تنها نیاز به یک طراحی ساده می باشد و اکثر کارها توسط دیتابیس ها انجام می شود و همین طور نیاز به کارایی اهمین چندانی ندارد ، برنامه نویسی managed از طریق دات نت توصیه می شود ، به خصوص توسط زبان #C به جای نسخه C++‎/CLI (دات نت ++C ) پیشنهاد می شود.

(در مورد دلایل این موضوع به سوالات 8 و 9 مراجعه کنید)

**********************************************

سوال 2 - پس به طور خلاصه ، طبق تعریف مایکروسافت مزایا و اشکالات آن ها چه می باشد ؟

Native :

مزیت - کارآیی بالا
مزیت - کمترین میزان نیاز به منابع سخت افزاری مانند حافظه Ram و فضای دیسک و ...
نقص - پیچیدگی بیشتر و دارای زمانبری بیشتر برای کارکردن و نوشتن با آن
نقص - وابسته به پلتفرم ویندوز

تذکر: برای اطاعات بیشتر در مورد نقد ، برای نقص آخر به "سوال 4 " مراجعه کنید.

Managed :

مزیت – قابلیت حمل (قابل استفاده در هر سیستم دارای CLR)
مزیت – سهولت در این نوع برنامه نویسی
نقص – احتمال اجرای کند تر
نقص – امکان نیاز بیشتر به منابع سیستمی ، حافظه و فضای دیسک و ...

تذکر: که البته نمونه بارز مورد آخر ویندوز Vista می باشد و این موضوع که در دنیا امری شناخته شده است ، مورد مخالفت بسیاری از دوستداران دات نت است و این در حالی است که این جملات هر ساله توسط مایکروسافت ارائه می شود !

برای اطاعات بیشتر در مورد ضعف های مهم شیوه Managed توسط ++C به "سوال 5 " مراجعه کنید.

**********************************************

سوال 3 - طبق تعریف مایکروسافت کجا باید از C/C++‎استفاده کنیم ؟ (بحث بسیار مهم)

++C زبان مورد انتخاب برای ساخت نرم افزارهایی با کارآیی بالا است که به طور "مستقیم" به منابع یا تجهیزات و ابزار های ویندوز دسترسی دارند. پس شما با آن می توانید به قابلیت های سطح پایین سیستم دسترسی داشته باشید و البته به خاطر اینکه این زبان به شما قدرت بسیار بالایی می دهد ، لذا در مقایسه با سایر زبان ها مثل visual Basic یا #C شما بایستی از جزییات بیشتری اطلاع داشته باشید.

و به قول نویسندگان مطرح: "C++‎ Is Not For Children"

دقت به این نکته بسیار ضروری است که جملات فوق در سال 2008 دوباره همچون سال های قبل توسط مایکروسافت تکرار شده است ، در حالی که با وجود این مطالب ، بارها و بارها از سمت برنامه نویسان محصولات مایکروسافت در کشورمان (و مخصوصا توسط برنامه نویسان دات نت کار حرفه ای و با تجربه) جملاتی غیر علمی همچون :
"زبانی از دور خارج شده" و یا "زبانی قدبم و منسوخ" به زبان آورده می شود.

نکته ای که بسیاری از اساتید بزرگ دانشگاه های کشورمان در هنگام تدریس خود ،به آن توجهی نکرده و حتی آن را با نام "C مرحوم" یاد می کنند !

طبق همین قابلیت ها است که مایکروسافت برای توسعه API های جدید صوت خود برای وبندوز Vista می نویسد:
Because some aspects of audio streaming depend on low latency and precise synchronization, the implementations of the MMDevice, WASAPI, DeviceTopology, and EndpointVolume APIs do not use the Microsoft .NET Framework or managed-execution environment
بنابراین از جمله کاربرد های بدون شک این زبان برنامه هایی می باشد که نیاز به دقت بالا ، تاخیر زمانی کوتاه (Low-latency) و استفاده مستقیم از سخت افزار دارند ، نرم افزار هایی همچون:
نرم افزارهای گرافیگی و طراحی 2 بعدی و 3 بعدی ، محیط ها و موتورهای توسعه بازی های کامپیوتری ، نرم افزارهای صوتی / تصویری ، پیشرفته سیستمی و غیره ... که چیزی فراتر از طراحی واسط کاربر باشد .

**********************************************

سوال 4 – آیا راهی وجود دارد که برنامه ای با ++C نوشت که قابل اجرا شدن بر روی سایر سیستم عامل ها به صورت Native باشد؟

بله ، قابلیتی که بسیاری از برنامه نویسان دات نت در کشورمان از آن بی اطلاع هستند و همان طور که توضیح داده شد ، زبان ++C/C را بدون اطلاع با عناوینی نامناسب و یا "خیلی سخت" خطاب می کنند در حالی که نرم افزارهای تجاری متوسط و بزرگ در سراسر دنیا همچنان با این زبان نوشته می شوند.

این مورد در سال های اخیر با محبوبیت یافتن ابزارهایی مثل Qt ، Wxwidgets و سایر ابزار های برنامه نویسی ++C به طور کاملا تغییر کرده و از سختی و پیچیدگی آن کاسته شده است و به این شکل که این ابزار ، حال به صورت open source و یا تجاری ، این امکان را در قالب یک Framework و چیزی شبیه .Net به شما می دهد تا برنامه های شئی گرایی به صورت native بنویسید که تنها با نوشتن یک کد واحد، برنامه شما توسط سایر کامپایلرها ، قابل کامپایل و اجرا شدن برای سیستم عامل های دیگر همچون Linux و یا Mac OS نیز باشند و به این امکان Cross-platform می گویند.

این ابزار نه تنها توسعه را مانند نمونه های دات نت بسیار ساده تر و سریع تر می کنند ، بلکه دارای Performance بالا نیز هستند ، و این به دلیل آن است که در پیاده سازی آن ها از کدها و API های Native هر سیستم عامل استفاده شده است (یعنی win32 در ویندوز ، Xlib در لینوکس ، Carbon در Mac OS و ...) و شما با داشتن سورس کدهای آن ها می توانید نهایت کنترل را روی پروژه خود داشته باشید.

از نمونه های چشمگیر این موارد ، نرم افزار های پیشرفته 3 بعدی :
Google earth ، Mudbox3D ، RealFlow و ...

*********

و به همین خاطر است که Autodesk در بخش FAQ سال قبل خود می نویسد:
آیا Mudbox3D در آینده سایر سیستم عامل ها را پشتیبانی خواهد کرد؟

و در جواب) بله ، از آنجایی که از ابتدا به صورت Cross-platform طراحی شده است ، این امکان در آینده وجود خواهد داشت
(و البته که این قابلیت چقدر مورد توجه شرکت های غیر ویندوزی خواهد بود.)


تذکر مهم: البته اکثر شرکت هایی متوسط و بزرگ که برنامه نویسان حرفه ای در اختیار دارند ، با وجود حضور چنین ابزارهایی ، ترجیح می دهند که خودشان framework مخصوص خود و در نتیجه نرم افزارشان را با همین کدهای Native هر سیستم عامل به طور جداگانه ، به صورت Cross-platform طراحی کنند .

بله ؛ امکانی که به ظاهر توسط دات نت امکان پذیر است ولی در عمل تا کنون به صورت رسمی تحقق نیافته است.

**********************************************

سوال 5 - پس برنامه نویسی ++C می تواند Cross-platform باشد ، آیا زبان های مبتنی بر .Net نمی توانند؟

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

اما کدام شرکت قادر به پرداخت هزینه سنگین و چندین میلیارد دلاری آن می باشد ؟

و متاسفانه تا کنون تنها سیستم های مایکروسافتی از آن بهره برده اند:
مانند windows mobile/CE و Xbox360

به همین منظور شرکت هایی همچون Novell با راه اندازی پروژه های open source و البته بدون مجوز از مایکروسافت مانند Mono ، اقدام به پیاده سازی و به قولی شبیه سازی دات نت کنند تا بتوان طبق استاندار های زبان #C ، آن برنامه ها را در سیستم عامل های دیگر نیز کامپایل و اجرا کرد.

از اشکالات بزرگ این پروژه : همواره چند سال از پیاده سازی آخرین نسخه دات نت عقب می باشد و همه قابلیت ها در آن نیز قابل پیاده سازی نیست. ضمنا هیچ تضمینی در حمایت از برنامه شما به صورت تجاری وجود ندارد ، مگر اخیرا با پرداخت 13000 دلار برای پروژه های تجاری ، برای سازمان ها و یا شرکت ها ، پشتیبانی انجام خواهد گرفت و آن هم نسخه های پیاده سازی شده چند سال قبل دات نت !

خوب اگر شما برنامه نویس به روزی نیستید ، پروژه هایی مانند mono گزینه آسان و شاید خوبی برای شما باشد !

**********************************************

سوال 6 – شیوه Native چه انواعی دارد ؟ کدام مورد پیشنهاد می شود؟

MFC و win32 ، که هر دو مختص پلتفرم ویندوز هستند.

در Win32 که قلب ویندوز شناخته می شود و شیوه برنامه نویسی سطح پایین می باشد (پشتیبانی از 16 بیت تا 64 بیت) ، سرعت توسعه نسبت به سایر زبان ها مانند VB و #C کاهش خواهد شد و زمان و انرژی بیشتری صرف خواهد شد، اما در عوض همه چیز در اختیار شما قرار دارد ، از کنترل دقیق حافظه تا کنترل تمامی منابع سیستم و البته با نهایت کارآیی.

اکثر نرم افزار های تجاری شرکت های بزرگ و متوسط سراسر دنیا که در منازل از آن ها استفاده می کنید (و نیازی به نام بردن آن ها نیست )و تقریبا هسته اصلی تمامی بازی ها در نسخه ویندوز آن ها از این API ها به طور مستقیم استفاده می کنند.

ضمنا افرادی که می خواهند Software Development Kit یا همان SDK برای نرم افزار خود ارائه کنند تا افراد بتوانند به وسیله آن افزونه ها و plug-in هایی برای توسعه همان نرم افزار بنویسند، بیشتر از این شیوه استفاده می کنند.

***********

MFC یا همان Microsoft Foundation Class ، یکframework می باشد که API های win32 را در قالب کلاس هایی برای برنامه نویسان C++‎ ارائه می کند ، تا زمان توسعه را کاهش دهد ، کار با پایگاه داده را آسان تر می کند و با وجودی که تقریبا تمامی قابلیت های سایر زبان ها را در اختیار شما قرار می دهد ، و جدا از اینکه کارآیی در مقایسه با شیوه قبل کمی کاهش می یابد ، تمامی ناحیه های win32 را نیز در بر نخواهد گرفت و لذا نیاز به آشنایی با خود API های ویندوز نیز می باشد .
ضمنا MFC در کشورمان کاربران بیشتری دارد !

نکته: این شیوه برای افرادی که قصد دارند تا خودشان framework جدیدی با قابلیت Cross-platform بسازند ، گزینه مناسبی نیست و به همین منظور، انتخاب درست در این زمینه ، win32 در ویندوز و سپس ترکیب آن با API های native سایر سیستم عامل ها (مثل carbon و Xlib و GTK+ و ...) می باشد تا ایجاد این framework با تلاش هر چند طاقت فرسا ، امکان پذیر شود. کاری که تا کنون توسط تمامی toolkit های Cross-platform و بسیاری از شرکت ها انجام شده است.

این شیوه در سال های اخیر کاربرانش کمتر شده است و در مقابل سایر رقبای شئی گرای خود همچون Qt به آن عنوان برنامه نویسی آشفته یا کثیف (mess) را داده اند.

از جمله محصولات شرکت Nero و همین طور ابزار های همراه آن که در سال های اخیر عرضه شده اند ، همچون کپی CD/DVD ، پخش فیلم ، ویرایش موسیقی و غیره ... از MFC استفاده می کنند.

ذکر یک نکته : ضمنا در کامپایلر های دیگری همچون C++‎Builder شیوه دیگر برنامه نویسی از طریق ++C وجود دارد که توسط VCL انجام می شود ، کاربرانی که با Delphi آشنایی دارند ، حتما با این component ها نیز آشنا هستند.
این شیوه برنامه نویسی که مبتنی بر component ها است، با ایجاد فرم ها و ساده کردن برنامه نویسی ، توسعه را بسیار سرعت می بخشد و امکانات مختلف مانند تحت وب نیز ارائه می کند و حتی کاربران در برخی از موارد به سرعت کامپایل سریع ترC++‎Builder نسبت به ++Visual C نیز اشاده کرده اند و اما به نسبت دو شیوه Native فوق منابع کمتر ، ضعف های بیشتر و همین طور کاربران کمتری نسبت به ++Visual C در سراسر دنیا دارد (بنابر آمار های ارائه شده یک سوم برابر) ، اما در هر حال همچون زبان Delphi در کشورمان محبوبیت بسیار بالایی دارد !

اگر در حال حاضر با توجه به شرایط جدید در دنیای برنامه نویسی از من نظر بپرسید ، به شما پیشنهاد می کنم که اگر هدفتان سرعت در توسعه و قدرت است ، به جای VCL بهتر است به دنبال C#‎ بروید.

برای آشنایی با این شیوه بهترین مکان سایت زیر می باشد:
http://www.functionx.com/bcb/index.htm

**********************************************

سوال 7 – تفاوت بین VC++‎ 6 و VC++‎ .Net در چیست ؟

پس از ارائه دات نت در سال 2001 نسخه های بعدی ++visual C با نام .Net همراه شدند ، که این فقط یک نام برای این کامپایلر می باشد و از آن سری به بعد شما می توانید به هر دو شیوه native و managed برنامه بنویسید.

**********************************************

سوال 8 - در نوع managed کدام پیشنهاد می شود : برنامه نویسی .Net توسط ++C و یا #C ؟

سوال 9 - آیا توسعه Native برای
++C/C ادامه دارد یا باید به سمت .Net کوچ کرد؟

در برنامه نویسی C++‎/CLI که به برنامه نویسی دات نت و Managed معروف است ، با توجه به اینکه این زبان ذاتا قادر به بر طرف کردن همه نیاز های دات نت نیست ، با اضافه کردن امکاناتی غیر استاندارد به زبان ++C و به نوعی دگرگون کردن آن ، این امکان فراهم شده است تا بتوان از .Net توسط این زبان استفاده کرد ولی باعث سخت تر شده کار نسبت به سایر زبان ها مانند #C در حوزه دات نت شده است.

لذا طبق گفته های مکرر تیم طراحی ++Visual C ، طبق سیاست جدید مایکروسافت ، تصمیم بر آن گرفته شده که برای راضی نگه داشتن مشتریان ، توسعه بخش Native توسط ++C/C ، به سرعت و همراه با پیشرفت تکنولوژی انجام شود (و با ارائه بیش از 7000 API جدید برای ویندوز vista تمامی شک های احتمالی بر طرف شد و امید پشتیبانی بخش native برای سال های آینده به واقعیت قطعی تبدیل شد و دیگر اجباری در کوچ کردن به دات نت نمی باشد)، که این کار باعث ایجاد تاخیر در توسعه بخش دات نت برای C++‎/CLI می شود و بیان شده است که:
کاربران انتظار نداشته باشند کاری که قبلا توسط سایر زبان ها انجام پذیرفته است (VB و #C) ، حتما و فورا برای C++‎/CLI نیز انجام شود .

لذا بیان شده است که طبق این سیاست ، علت اصلی این توسعه بخش دات نت ، فراهم کردن امکان ترکیب کدهای Native با کد های managed توسط CLI می باشد تا به شما امکان و قدرت استفاده از هر دو حوزه داده شود.
http://blogs.msdn.com/somasegar/arch...28/681224.aspx

برخی از نمونه های این ضعف ها در پایین آورده شده است:

1) عدم امکان برنامه نویسی C++‎/CLI توسط دات نت برای windows mobile/CE می باشد که برای دات نت VB و #C و برای غیر دات نت نیز شیوه قدرتمند Native توسط C/C++‎ پشتیبانی می شود.

2) تاخیر در ارائه برخی تکنولوژی ها برای آن نسبت به دو زبان VB و #C، از آن جمله عدم پشتیبانی "مستقیم" XAML برای کار با WPF توسط نسخه دات نت ++C در حال حاضر و در عوض حمایت در نسخهNative آن و همین طور تاخیر در تکمیل اسناد و مثال های MSDN برای
C++‎/CLI .

3) عدم حمایت از LinQ برای C++‎

4) عدم حمایت از WPF designer برای ++C
و بسیاری موارد دیگر

لذا بهترین انتخاب به پیشنهاد مایکروسافت برای افرادی که می خواهند برنامه های جدید مبتنی بر دات نت بنویسند ، استفاده ازC#‎ ویا VB به جای C++‎/CLI می باشد.

نکته ای در مورد کاربرد C++‎/CLI : همین طور برای کاربران C++‎/CLI، از آنجایی که برنامه های Native می توانند با برنامه نویسی دات نت از طریق CLI ترکیب شوند ، طبق توصیه آنان این افراد بیشترین مزیت را خواهند برد تا در صورتی که امکانی به صورت Native ارائه نشد (از آن جمله نیز WPF یا همان Windows Presentation Foundation) ، بتوانند کد های native خود را با کدهای managed ترکیب کنند و نهایت سود را ببرند .

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