سؤال

أعلم أن GC لم يكن شائعا في الأيام التي تم فيها تطوير ADA وحالة الاستخدام الرئيسي للبرمجة المضمنة، فلا تزال غير خيار جيد.

ولكن بالنظر إلى أن ADA هي لغة برمجة غرض عام لماذا لم تكن جزئية واختيارية (تتبع فقط كائنات الذاكرة الموسومة فقط بشكل صريح) تم تقديمه في التنقيحات اللاحقة للغة وتنفيذات التحويل البرمجي.

أنا ببساطة لا أستطيع التفكير في تطوير تطبيق سطح المكتب العادي دون جامع القمامة بعد الآن.

هل كانت مفيدة؟

المحلول

تم تصميم ADA مع تطبيقات عسكرية في الاعتبار. واحدة من الأولويات الكبيرة في تصميمها كانت الحتمية. أي واحد أراد أحد برنامج ADA أن يؤدي باستمرار بنفس الطريقة بالضبط في كل مرة، في أي بيئة، تحت جميع أنظمة التشغيل ... هذا الشيء كيندا.

يقوم جامع القمامة بتشغيل تطبيق واحد إلى اثنين، والعمل ضد بعضهم البعض. تقوم برامج Java بتطوير الفواق على فترات عشوائية عندما تقرر GC الذهاب إلى العمل، وإذا كانت بطيئة للغاية في ذلك، فهناك فرصة لنفيد التطبيق من كومة الأحيانات وليس غيرها.

المبسطة: يعرض جامع القمامة بعض التباين في برنامج لم يرغب المصممون. أنت تجعل الفوضى - أنت تنظيفها! نفس الرمز، نفس السلوك في كل مرة.

ليس أن ADA أصبح نجاحا في جميع أنحاء العالم مستعرة، مانع لك.

نصائح أخرى

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

أعتقد أن السبب لم يعد هناك مثل هذا إخلاء المسئولية مع جافا لأن الأجهزة الأساسية أصبحت أسرع بكثير وكذلك حقيقة أن جافا لديها خوارزميات GC أفضل وتحكم أفضل في GC.

تذكر أن ADA تم تطويرها في 1970 و 1980 في وقت كانت فيه أجهزة الكمبيوتر أقل قوة بكثير مما هي عليه اليوم، وكانت قضايا توقيت التطبيقات في تطبيقات التحكم بأقل أهمية.

الجواب أكثر تعقيدا: لا يتطلب ADA جامع القمامة، بسبب القيود في الوقت الحقيقي ومثل هذا. ومع ذلك، فقد تم تصميم اللغة بذكاء لسماح بتنفيذ مجمع القمامة.

على الرغم من أن العديد من المجمعين (الكل تقريبا) لا تشمل جامع القمامة، فهناك بعض التنفيذ البارز:

  • رقعة لغنات
  • محطات التحويل البرمجيات ADA التي تستهدف الجهاز الظاهري Java (لا أعرف ما إذا كانت هذه المشاريع لا تزال مدعومة). استخدم مجمع القمامة من JVM.

هناك الكثير من المصادر الأخرى حول مجموعة القمامة في ADA حول الويب. تمت مناقشة هذا الموضوع في الطول، ويرجع ذلك أساسا إلى المنافسة الشرسة مع جافا في منتصف التسعينيات (إلقاء نظرة على هذه الصفحة: "Ada 95 is what the Java language should have been")، عندما كانت جافا "الشيء الكبير التالي" قبل أن ترجع Microsoft C #.

أولا، لا يوجد شيء في اللغة حقا يحظر جمع القمامة.

ثانيا بعض التطبيقات هل أداء جمع القمامة. وبعد على وجه الخصوص، جميع التطبيقات التي تستهدف جمع القمامة JVM.

ثالثا، هناك طريقة للحصول على بعض كمية مجموعة القمامة مع جميع المحامرة. ترى، عند الوصول اكتب يخرج من النطاق، إذا أخبرت هذه اللغة خصيصا أن تضع جانبا مساحة إضافية من الفضاء لتخزين كائناتها، فسيتم تدمير تلك المساحة في تلك المرحلة. لقد استخدمت هذا في الماضي للحصول على بعض المواطن من جمع القمامة. الإعلان Voodo الذي تستخدمه هو:

type Foo is access Blah;
for Foo'storage_size use 100_000_000; --// 100K

إذا قمت بذلك، فلن يتم تنظيف الذاكرة (100 كيلو بايت) المخصص لكائنات BLAH المدورة إلى مؤشرات فو عند الخروج من نوع FOO من النطاق. نظرا لأن ADA يتيح لك عش الروتين الفرعي داخل الروتين الفرعي الأخرى، فهذا قوي بشكل خاص.

لمعرفة المزيد حول ما يمكن أن تفعله مسابح التخزين والتخزين من أجلك، انظر LRM 13.11.

رابعا، لا تميل برامج ADA المكتوبة بشكل جيد إلى الاعتماد على تخصيص الذاكرة الديناميكي تقريبا بقدر ما تفعل برامج C. كان C عددا من ثقوب التصميم التي تعلمها الممارسون استخدام المؤشرات للطلاء. الكثير من تلك التعابير ليست nescary في ada.

أولا، أود أن أعرف من يستخدم ADA هذه الأيام. أنا في الواقع أحب اللغة، وهناك حتى مكتبة واجهة المستخدم الرسومية لنظام التشغيل Linux / ADA، لكنني لم أسمع أي شيء عن تطوير ADA النشط لسنوات. بفضل روابطها العسكرية، أنا لست متأكدا حقا ما إذا كان التاريخ القديم أو نحو ذلك ناجح بشكل كبير في أن يتم تصنيف كل ذكر استخدامها.

أعتقد أن هناك بضعة أسباب لا GC في ADA. أولا، وقبل كل شيء، تعود إلى حقبة حيث تستخدم معظم اللغات التي تم تجميعها في المقام الأول على المكدس أو الذاكرة الثابتة، أو في حالات قليلة، تخصيص الكومة الصريحة / الحرة. GC كفلسفة عامة أقلت حقا حوالي عام 1990 أو نحو ذلك، عندما OOP، تحسين خوارزميات ومعالجات إدارة الذاكرة قوية بما يكفي لتجنيب الدورات لتشغيل كل شيء. ما ببساطة تجميع ADA يمكن أن يفعله إلى المركز الدولي IBM 4331 في عام 1989 كان بلا رحمة. الآن لدي هاتف محمول يمكن أن يتفوق على وحدة المعالجة المركزية في الآلة.

سبب وجيه آخر هو أن هناك أشخاص يعتقدون أن تصميم البرنامج الصارم يشمل سيطرة دقيقة على موارد الذاكرة، وأنه لا ينبغي أن يكون هناك أي تسامح لترك الكائنات المكتسبة ديناميكيا تعويم. للأسف، انتهى الكثير من الناس حتى الذاكرة المتسربة لأن الذاكرة الديناميكية أصبحت أكثر وأكثر القاعدة. بالإضافة إلى ذلك، مثل "كفاءة" لغة التجميع على اللغات الرفيعة المستوى، و "كفاءة" JDBC RAW على أنظمة Orm، فإن "كفاءة" إدارة الذاكرة اليدوية تميل إلى قلبها لأنها تودع (رأيت معايير Orm حيث كان المكافئ JDBC نصف كفاءة فقط). عكسية بديهية، وأنا أعلم، لكن أنظمة الأيام هذه أفضل بكثير في تحسين التطبيقات الكبيرة، بالإضافة إلى أنها قادرة على جعل إعادة التحسينات الراديكالية استجابة للتغيرات الطفيفة السطحة. لفظايا إعادة التوازن بشكل حيوي على الطاير على أساس الكشف عنها حمل.

أخشى أنني سأضطر إلى الاختلاف مع أولئك الذين يقولون أن الأنظمة في الوقت الفعلي لا تستطيع تحمل تكلفة ذاكرة GC. لم يعد GC شيئا يتجمد النظام بأكمله كل بضع دقائق. لدينا طرق أكثر ذكاء بكثير لاستعادة الذاكرة هذه الأيام.

اعتقدت أنني سأشارك مثالا بسيطا حقا حول كيفية تنفيذ إجراء مجاني () (الذي سيتم استخدامه بطريقة مألوفة لجميع مبرمجي C) ...

with Ada.Integer_Text_IO, Ada.Unchecked_Deallocation;
use Ada.Integer_Text_IO;

procedure Leak is
   type Int_Ptr is access Integer;
   procedure Free is new Ada.Unchecked_Deallocation (Integer, Int_Ptr);

   Ptr : Int_Ptr := null;
begin
   Ptr := new Integer'(123);
   Free (Ptr);
end Leak;

سيعود الاتصال المجاني في نهاية البرنامج عددا صحيحا مخصصا إلى مسبح التخزين ("كومة" في لغة C). يمكنك استخدام Valgrind لإظهار أن هذا يفعل في الواقع يمنع 4 بايت من الذاكرة التي يتم تسريبها.

يمكن استخدام Ada.unchecked_deallocation (إجراء محدد بشكل عام) على (أعتقد) أي نوع قد يتم تخصيصه باستخدام الكلمة الأساسية "الجديدة". يحتوي دليل مراجع ADA ("13.11.2 وكالة التخزين التي لم يتم التحقق منها") مزيدا من التفاصيل.

سؤالك غير صحيح. نعم هو كذلك. انظر الحزمة ADA.FIALIZES التي تعالج GC لك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top