medo المدير العام
تاريخ الميلاد : 05/01/1990 تاريخ التسجيل : 15/01/2008 https://s7afa.ahlamontada.com
| موضوع: سي بلس بلس المسقبل إلى أين ؟ السبت أبريل 05, 2008 5:05 pm | |
| سي بلس بلس المسقبل إلى أين ؟كلنا يعرف الدوت نت , وأغلب المطورين يعرفون Visual Studio .NET , وكثير منا سمع عن آخر تحديث للسلسة مصرفات الدوت نت بصدور Visual Studio 2005 نسخة البيتا 1 في شهر July السابق .حصة ال VB.NET وحصة ال C#.NET كبيرة في عائلة الدوت نت , لكن لم يكن الحال كذلك بالنسبة للسي++ حتى VS2005.NET الأخير .فلنتحدث عن الماضي القريب, المشكلة هي أن مايكروسوفت لم تكن تعرف ماذا تفعل عندما أصدرت ال MC++ اختصارا ل Manged ++c , وهي أول Visual c++.NET تصدر , وصدرت مع مصرف ال Visual Stdio.NET الأول عام 2001 . وبعدها بدأ الهرج والمرج , وبدأت اصوات الاحتجاج تعلو شيئا فشيئا بسبب تهميش ال C++ جزئيا بين لغات الدوت نت الجديدة ,, يقال أن مايكروسوفت قد استمعت لهذه الاحتجاجات وأخذتها على محمل الجد , وبعدها مباشرة صرحت مايكروسوفت أن سيكون لها عمل ايجابي حيال ذلك بطرح اللغة الجديدة , لكن لم يكن يعرف أي شيء عنها مطلقا حتى منتصف 2003 تقريبا . المهم في الموضوع أن ماحدث يعود لواحد من سببين : الأول أن مايكروسوفت لم تكن تعرف ماذا تفعل حقا . الثاني أن تكون لعبة لافساح المجال أمام السي# لتنضج أكثر , ولكي تتضح معالم الدوت نت أكثر , والتأكيد على أنها بيئة تطوير سريعة ومثوقة ومنافسة بشدة لل J2ME والجافا , وأن السي# هي البديل الأفضل لأهل الجافا ولمستقبل تطوير البرامج المكتبية والموزعة . وبعد ماتصدرت السي# قائمة لغات التطوير بدأت مايكروسوفت تصرح عن اللغة القادمة ++/CLI لتضع النقاط على الحروف لمستقبل الدوت نت ,, كتابة برامج قواعد بيانات وأنظمة ويندوز مكتبية للمؤسسات أو غيرها وكتابة كود لل ASP.NET وال Web Services بال VB.NET والسي# مناسب جدا . و كتابة أكواد تحتاج للسرعة ويمكن أن تفعل بها كل شيء , حتى كتابة كود لصفحة انترنت ASP.NET و Web Services اتجاها الى كتابة ألعاب كاملة 3D بال Manged DirectX ,, وكتابة برامج لل 64 بت أو حتى أنظمة ال simulation اذا أردت , طبعا بحرية الوصول لدوال ال Win32 API كلها وحتى التي تتوقع تمرير متغيرات من النوع ** أو غيره "والتي لايمكن فعلها بالسي# أوغيرها " الا بواجهة تسيير بكتابة كلاس بواسطة ال C++/CLI "وهي طريقة سريعة ومباشرة" أو بكتابة دالة لملف dll بالسي++ الصرفة . هذا جزء من الموضوع باختصار ,, ودعونا من الكلام النظري , ولنرى عن كثب ماحل بالسي++ : كود بسيط ل Hello World بال C++/CLI ,,
<# CODE | using namespace System; int main() { Console::WriteLine("Hello World"); return 0; }
| الكود قريب جدا من السي++ العادية , لكن تمت اضافة أوامر جديد كليا ودوال وفئات لمنصة الدوت نت للتعامل مع كل شيء تقريبا في الوندوز . مثلا الدالة WriteLine الموجودة داخل الفئة التي اسمها Console بطريقة منطقية تطبع سطرا في الكونسول , وطريقة استخدامها مباشرة جدا , فقط مرر السلسلة وستتم طباعتها بشكل مباشر . لاحظ في الأعلى using namespace System , وبنفس المفهوم في السي++ العادية وقد كنا نستخدم هذا التعبير في السي++ العادي اذا أردنا أن ننظر داخل تجمع namespace معين , وأن نستدعي الفئات والدوال الموجودة داخله بشكل مباشر , دون كتابة البادئة ::System كل مرة اختصار للمجهود . خذ عندك الكود التالي لبرنامج يطبع Hello World أيضا لكن بنفس طريقة السي++ العادية .
<# CODE | #include using namespace std; int main() { cout << "Hello World"; return 0;
| لاحظ أننا استخدمنا المكتبة القياسية iostream عوضا عن iostream.h , السبب أن iostream.h غير موجودة بكل بساطة , وال iostream القياسية تقدم دخل وخرج أفضل من الذي في ال iostream.h . طبعا يجب استخدام ال namespace std لنستطيع استدعاء مافي ال iostream . لكن لاينبغي استعمال دخل خرج ال سي++ كال cout وال cin , لأنه توجد أنواع جديدة في الدوت نت لاتستطيع التعامل معها , خذ عندك كمثال ال Object وال Array . الان فالندخل قليلا ولنرى ماحدث فعلا , خذ الكود طويل قليلا لكن تأمل فيه ستعرف بعض الأمور التي استجدت :
<# CODE |
// This is the main project file for VC++ application project // generated using an Application Wizard. #include "stdafx.h" #include using namespace std; using namespace System; class Native { protected: int Q; static const int h=0; public: Native():Q(10){} void Print(int *z) { Q=*z; Console::WriteLine(Q); } }; class Derive_Native : public Native { public: Derive_Native():Native(){} }; ///////////////////////////////////////////////////////////// ref class REF_CLASS { private: int* R; int ^ Z; public: REF_CLASS() { R = new int; Z = gcnew int; *R=*Z=10; Console::WriteLine("Constructor Of GC HEAP Begines !"); } //Despose() Function .. In IDisposable Interface //!REF_CLASS(){} <---ERROR Now .. But Will be Include in next Updates //Finalizer Not Constructor ... //There Is no Constructor in "ref class" Type ~REF_CLASS() { Console::WriteLine("Tremenate Object"); } }; value class VALUE_CLASS { private: int Q; public: //VALUE_CLASS(){} <-- ERROR ! Still Dont Know Whay ! }; int main() { // TODO: Please replace the sample code below with your own. Console::WriteLine(L"Hello World"); REF_CLASS ^ ref_ = gcnew REF_CLASS; //REF_CLASS % ref; <-- ERROR Native * _native = new Native; Native native; Derive_Native d_native; Derive_Native *_d_Native = new Derive_Native; VALUE_CLASS ^ value_ = gcnew VALUE_CLASS; VALUE_CLASS * _value = new VALUE_CLASS; VALUE_CLASS %value =*_value; VALUE_CLASS %value__ =*value_; VALUE_CLASS &_value_ =*_value; //Native ^ native= gcnew Native; <--- ERROR //REF_CLASS * f; <--- ERROR //REF_CLASS f; <--- ERROR //int q; //cout << q; <--- OK //cout << ref; <--- ERROR //Console::WriteLine(ref_); <--- OK //Stop Screen Console::ReadKey(); //return 0; }
| من الكود أعلاه ستجد بعض الرموز الجديدة التي أضيفت للغة وبشكل سريع : 1) السي++ القديمة كودها سيعمل بدون أي مشاكل مع كود ال C++/CLI بشرط تشغيل مفتاح التصريف أو ال Option وهو clr/ , وهو يخبر المصرف بأن الكود الموجود مخلوط بين كود native وكود CLR . 2) إضافات جديدة على السي++ وهي بمواصفات CLI . 3) أنواع فئات جديدة بالبدائة ref أو البادئة value , والأولى من النوع المرجعي والثانية من النوع القيمي وهي بنفس مفهوم الأنواع القيمية والمرجعية في C# . 4) رموز جديدة لتسهيل فهم الكود وللتعامل المرن مع الذاكرة المدارة في CLR وهي كما في المثالين :
<# CODE |
VALUE_CLASS ^ value_ = gcnew VALUE_CLASS;
|
وأيضا :
<# CODE |
VALUE_CLASS %value =*_value;
| 5) مفاتيح تصريف متعددة وهي : clr/ : وتستخدم لتصريف كود مخلوط mixed بين ال Native Code و Manged Code . clr:pure/ : وتستخدم في حال كان الكود كاملا كود مدار في CLR وميزتها أنها تسرع تنفيذ الكود نظرا لأن صورة الملف التنفيذي الناتجة ستحوي فقط معلومات MSIL وهي MSIL instructions . clr:oldsyntax :وتستخدم لتشغيل وتصريف كود MC++ وهي كما قلنا السي++ التي صدرت مع بداية ظهور VS.NET من 2001 وحتى مصرف VS2003 , لكنها إستبدلت نهائيا بمواصفات C++/CLI , وللتوافقية في تطوير التطبيقات أتيحت الفرصة لتشغيل أكواد MC++ . | |
|