الإستعداد لللغة الجديدة C++0x

يبدو أن هناك شُح في تطور لغات الأنظمة، وهي اللغات التي يتم إستخدامها في كتابة كود أنظمة التشغيل، قواعد البيانات، والأجهزة المدمجة. حيث أن لغة سي وسي ++ أصبحتا قديمتين، وآخر تطوير لمواصفات لغة سي ++ كان عام 2003.

قامت شركة قوقل بإنتاج لغة البرمجة Go-Language  في عام 2009 لتنافس السي++ في هذا المجال، لكن الظاهر أنها لم تنجح إلى الآن.

النسخة القادمة من التطوير للغة البرمجة C++ وإسمها C++0x سوف يتم إطلاقها في منتصف عام 2011، وهم في إنتظار إجازتها بواسطة لجنة الـ ISO.

من موجهات لجنة تطوير اللغة الجديدة:

  1.  المحافظة على الإستقرارية والتوافقية الموجودان في C++  و  C حسب الممكن
  2. تفضيل زيادة الميزات الجدية في المكتبة الأساسية Standard Library بدلاً من تضمينها داخل اللغة نفسها
  3. تفضيل الميزات التي سوف تطور مقدرات اللغة
  4. تحسين لغة سي++ لتسهيل تصميم الأنظمة والمكتبات
  5. تحسين الأداء والتعامل المباشر مع العتاد
  6. تقديم حلول جيدة للمشاكل الحقيقية في عالم البرمجة
  7. جعل لغة سي++ سهلة للتدريس والتعليم بدون إزالة الميزات التي يحتاجها المبرمجون المهرة

بعد إجازة هذه اللغة يجب إنتظار دعم المترجمات لها، وقد بدأت بعض المترجمات بدعم جزئيات من مواصفات اللغة الجديدة، إنظر في هذه الصفحة

29 thoughts on “الإستعداد لللغة الجديدة C++0x

  1. كل فترة ابحث عما إذا ظهرت لغة جديدة إلى العالم تستحق الاهتمام أو تملك بنية جديدة تتناسب مع تطورات التقنية، و اقصد بالتناسب هو التناسب الطردي، و لكن للأسف لغات البرمجة يتم تطويرها فقط باتجاه واحد هو زيادة الهكيلية و ليس تغييرات شاملة.
    أذكر اني قرأت كتابا عن لغة MicroProlog في عام 1989 و كان يتحدث بأن هذه اللغة ثورية و متوقع منها أن تكون اللغة الرائدة في عام 2000، طبعا نحن في عام 2011 و مازلنا (كبار و صغار) نكتب بأسلوب اللغات القديمة منذ نشأتها الأولى.

  2. المشكلة في اللغات الجديدة هي أنها تحتاج لوقت كبير حتى تصبح لديها عدد كافي من المكتبات، والمشكلة الأكبر أن معظم الكود الآن مكتوب بلغات قديمة، مثل كود أنظمة التشغيل المكتوبة بلغي سي، فإعادة كتابتها من المهام المستحيلة.
    فالسؤال هو: هل كل مجالات البرمجة تحتاج إلى لغات جديدة؟ مثلاً هل الأنظمة المدمجة مثل DSP, ARM أو حتى المعالجات الصغيرة Micro-controllers تحتاج للغة غير السي

  3. عن نفسى لا يشكل هذا الخبر بالنسبة لى إلا مصدراً لوجع المعدة، فأنا أكره كل ما يمت للغة الـ++C بصلة، اللغة و أدواتها و طريقة التفكير التى تفرضها على المبرمج…. إلخ. و رغم أننى فى العمل أستخدم هذه اللغة إلا أن هذا لم يدفعنى لحبها أو حتى جعل بعض من ذلك الكره يتلاشى، بل على العكس فقد ازداد كرهى لها بمتسلسلة هندسية.
    لقد وضع السيد زاهر يده على الجرح العميق حينما قال أن التطوير فى اللغات الجديدة يكون فى اتجاه زيادة الهيكلية لا التغيرات الشاملة، و الحق أننى (و اعذرونى فى هذا) أعتبر هذا من أخطاء الأجيال الأسبق فى عالم البرمجة: فقد سمحوا لأفكار معينة أن تفرض نفسها على الفكر البرمجى لتشكل (تابو) مرعباً يكون الاقتراب منه محللاً للدماء عند المتعصبين له، تماماً كقضية أن لغة السى بلس بلس لغة فاشلة بكل المقاييس التصميمية، و أن نمط تفكير لغة مثل السى يعتبر بالياً قد عفا عليه الزمن و لابد من تجاوزه حتى يكون المستقبل أقل عناءاً. و كقضية التفرقة المجحفة التى لا معنى لها بين اللغات الخاصة بتصميم برامج سطح المكتب و اللغات الخاصة ببرمجة الأنظمة systems languages و غيرها الكثير من المجالات البرمجية، و كذلك قضية لهجة الحديث الدائمة عن سرعة المنتج النهائى و سهولة البرمجة، و الإنتاجية و قوة إمكانيات اللغة بطريقة (إما- أو)، فيصير من التجديف عند أنصار هذا الفكر أن تطلق لسانك بحرية فى أحد هذه المواضيع و تستهجنه، و قد تعرضت أنا لمثل هذا الموقف حينما نقدت لغة الـ++C علناً أمام أساتذة جامعيين و زملاء لى، فلم ينلنى منهم إلا مصمصة الشفاة و محاولة إفهام هذا الرقيع (أنا بلا فخر ^_^) أبجديات عالم البرمجة (و الحمد لله أنهم لم يستطيعوا إقناعى بالتخلى عن هذه الرقاعة ^_^).
    باختصار نحن نحتاج للغات برمجة جديدة:
    1. تتيح لنا برمجة أكبر مدى ممكن من التطبيقات المختلفة.
    2. تجمع بين السهولة و الإنتاجية العالية و قوة المنتجات النهائية.
    3. تحتوى على مكونات جديدة تحل محل المكونات القديمة التى لا معنى لها على الإطلاق الآن (يكاد قلبى يتوقف حينما أجد أن لغات برمجة شهيرة جداً لا تزال تحتوى على مكونى الدالة function و الإجراء procedure فى ذات الوقت مثل الأوبجتكف باسكال بكل أسف).
    4. لغة جديدة تماماً لا ترقيع للغة قديمة: حتى يكون المصمم حراً تمام الحرية فى تصميمها بما يتناسب مع المرحلة الحالية للعلم البرمجى.
    و أدعوا الله تعالى بأن يرينا اليوم الذى يصير فيه هذا الأمر واقعاً بالفعل…

  4. رد اخي وائل اختصر علي الكثير من الحكي 😛

    > و أدعوا الله تعالى بأن يرينا اليوم الذى يصير فيه هذا الأمر واقعاً بالفعل
    اييييه، انا ادعوا انى يرى أولادي ذلك 😀

    > المشكلة في اللغات الجديدة هي أنها تحتاج لوقت كبير حتى تصبح لديها عدد كافي من المكتبات
    المهم ان يتم أيجادها أولا كمرحلة أولى، أنظر إلى الـ C# في وقت قياسي تم دعمها بالمكتبات

  5. هل تصلح أن تكون لغة سي شارب لغة للأنظمة؟ هل يمكنها عمل أنظمة تشغيل بها؟ هل سرعتها تُقارن بلغة البرامج المُنتجة بلغة سي؟
    من سوف يقوم بتحويل كل الكود المكتوب بلغة سي إلى لغة جديدة عندما يتم إنتاجها.
    من سوف يقوم بتحويل 283 مليون سطر من الكود معظمه بلغة سي في ديبيان لينكس
    من يستطيع تغيير كود الـ GTK+ والـ QT، والـ Carbon، والـ Cocoa
    ولاتنسوا قواعد البيانات التي لايقل عدد اﻷسطر بها عن هذه اﻷرقام التعجيزية.
    هل تصلح لغات البرمجة الجديدة والرفيعة المستوى أن تُستخدم في اﻷنظمة المُدمجة كبديل للغة اﻷسمبلي؟

    أنا لا أتكلم عن إستخدام لغة سي في البرامج المكتبية واﻷلعاب، فتوجد لغات منافسة، لكن أتكلم عن تطبيقات تُقاس سرعتها باﻷجزاء من الثانية كنُظم التشغيل ونُظم اﻹتصالات

    وفي إنتظار اللغة الجديدة المنشودة، ماهو الحل، هل يستخدم الناس لغة سي أم يعتزلوا البرمجة ويتركوا إصدار نُسخ جديدة من الوندوز، اللينكس، والماك وااﻵي فون ، وقواعد البيانات بسبب أن هذه اللغة بها مشاكل ولاتتناسب مع العصر

    كما يُقال “لكل حادث حديث” عندما تأتي لغة جديدة تحل محل لغة سي في أنظمة التشغيل، عندها يمكن أن نتكلم عنها، لكن إلى ذلك الحين ليس هناك مفر في التعامل مع الواقع الحالي

  6. دعنى أخى أبى إياس أجيب عن سؤالك الأخير أولاً، و هو:
    (((وفي إنتظار اللغة الجديدة المنشودة، ماهو الحل، هل يستخدم الناس لغة سي أم يعتزلوا البرمجة ويتركوا إصدار نُسخ جديدة من الوندوز، اللينكس، والماك وااﻵي فون ، وقواعد البيانات بسبب أن هذه اللغة بها مشاكل ولاتتناسب مع العصر)))
    و الإجابة بالطبع هى الاستمرار فى استخدام لغة الـC حتى يأتى البديل المناسب لها، و لكن مع العمل الدؤوب الصادق على إيجاد هذا البديل، فدعوتا:
    1. ترك العلم بالـC مع عدم العمل لإيجاد البديل، و
    2. العمل بالـC و الرضاء بها تمام الرضا
    كلتاهما غير صالحتين للتبنى و العمل بهما.
    أما عن الأكواد الموجودة حالياً فى المشاريع الضخمة مثل التى ضربت بها المثال فلها شأن آخر، فكما تعلم أن المنتجين لهذه البرمجيات معظمهم من المبرمجين المخضرمين الذين احترفوا لغة الـC من فترة طويلة للغاية، فحتى لو ظهرت لغة برمجية جديدة أقوى منها بمراحل و تتلافى كل عيوبها فسيظلون يستخدمونها لأنهم لن يكونوا قادرين على تعلم اللغة الجديدة كما تعلموا القديمة على الإطلاق، فلا السن و لا الوقت يسمحان بهذا، إضافة إلى أن الكثير منهم شارك فى تطوير الـC نفسها و بالتالى صارت جزءاً من كيانه بكل معنى الكلمة، و هؤلاء لهم أن يكملوا كما يريدون مع عدم الحجر على إرادة ورغبة الأجيال الجديدة، أو القول بأن قديمهم أفضل من الجديد و أقوى كنوع من الإرهاب الفكرى كما يحدث فى بعض الأحيان.
    ثم إنه مع الزمن سوف تصبح هذه المنتجات من التقنيات القديمة و سوف نحتاج لتقنيات جديدة تلائم معطيات العصر الجديد، فلماذا لا نبنى تلك التقنيات الحديثة باللغات الجديدة و نترك التطوير فى القديمة؟ و مع الزمن (و هو زمن قليل كما نرى فى عالم البرمجيات) سوف تسيطر التقنيات الحديثة و لغاتها على المجال و تترك لها القديمة الساحة تماماً، أو على الأقل ستسيطر الجديدة على المدى الأكبر منه.
    أما تنحية لغات البرمجة الجديدة للغة التجميع assembly عن عرشها و حلولها محلها فأمر غير معقول، و أنا أظن أن لغة البرمجة عالية المستوى القوية هى التى تتيح لى كتابة كود بلغة التجميع داخلها، فتجمع بين قوة لغة التجميع و الشكل الأرقى لهيكل البرنامج الخاص باللغة عالية المستوى.
    و سرعة لغة الـC فى مقدورنا أن نعطيها للغات الأخرى لو:
    1. التصميم الجيد للغة الجديدة بحيث تأخذ من الميزات فى هذه النقطة أكثر ما تستطيع، و تترك من العيوب أكثر ما تستطيع.
    2. بذل أقصى الجهد فى برمجة مترجم اللغة الجديدة compiler بطريقة تجعله ينتج أكواداً لا تقل فى كفاءتها عن مثيلاتها المكتوبة بالـC مع استخدام كل التحسينات الممكنة.

    و أنا أقول هذا و أنا قد قصرت نفسى على مجال (تصميم و بناء لغات البرمجة) فى الوقت الحالى، و درست كثيراً فيه حتى أصبحت على يقين من أنه بإمكاننا الوصول لكل ما نطمح له فى لغات البرمجة الجديدة.
    و قد كتبت فى منتدى كليتنا كثيراً عن هذا الموضوع فى الموضوع ذى الرابط التالي:
    http://www.engaswan.com/t28073-topic

  7. و بخصوص استخدام لغة الـ#C فى بناء أنظمة التشغيل فهى بالفعل تستخدم فى هذا المجال، و بها يتم بناء عد من الأنظمة مثل:

    1. sharpOS
    2. Cosmos
    3. Singularity

    و عامل السرعة كان سيصبح أفضل لو ركز عليه صمم اللغة قبل الانتهاء من تصميمها كما قلت قبلاً.

  8. مارأيك في لغة Google Go-Language فهي لغة جديدة وهي مصممة للأنظمة، هل درستها؟
    المشكلة أنها مغلقة عن السودان، فلم أستطع تجربتها

  9. كلا، لقد سمعت تسجيليلن مرئيين لمصمميها و هما يتحدثان عنها فى محاضرتين ضمن محاضرات (google tech talks) و لكنى لم أتفرغ لدراستها باحتراف حتى الآن، فلقد انشغلت حتى النخاع فى تعلم اللغات الأقدم أو الأكثر شهرة مثل:
    1. c++
    2. C#
    3. java
    4. ruby
    5. fortran
    6. python
    7. objective pascal
    و بالمناسبة فأنا أكمل مذاكرة اللغة الأخيرة الآن اعتماداً على كتابيك (ابدأ مع أوبجكت باسكال) و (الخطوة الثانية مع أوبجكت باسكال) فلك جزيل الشكر عليهما و جعلهما الله تعالى فى ميزان حسناتك ^_^
    و حسب تخطيطى لدراستى فى الأيام القادمة فإننى ما إن أنتهى بعون الله تعالى من تعلم ada و matlab حتى أعرج على Go.
    أعطانا الله و إياك طول العمر و الصبر ^_^

  10. حاول أخي وائل ان تكتب برنامج بـ #C لمايكرو كونترولر مثلا وقارن بين نفس البرنامج لو كتب بالسي حتي في انظمة التحكم الصناعية السي مهمة جدا لأنها بسيطة اسهل من الاسمبلي ولكنا تظل بسيطة ( علي اعتبار ان العلاقة بين بساطة اللغه وسهولتها علاقه عكسية فالاسمبلي بسيطة لكنها ليست سهله والفيجوال بيزيك سهله لكنها معقدة ) اعتقد في مجال العتاد المدمج ( embedded systems ) ستظل السي لمده طويله هي السائده ( احمد ربنا انك مش اتوميشن ياوائل )

  11. أولاً: الحمد لله أنني لا أعمل في مجال الأوتوميشن ^_^
    ثانياً:
    1. أوافقك على رأيك في العلاقة بين السهولة و البساطة، فاللغة البسيطة ذات التركيبات و المكونات الأولية تكون البرمجة بها صعبة فى المشاريع الصغيرة (و ليست المغرقة فى الصغر)، و مستحيلة فى البرامج الكبيرة، بينما يكون الأمر على خلاف ذلك فى حالة اللغات غير البسيطة.
    2. أوافقك على رأيك عن كون الـC أفضل قي المجالات التي تتعلق بالتعامل مع العتاد الصلب حتى الآن، و من أهم أسباب ذلك الدعم الرهيب الذى حظيت به تلك اللغة من مجتمع المبرمجين القدامى، حيث أنها بذلك الدعم صارت اللغة الأكثر استخداماً فى بناء البنى التحتية للبرمجيات الحاسوبية (المترجمات و المفسرات و أنظمة التشغيل)، و كذلك فهى اللغة التى يمكنك بها إنتاج برامج ﻷى معالج وجد تحت سطح الشمس ^_^ فيوجد لها مترجمات لكل المعالجات و كل الأنظمة المدمجة و هذه نقطة تفوق رهيبة بدون أى شك.
    3. لا أوافقك على القول بأن الـC ستظل لفترة طويلة هي السائدة، لا لشئ سوى أنني بعد طول نظر فى تصميم لغات البرمجة قد وصلت لهذا بنظر العقل، و أننى قد نذرت فكرى و عمري لمشروع ستثبت المرحلة الأولى منه قصور الـC و عدم جدارتها بالحياة حتى الآن، و يثبت أنه بالإمكان إيجاد حلول أفضل بكثير من التي عفا عليها الزمن في المجالات الحاسوبية الأهم.
    و كما قلت لك قبلاً فـ (الجواب ما ترى لا ما تسمع)…. أقصد ما سترى ^_^

  12. > ستظل السي لمده طويله هي السائده
    احم، كان رد الأخ وائل لطيفا، اما أنا فاحب الردود القاسية، سواء بقيت سائدة أملا يدل هذا على قوتها، فكم من الأمور إلى الآن رائدة و سائدة و مع ذلك تصنف عندي من الأمور المتخلفة الغير علمية، من بينها القواعد المحاسبية التي لاتتناسب أبدا مع تطورات العصر، و هي سائدة إلى الآن.

    Garbage collection موجودة في كل اللغات مثل C# و VB.net
    Concurrent programming for multi-core and multi processors أيضا ليست بإضافة على اللغة و هيكلها القواعدي
    عادة غوغل تعتمد على الدعاية أكثر منها على التطوير.

    Garbage collection هو من الأشياء التي لا احبها في اللغة بنفس الوقت هنالك Object يجب إزالتها بمجرد الانتهاء من آخر اسناد لها لمتحول كما تفعل PHP

    مثلا من اهم الاشياء التي اهتم بها هي الوراثة المتعددة، بالشكل الذي اتصوره و ليس بالشكل المطروح.

    في الباسكال التي اعمل بها مثلا المقارنة بين begin end و {} هذه ليس من تغييرات هيكل اللغة مشكل الشكل
    و لكن يمكن اعتبار تعريف متحول ضمن سياق البرنامج و ليس قبل begin هو تغيير في الهيكل

    كما طرح الأخ وائل لماذا هنالك function و procedure لماذا لا يكون ال function الذي لا يرجع قيمة هو عبارة عن procedure
    في ال C لماذا يجب إرجاع قيمة void لانشاء تابع لا يرجع أي قيمة؟

    في لغة ال C هنالك Marcos ماكرو يساعد المترجم و يقوم على توجيهه، و لكنك تجد الكثير من المبرمجين استرسل بكتابة الماكرو لدرجة اصبح معضم البرنامج بمكتوب بها مما يفقد البرنامج أداءه الـ Optimization
    هذه الزيادة في الهيكلة أثرت سلبا على اللغة.

  13. أتفق معك أخى الحبيب زاهر فى كلما قلت ماعدا نقطة كرهك لمجمع النفايات (Garbage collector) فأنا أعتبر وجود مجمع لنفايات فى اللغة من الأمور الغاية فى الأهمية ^_^ ، و النقطة التى نبهت عليها و هى أهمية إنهاء حياة الكائن بمجرد انتفاء الحاجة إليه فى البرنامج يمكن جعلها أفضل و أفضل بالمزيد من التطوير فى مجمعات النفايات.
    (((مثلا من اهم الاشياء التي اهتم بها هي الوراثة المتعددة، بالشكل الذي اتصوره و ليس بالشكل المطروح)))
    و فى هذه النقطة أوافقك تمام الموافقة، و أشد على يديك بحرارة شديدة ^_^ ﻷننى أعتبر الوراثة من أهم الصفات التى يجب على لغات البرمجة الجديدة الاهتمام بها لتحظى بمميزاتها الكبيرة للغاية، و قد أفضت فى الحديث عن هذه النقطة فى منتدى الكلية فى الموضوع الذى وضعت رابطه فى واحدة من مشاركاتى الفائتة.
    (((في لغة ال C هنالك Marcos ماكرو يساعد المترجم و يقوم على توجيهه، و لكنك تجد الكثير من المبرمجين استرسل بكتابة الماكرو لدرجة اصبح معضم البرنامج بمكتوب بها مما يفقد البرنامج أداءه الـ Optimization)))
    و فى هذه النقطة أيضاً أوافقك تماماً، ﻷنى لا أحب أن يتدخل المبرمج فى عمل المترجم بأوامر يوردها فى صلب البرنامج الذى يكتبه، و فوائد الـmacros يمكن جنيها بطرق أخرى ينبغى التنبه إليها عند تصميم لغة جديدة تتلافى هذا العيب.

  14. جامع النفايات (Garbage Collector) من اﻷمور المهمة، فمثلاً في مجال اﻹتصالات تعمل البرامج لمدة شهور عديدة، فإذا كان فيها تسرب في الذاكرة (Memory Leak) يصبح الحجم المحجوز من الذاكرة للبرنامج كبيرة جداً ويتسبب في مشاكل لنظام التشغيل. وقد واجهت هذه المشكلة في أحد البرامج، حيث أن هذا البرنامج يبدأ حجمه بحوالي 18 ميغا، ثم يتضخم مع مرور الوقت ليصل إلى أكثر من 200 ميغا، وكان هناك عدد منها، حوالي عشرة برامج في نفس الجهاز، فإضطررت إلى أن يقوم البرنامج بإعادة تشغيل نفسه عند بلوغه هذه الذاكرة. وحاولت حل المشكلة في خلال ثلاث سنين، وقد إضطررت إلى تحويل الـ TStringList إلى Interface IStringList حتى يتم حذفها مباشرة عندما يتنهي نداء إجراء أو دالة، لأن جامع النفايات في الدلفي يعمل فقط مع الـ Interfaces والمقاطع و المصفوفة المرنة (Dynamic Array). وفي النهاية وجدت أن التسرب يحدث بسبب الـ TMemo التي كنت أكتب فيها كل اﻷحداث، وعند تقليل كتابة اﻷحداث (كتابة الحدث المهم فقط) توقف نمو الذاكرة

  15. من أجل Garbage Collector فعليا أنا عندي بعض الخلط، ربما علي ببعض القراءة، لكنني وصل إلى قناعتي نوعين من الإدارة الأشياء في الذاكر الإدارة اليدوية و التلقائية و التي اصطلح عليها ب (جمع النفايات)، و لكن الأخيرة تحوي عدة طرق تم جمعها تحت هذا الاسم لذلك رفضها جميعا خطأ طبعا.
    الطريق التي استعملتها انت في استخدام الواجهات Interfaces في الباسكال هي الطريقة الوحيدة للتعامل مع ال Interface كـ Object و لكن بميزة التحرير بمجرد الانتهاء منه، انا اسميها (خطأ) و لكنه يعجبني الاسم Managed Objects و هي نفسها الطريقة المستخدمة في الـ PHP.
    بالنسبة لجمع النفاياة أيضا تهتم بالأشياء Objects التي تخلق و يتم تركها في فضاء البرنامج بدون اسناده إلى أي متحول، أي تركه يعمل لوحدة، بعد جامعي النفايات تقوم بتفحص فيما إذا كان هذا الشي قيد الاستخدام (يعمل) أو في حالة سكون ليتم تحريره و يكون ذلك بمعدل زمني، بالنسبة لي هذه النوع مرفوض لي.
    ربما علي بالمزيد من القراءة للوصول إلى التعريفات الصحيحة.

  16. آلية جمع النفايات في اوبجكت باسكال مربوطة بالـ Reference Counter، فإذا كان الـ Object أو المقطع يؤشر له أكثر من مؤشر فإنه لايتم مسحه من الذاكرة، إنما يتم مسحه عندما يُصبح عدد المؤشرات التي تؤشر لنفس الكائن صفرا. وهذا يختلف حسب نطاق التعريف، فإذا كان نطاق تعريف الكائن محلياُ في إجراء أو دالة مثلاً، فإن عمره ينتهي بإنتهاء نداء الإجراء، أما إذا كان مُعرف على مستوي البرنامج ككل، أو داخل فورم، فإن حياته تكون أطول ولايستطيع جامع النفايات حذفه

  17. استعمل الـ Interfaces ذات RefCount في تبادل البارام Params بين عدة كائنات Objects و لا اعرف أي من من الكائنات من هو المسؤول عن تحرير هذا الParam و أيضا استعمله في محرط التقارير عندي.

    و لكن المشكلة في الباسكال انه يجب ان تستخدمة ك Interface و ليس ك Object

    القاعدة ببساطة، بالنسبة للمتحول المشير للكائن من هذا النوع طالما هذا المتحول محجوز في الذاكرة فإن الكائن (المدار) يبقى على قيد الحياة 😛
    اي لا يهم ان نعرف اهو موجود في Form او على مستوى البرنامج أو ضمن Function.
    عند عمل Optimize للCompiler يقوم المترجم بتحرير المتحول بمجرد الوصول لآخر استخدام له، بدون Optimize يقوم بتحرير المتحول في نهاية الاجراء أي عند END او عند {، بمجرد تحرير هذا المتحول يتحرر الكائن المدار (Managed Object) تبعا لعدد RefCount اي عندما يصبح RefCount مساويا للصفر،
    ايضا يتحرر الكائن المدار بتغير اسناد المتحول إلى كائن آخر أو إلى قيمة فارغة Null

    هذا ينطبق تماما على الـ PHP أيضا، على الكائنات مباشرة، و احيانا أقوم بإسناد قيمة Null أو استعمل unset لتدمير الكائن المسند للمتحول يدويا، لانني استخدمه في مكان آخر (استخدامي له مشروط بوجود قيمة في المتحول قبل استخدامه طبعا) لأن المترجم لا يحرره تلقائيا بوجود عملية التفحص تلك، ذلك يوفر عبئا على الذاكرة و يحرر الكثير من الموارد.

    هذه الطرقة جزء من جمع النفايات و ارغب في ان تكون في الPascal على شكل Objects يتم اشتقاقها من Classes مباشرة.

  18. >>بالنسبة للمتحول المشير للكائن من هذا النوع طالما هذا المتحول محجوز في الذاكرة فإن الكائن (المدار) يبقى على قيد الحياة
    >>اي لا يهم ان نعرف اهو موجود في Form او على مستوى البرنامج أو ضمن Function.

    عندما يكون المتحول (المتغير) الذي يشير إلى هذا الكائن (كائن يرث Interface) داخل دالة مثلاً فإن تحرير الكائن يتم عند نهاية الدالة، أما إذا كان مُعرف داخل فورم فإن تحريره يكون بتحرير الفورم، أما إذا كان مُعرف على مستوى البرنامج، فإنه يتم تحويله عند غلق البرنامج. أي أن هناك فرق حسب نطاق تعريف المتحول

  19. للتجربة قمت بكتابة هذا الكود:


    program GarbTest;

    {$mode objfpc}{$H+}

    uses
    {$IFDEF UNIX}{$IFDEF UseCThreads}
    cthreads,
    {$ENDIF}{$ENDIF}
    Classes
    { you can add units after this };

    type
    ICar = interface(IInterface)
    function GetCarModel: string;
    end;

    { TSedan }

    TSedan = class(TInterfacedObject, ICar)
    private
    fModel: string;
    public
    constructor Create(AModel: string);
    destructor Destroy; override;

    function GetCarModel: string;
    end;

    { TSedan }

    var
    Global: ICar;

    constructor TSedan.Create(AModel: string);
    begin
    fModel:= AModel;
    end;

    destructor TSedan.Destroy;
    begin
    Writeln(fModel, ' destroyed');
    inherited Destroy;
    end;

    function TSedan.GetCarModel: string;
    begin
    Result:= fModel;
    end;

    {$R *.res}

    function MyFunction: Boolean;
    var
    ACar: ICar;
    begin
    ACar:= TSedan.Create('Corolla 2006');
    // Global:= ACar;
    Writeln('I''m inside the function');
    end;

    var
    MyCar: ICar;
    begin
    MyCar:= TSedan.Create('Sonata 2001');
    Writeln('Car model: ' + MyCar.GetCarModel);
    MyFunction;
    Readln;
    end.

    عندما قمت بتغيير الـ Optimization إلى Level 3، لم يكن هناك فرق، دائماً يحدث التحرير بعد نهاية نداء الدالة، وليس بعد الإنتهاء من إستخدام المتغير ACar

  20. طيب 😛
    كلامك صحيح و لكنه من زاوية مختلفة، لا يجب أن تذكر Form قل Object أي إذا كان المتحول ضمن Object آخر أو ضمن حتى Record فإن هذا المتحول سوف يتحرر بمجرد أن يتحرر الكائن الذي يحويه

    انظر للمتحول متى يتحرر، يتحرر الكائن المشار إليه عند وصول إلى RefCount = 0

    المتحول فعليا مؤشر من نوع pointer محجوز في الذاكرة مشيرا إلى كائن، متى تمت إزالته (أو إسناد قيمة أخرى) سيتم تخفيض الـ RefCount عندما يصل RefCount للصفر يتحرر الكائن

    هذه هي القاعدة سأنظر في المثال الآن

  21. مثالك ممتاز 😛 سوف استخدمه عند مناقشة الآخرين به 😛
    غريب 😮
    عند وضع Optimization إلى Level 3 يجب ان يتحرر الكائن قبل رسالة I’m inside the function
    الكلام ينطبق حتى على المتحولات العادية من نوع string مثلا، عند ال Debug لا يجب ان تستطيع قراءة القيمة بعد اخر استخدام له في التابع؟!!!!

    سبق و أني قمت بهذه التجارب على الدلفي و الباسكال و ال PHP !!!

  22. إذا كان البرنامج يحتوي على إجراءات ودوال قصيرة أو ليس فيها إنتظار فليس هناك فرق في مسح الكائنات داخل اﻷجراء أو بعد نهايته

  23. هذا صحيح تماما و في مناقشة اخرى قيل ذلك، ان على المبرمج المحترف ان يقوم بتقسيم البرنامج إلى توابع صغيرة لذلك هذه القاعدة لا تعتبر ذات أهمية لهم، و لكن حسب قناعتي القاعدة تبقى قاعدة.

  24. بارك الله في المشاركين ، والمعلقين على الأخلاق العالية ، والردود الطيّبة التي تظهر خلفية طيبة ، وجيدة جداً عن البرمجة بأنواعها ، وبمختلف اللغات .
    أتمنى المشاركة في ترجمة هذا الملف في الويكي عن اللغة الرائعة الجديدة :

    http://en.wikipedia.org/wiki/C%2B%2B0x

  25. مرحباً بك أخي الكريم
    الموضوع المكتوب في ويكبيديا ليس مقالة عادية، إنما هو بحث أو ورقة عمل معدة بطريقة علمية دقيقة، تحتاج لمن لديه الخبرة في لغة سي++ ليقوم بترجمتها

أضف تعليقاً

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s