ما هي اللغات المستخدمة في البرامج الحرجة للسلامة؟ [مغلق

StackOverflow https://stackoverflow.com/questions/243387

  •  04-07-2019
  •  | 
  •  

سؤال

أنا أبحث في تطوير البرامج الحرجة للسلامة ، وخاصة الآثار التي يختارها لغة البرمجة على هذا التطور.

يرجى التوضيح ، بالتفصيل ، ما هي اللغات التي تستخدم عادة ، ولماذا.

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

المحلول

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

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

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

ومع ذلك ، يتم جمع هذه اللغات القمامة ومجموعة القمامة شفافة للرمز ، لذلك لا يمكن التفكير بها بهذه الطريقة. لا يمكن التنبؤ باللغات التي تم جمعها القمامة بشكل كافٍ لتطبيقات الوقت الفعلي الصعبة ، على الرغم من وجود مجموعة من الأبحاث المستمرة في جامعي القمامة المتزايدة.

إيفل وذريتها لديها دعم مدمج لتقنية تسمى تصميم حسب العقد التي توفر آلية وقت تشغيل قوية لدمج الشيكات قبل وبعد الثوابات. على الرغم من أن Eiffel لم يتم اكتشافها أبدًا ، فإن تطوير برامج الموثوقية العالية يميل إلى أن تتكون من كتابة الشيكات والمعالجات لأنماط الفشل مقدمًا قبل كتابة الوظيفة بالفعل.

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

على الرغم من أنه يجب فحص رمز إدارة الذاكرة اليدوي بعناية لتجنب الأخطاء ، إلا أنه يسمح بدرجة من التحكم في أوقات الاستجابة للتطبيق غير متوفرة باللغات التي تعتمد عليها مجموعة القمامة. ال مكتبات وقت التشغيل الأساسية من لغات C و C ++ بسيطة نسبيًا وناضجة ومفهومة جيدًا ، لذلك فهي من بين أكثر المنصات ثباتًا متوفرة. معظم أدوات التحليل الثابتة إن لم يكن كلها تدعم أيضًا C و C ++ ، وهناك الكثير هذه الأدوات الأخرى المتاحة لـ C.. هناك ايضا العديد من على نطاق واسع تستخدم C/C ++ على أساس أداة السلاسل; ؛ تأتي معظم سلاسل الأدوات المستخدمة في ADA أيضًا في الإصدارات التي تدعم C و/أو C ++.

الطرق الرسمية مثل الدلالات البديهية (بي دي إف)، Z تدوين أو توصيل العمليات المتسلسلة السماح بالتحقق من منطق البرنامج رياضيًا ، وغالبًا ما يتم استخدامه في تصميم البرامج الحرجة للسلامة حيث يكون التطبيق بسيطًا بما يكفي لتطبيقه (عادةً أنظمة التحكم المضمنة). فمثلا، أحد محاضريي السابقين هل دليل صواب رسمي لنظام الإشارة لشبكة السكك الحديدية الألمانية.

إن القصور الرئيسي في الأساليب الرسمية هو ميلهم إلى النمو بشكل كبير في التعقيد فيما يتعلق بالنظام الأساسي الذي تم إثباته. هذا يعني أن هناك خطرًا كبيرًا من الأخطاء في الدليل ، لذلك تقتصر عملياً على التطبيقات البسيطة إلى حد ما. يتم استخدام الطرق الرسمية على نطاق واسع للتحقق من صحة الأجهزة لأن أخطاء الأجهزة مكلفة للغاية لإصلاحها ، لا سيما على منتجات السوق الكبيرة. منذ خشب Pentium FDIV, ، لقد اكتسبت الطرق الرسمية الكثير من الاهتمام ، وقد تم الاهتمام بها تستخدم للتحقق من صحة FPU على جميع معالجات Intel منذ Pentium Pro.

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

كما لاحظ مختلف الآخرين ، فإن بعض منصات O/S لديها ميزات لتعزيز الموثوقية والسلوك الذي يمكن التنبؤ به ، مثل أجهزة توقيت الوكالة الدولية للطاقة وأوقات الاستجابة المضمونة للمقاطعات. تعد البساطة أيضًا محركًا قويًا للموثوقية ، ويتم الاحتفاظ بالعديد من أنظمة RT عن عمد بسيطة ومدمجة. qnx (الوحيدة من هذا القبيل التي أنا على دراية بها ، بعد أن عملت مرة واحدة مع أ نظام تجديد ملموسة بناءً على ذلك) صغير جدًا ، وسوف يتناسب مع مرنة واحدة. لأسباب مماثلة ، فإن الأشخاص الذين يصنعون OpenBSD - التي تشتهر بأمانها القوي ومراجعة التعليمات البرمجية الشاملة - تخرج عن طريقها أيضًا.

تعديل: هذا النشر لديه بعض الروابط للمقالات الجيدة حول البرامج الحرجة للسلامة ، على وجه الخصوص هنا و هنا. الدعائم إلى س. لوت وآدم ديفيس للمصدر. قصة Therac-25 هو قليلا من العمل الكلاسيكي في هذا المجال.

نصائح أخرى

بالنسبة إلى C ++ ، يعد معيار ترميز Coint Strike (F-35) C ++ قراءة جيدة:

http://www.strostrup.com/jsf-av-rules.pdf

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

أولاً ، تلتزم البرامج الحرجة بالسلامة بنفس المدارس التي ستراها في حقول الهندسة الميكانيكية والكهربائية الكلاسيكية. التكرار ، التسامح مع الأخطاء وسلامة الفشل.

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

علق العديد من الملصقات بالفعل أن نظام التشغيل هو عنصر أساسي في هذا الصدد وهو أكثر صحة للغاية لأنه يجب أن يكون حتميًا (انظر QNX أو VXWorks). هذا يستبعد معظم اللغات المفسرة التي تفعل الأشياء وراء الكواليس بالنسبة لك.

ADA هو احتمال ولكن هناك أدوات ودعم أقل هناك ، والأهم من ذلك أن الأشخاص النجميين ليسوا متاحين بسهولة.

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

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

لقد تطورت في كل شيء من SmallTalk إلى Ruby وأقدر وأستمتع بكل ما تقدمه اللغات العليا. لكن عندما أقوم بتطوير النظم الحرجة ، أعض الرصاصة وألتزم بـ C. في تجربتي (الدفاع والعديد من الأجهزة الطبية من الدرجة الثانية والثالثة) أقل.

سألتقط هاسكل إذا كانت الأمان على كل شيء آخر. أقترح Haskell لأنه يحتوي على فحص ثابت للغاية من النوع الثابت ويعزز البرمجة حيث تقوم ببناء أجزاء بطريقة سهلة الاختبار.

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

اللغة ونظام التشغيل مهمان ، ولكن التصميم كذلك. حاول أن تبقيها عارية ، مميتة بسيطة.

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

دائمًا ما يكون لديك احتياطي عند عدم اكتمال الإجراءات المطلوبة في وقت معقول. كما يقولون في مراقبة الحركة الجوية ، فإن التخليص غير المعترف به ليس خلوصًا.

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

لاحظ صديق لي في مشروع Apollo ذات مرة أنه يعلم أنهم كانوا جادًا عندما قرروا الاعتماد على الاقتراع ، بدلاً من الأحداث ، على الرغم من أن الكمبيوتر كان بطيئًا للغاية.

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

نظام التشغيل هو أكثر أهمية ثم اللغة. استخدم kernel في الوقت الحقيقي مثل VXWorks أو QNX. نظرنا إلى كل من السيطرة على الروبوتات الصناعية وقررنا الذهاب مع VXWorks. نستخدم C للتحكم الفعلي في الروبوت.

بالنسبة للبرامج المهمة حقًا ، مثل أنظمة Autoland AutoRcraft ، فأنت تريد أن تعمل معالجات متعددة بشكل مستقل لتجاوز النتائج.

عادة ما يكون للبيئات في الوقت الحقيقي متطلبات "أمان محترمة". لهذا النوع من الأشياء ، يمكنك النظر إلى vxworks, ، نظام تشغيل شهير في الوقت الحقيقي. إنه قيد الاستخدام حاليًا في العديد من الساحات المتنوعة مثل Boeing Aircraft و BMW Idrive Internals و RAID Controllers ومختلف الفضاء. ((تحقق من ذلك.)

يمكن إجراء تطوير منصة VXWorks مع العديد من الأدوات ، من بينها كسوف, طاولة العمل, نتيجة, ، و اخرين. يتم دعم C ، C ++ ، ADA ، و Fortran (نعم ، فورتران) ، وكذلك البعض الآخر.

نظرًا لأنك لا تعطي منصة ، فأنا يجب أن أقول C/C ++. في معظم المنصات في الوقت الفعلي ، تكون محدودًا نسبيًا في الخيارات على أي حال.

يتم تعويض عيوب ميل C للسماح لك بتصوير نفسك في القدم بعدد الأدوات للتحقق من الشفرة والاستقرار والتعيين المباشر للرمز إلى إمكانات الأجهزة للنظام الأساسي. أيضًا ، لأي شيء حاسم ، لن تتمكن من الاعتماد على برامج الطرف الثالث الذي لم تتم مراجعته على نطاق واسع - وهذا يشمل معظم المكتبات - حتى العديد من تلك المقدمة من بائعي الأجهزة.

نظرًا لأن كل شيء سيكون مسؤوليتك ، فأنت تريد مترجمًا مستقرًا وسلوكًا يمكن التنبؤ به ورسم خرائط وثيقة للأجهزة.

إليك بعض التحديثات لبعض الأدوات التي لم أرها مناقشتها بعد أنني كنت ألعب معها مؤخرًا وهي جيدة إلى حد ما.

البنية التحتية لبرجمة LLVM, ، هناك طلقة قصيرة على صفحتها الرئيسية (تشمل الواجهة الأمامية لـ C و C ++. الواجهة الأمامية لـ Java والمخطط واللغات الأخرى قيد التطوير) ؛

البنية التحتية للمترجم - LLVM هي أيضًا مجموعة من التعليمات البرمجية المصدر التي تنفذ استراتيجية اللغة والتجميع. المكونات الأساسية للبنية التحتية LLVM هي الواجهة الأمامية C&C ++ تستند إلى GCC ، وهي إطار عمل لتحسين وقت الارتباط مع مجموعة متنامية من التحليلات والتحولات العالمية والتحولات ، والخلفية الثابتة لـ X86 ، X86-64 ، PowerPC 32/64 ، ARM ، Thumb ، IA-64 ، Alpha ، Sparc ، MIPS و Cellspu ، وهي نهاية خلفية تنبعث منها رمز C المحمول ، ومترجم في الوقت المناسب لـ X86 ، x86-64 ، PowerPC 32/64 المعالجات ، وباعث ل msil.

VCC;

VCC هي أداة تثبت صحة برامج C المتزامنة المشروحة أو تجد مشاكل فيها. يمتد VCC مع التصميم حسب ميزات العقد ، مثل ما قبل وشرط ما قبل وشرط الكتابة. تتم ترجمة البرامج المشروحة إلى الصيغ المنطقية باستخدام أداة Boogie ، والتي تنقلها إلى SMT Solver Z3 الآلي للتحقق من صلاحيتها.

يستخدم VCC مؤخرًا البنية التحتية للمترجم المشترك.

تم تصميم كل من هذه الأدوات ، LLVM أو VCC لدعم اللغات والبنى المتعددة ، أعتقد أنها زيادة في الترميز حسب العقد وممارسات التحقق الرسمية الأخرى.

WPF (ليس MS Framework :) ، هو مكان جيد للبدء إذا كنت تحاول تقييم بعض الأبحاث والأدوات الحديثة في مساحة التحقق من صحة البرنامج.

WG23 هو المورد الأساسي ولكن الحالي ومحدد إلى حد ما تفاصيل لغة تطوير النظم الحرجة. إنها تغطي كل شيء من ADA و C و C ++ و Java و C#والبرمجة النصية وما إلى ذلك ... ولديها على الأقل مجموعة مرجعية وإرشادات لاتجاه لتحديث المعلومات حول العيوب والضعف الخاصة باللغة.

هناك الكثير من المراجع الجيدة في http://www.dwheeler.com ("برامج التأمين العالي").

للاطلاع على أشياء السيارات ، راجع معيار Misra C. C ولكن لا يمكنك استخدام أكثر من مستويين من المؤشرات ، وبعض الأشياء الأخرى من هذا القبيل.

Adahome.com لديه معلومات جيدة عن ADA. لقد أحببت هذا C ++ إلى ADA البرنامج التعليمي: http://adahome.com/ammo/cpp2ada.html

في الوقت الفعلي الصعب ، قام توم هوكينز ببعض الأشياء المثيرة للاهتمام. راجع: تحسين (تتضمن اللغة SMT Solver للتحقق من ظروف التحقق) والذرة (EDSL للبرمجة المتزامنة في الوقت الفعلي دون استخدام مؤشرات الترابط أو المهام الفعلية).

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

كلما تمكنت من الوثوق بالمكونات القابلة لإعادة الاستخدام ، كلما أسهلت المهمة ، ولكن نادراً ما تكون المكونات القابلة لإعادة الاستخدام معتمدة للاستخدام الحاسم ولن تحصل على عمليات السلامة التنظيمية. يجب عليك استخدام نواة OS صغيرة ثم إنشاء وحدات صغيرة يتم اختبار الوحدة مع إدخال عشوائي. قد تساعد لغة مثل إيفل ، ولكن لا توجد رصاصة فضية.

Any software product can pass the DO-178b certification process using any tool but the questions is how difficult would it be. If the compiler isn't certified you may need to demonstrate your code is traceable at the assembly level. So it is helpful that your compiler is certified. We used C on our projects but had to verify at the assembly level and use a code standard that included turning off the optimizer, limited stack usage, limited interrupt usage, transparent certifiable libraries, etc. ADA isn't pixie dust but it makes the PSAC plan look more achievable.

As applicatons get larger, assembly code becomes less viable choice. The ARM processor just invites C++, but if you ask companies like Kiel it their tool is certified, they will return with a "huh?" And don't forget that verificaton tools also need to be certified. Try verifying a LabView test program.

A new safety-critical standard for Java is currently in development - JSR 302: Safety Critical Java Technology.

The Safety-Critical Java (SCJ) is based on a subset of RTSJ. The goal is to have a framework suitable for the development and analysis of safety critical programs for safety critical certification (DO-178B, Level A and other safety-critical standards).

SCJ for example removes the heap, which is still present in RTSJ, it also defines 3 compliance levels to which both application and VM implementation may conform, the compliance levels are defined to ease certification of variously complex applications.

Resources:

I don't know what language I'd use, but I do know what language I wouldn't:

NOTE ON JAVA SUPPORT. THE SOFTWARE PRODUCT MAY CONTAIN SUPPORT FOR PROGRAMS WRITTEN IN JAVA. JAVA TECHNOLOGY IS NOT FAULT TOLERANT AND IS NOT DESIGNED, MANUFACTURED, OR INTENDED FOR USE OR RESALE AS ON-LINE CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF JAVA TECHNOLOGY COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE.

HAL/S is used for the Space Shuttle.

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