私は安全性が重要なソフトウェアの開発、特にプログラミング言語の選択がそのような開発に与える影響について調査しています。
一般的に使用される言語とその理由を詳細に説明してください。
C++については、Joint Strike Fighter(F-35)C++ Coding Standardをお読みください。
Ada は、安全性やミッションクリティカルな政府プロジェクトでまだ使用されていると思います。この言語を使用したことはありませんが、エッフェルとともに「学ぶ」というリストに載っています。エッフェルは、信頼性と安全性を向上させることになっているDesign By Contractを提供しています。
まず、安全性が重要なソフトウェアは、従来の機械工学および電気工学の分野で見られるのと同じ原則を順守します。冗長性、フォールトトレランス、フェールセーフ。
余談ですが、以前のポスターが示唆したように(そして何らかの理由で反対票が投じられました)、これを達成できる最も重要な要素は、チームが進行中のすべてをしっかりと理解することです。言うまでもなく、あなたの側での優れたソフトウェア設計が重要です。しかし、それはまた、多くの共同知識と経験豊富な開発者が利用できる、アクセス可能で、成熟した、十分にサポートされた言語を意味します。
多くのポスターは、OSがこの点で決定的である必要があるため、最も重要な要素であるとすでにコメントしています(QNXまたはVxWorksを参照)。これは、舞台裏で何かを行うほとんどの解釈言語を排除します。
ADAは可能性はありますが、ツールとサポートが少なくなり、さらに重要なことは、恒星の人々がすぐに利用できないことです。
C++は可能ですが、サブセットを厳密に実施する場合のみです。この点で、それは悪魔の道具であり、私たちの生活を楽にすることを約束していますが、多くの場合、やりすぎです。
Cが理想的です。非常に成熟しており、高速で、さまざまなツールとサポートがあり、多くの経験豊富な開発者がクロスプラットフォームで非常に柔軟で、ハードウェアの近くで作業できます。
SmalltalkからRubyに至るまですべてを開発しましたが、高等言語が提供するすべてのものに感謝し、楽しんでいます。私の経験(防衛と多くのクラスIIおよびIIIの医療機器)のほうが少ないです。
それが他のすべてよりも安全であれば、私はhaskellを拾います。 haskellを提案するのは、非常に厳格な静的型チェックを備えており、テストが非常に簡単な方法でパーツを構築するプログラミングを促進するためです。
しかし、その後、私は言語についてあまり気にしません。プロジェクト全体を正常な状態に保ち、期限なしに作業することにより、妥協することなく安全性を大幅に高めることができます。全体として、すべての基本的なプロジェクト管理を実施している。おそらく、すべてが正常に機能することを確認するための広範なテスト、すべてのコーナーケースをカバーするテストなどに集中するでしょう。
言語とOSは重要ですが、デザインも重要です。必要最小限のシンプルなものにしてください。
一貫性のない状態になる可能性を最小限に抑えるために、最小限の状態情報(ランタイムデータ)を取得することから始めます。次に、フォールトトレランスのために冗長性が必要な場合は、一貫性のないデータから確実に回復できる方法があることを確認してください。矛盾から回復する方法のない冗長性は、単にトラブルを求めているだけです。
要求されたアクションが妥当な時間内に完了しない場合のフォールバックを常に用意します。彼らが航空管制で言うように、未承認のクリアランスはクリアランスではありません。
ポーリング方法を恐れないでください。数サイクルを無駄にする場合でも、シンプルで信頼性があります。イベントや通知のみに依存する処理は避けてください。それらは簡単に削除、複製、または誤った順序で並べられる可能性があるためです。ポーリングの補助として、彼らは大丈夫です。
APOLLOプロジェクトの私の友人は、コンピューターが恐ろしく遅いにもかかわらず、イベントではなくポーリングに依存することを決めたときに深刻になっていることを知っていたことをかつて述べました。
追伸私はC++ Air Vehicleの標準を読みました。彼らは大丈夫ですが、多くのクラス、データ、ポインター、および動的メモリ割り当てがあると想定しているようです。それはまさに、絶対に必要な以上のものではないはずです。大きな鎌のあるデータ構造が必要です。
OSは言語よりも重要です。 VxWorksやQNXなどのリアルタイムカーネルを使用します。産業用ロボットの制御について両方を検討し、VxWorksを使用することにしました。実際のロボット制御にはCを使用します。
航空機の自動着陸システムなどの真に重要なソフトウェアの場合、複数のプロセッサを独立して実行して結果をクロスチェックする必要があります。
通常、リアルタイム環境には「安全性が重要」の要件があります。そのようなことについては、人気のあるリアルタイムオペレーティングシステムである VxWorks を見ることができます。現在、ボーイングの航空機、BMW iDriveの内部構造、RAIDコントローラー、さまざまな宇宙船など、さまざまな分野で使用されています。 ( チェックアウト 。)
VxWorksプラットフォームの開発は、いくつかのツールで行うことができます。それらのツールの中で、 Eclipse 、 Workbench 、 [〜#〜] score [〜#〜] など。 C、C++、Ada、およびFortran(はい、Fortran)がサポートされています。
ここでは、まだ議論していない一部のツールの更新をいくつか紹介しますが、最近よく遊んでいますが、かなり良いものです。
LLVMコンパイラインフラストラクチャ 、メインページの短い宣伝文(CおよびC++のフロントエンドを含む。Java、Scheme、およびその他の言語のフロントエンドは開発中です)。
コンパイラインフラストラクチャ-LLVMは、言語とコンパイル戦略を実装するソースコードのコレクションでもあります。 LLVMインフラストラクチャの主要コンポーネントは、GCCベースのC&C++フロントエンド、グローバルおよびプロシージャ間の分析および変換のセットが増えているリンク時最適化フレームワーク、X86、X86-64、PowerPCの静的バックエンドです。 32/64、ARM、Thumb、IA-64、Alpha、SPARC、MIPS、CellSPUアーキテクチャ、ポータブルCコードを出力するバックエンド、およびX86、X86-64、PowerPC 32/64用のJust-In-Timeコンパイラープロセッサ、およびMSILのエミッタ。
VCCは、注釈付きの並行Cプログラムの正確性を証明したり、それらの問題を発見したりするツールです。 VCCは、事前条件と事後条件、およびタイプ不変条件などのコントラクト機能による設計でCを拡張します。注釈付きプログラムは、Boogieツールを使用して論理式に変換され、自動SMTソルバーZ3に渡されて有効性がチェックされます。
VCCは、最近リリースされた Common Compiler Infrastructure を使用します。
これらのツールの両方、LLVMまたはVCCは、複数の言語とアーキテクチャをサポートするように設計されています。これらは、契約およびその他の正式な検証プラクティスによるコーディングの増加だと思います。
[〜#〜] wpf [〜#〜] (MSフレームワークではありません:)、プログラム検証の最近の研究とツールの一部を評価しようとする場合に開始するのに適した場所ですスペース。
WG2 は、かなり最新かつ特定の重要なシステム開発言語の詳細の主要なリソースです。それらは、Ada、C、C++、Java、C#、スクリプティングなどのすべてをカバーし、少なくとも言語固有の欠陥と脆弱性に関する情報を更新するための指示のためのまともなリファレンスとガイダンスのセットを持っています。
プラットフォームを提供しないので、C/C++と言わなければなりません。ほとんどのリアルタイムプラットフォームでは、とにかく選択肢が比較的限られています。
Cが足を踏み入れる傾向があるという欠点は、コードを検証するツールの数と、プラットフォームのハードウェア機能へのコードの安定性と直接マッピングによって相殺されます。また、重要なものについては、広範にレビューされていないサードパーティのソフトウェアに依存することはできません。これには、ほとんどのライブラリが含まれます。
すべてがあなたの責任であるため、安定したコンパイラ、予測可能な動作、およびハードウェアへの密接なマッピングが必要です。
http://www.dwheeler.com (「高保証ソフトウェア」)には多くの優れたリファレンスがあります。
自動車関連のものについては、MISRA C標準を参照してください。 Cが、2レベル以上のポインター、およびそのような他のものを使用することはできません。
adahome.comにはAdaに関する良い情報があります。私はこのC++ to Adaチュートリアルが好きでした: http://adahome.com/Ammo/cpp2ada.html
ハードリアルタイムの場合、Tom HawkinsはHaskellの興味深い機能をいくつか実行しました。参照:ImProve(言語には検証条件を確認するためのSMTソルバーが組み込まれています)およびAtom(実際のスレッドまたはタスクを使用しないハードリアルタイムコンカレントプログラミングのEDSL)。
Javaの新しいsafety-critical standardは現在開発中です- JSR 302:Safety Critical Javaテクノロジー 。
Safety-Critical Java(SCJ)は、RTSJのサブセットに基づいています。目標は、セーフティクリティカル認証(DO-178B、レベルA、およびその他のセーフティクリティカルな規格)のためのセーフティクリティカルプログラムの開発と分析に適したフレームワークを持つことです。
たとえば、SCJはRTSJにまだ存在するヒープを削除し、アプリケーションとVM実装の両方が準拠する可能性がある3つのコンプライアンスレベルも定義します。コンプライアンスレベルは、さまざまな複雑なアプリケーション。
リソース:
どのソフトウェア製品でも、任意のツールを使用してDO-178b認定プロセスに合格できますが、質問はそれがどれほど難しいかです。コンパイラが認定されていない場合、アセンブリレベルでコードが追跡可能であることを示す必要があります。そのため、コンパイラが認定されていると役立ちます。私たちはプロジェクトでCを使用しましたが、アセンブリレベルで検証し、オプティマイザーをオフにする、スタックの使用を制限する、割り込みの使用を制限する、透過的な認証可能なライブラリなどを含むコード標準を使用しなければなりませんでした。 PSAC計画はより達成可能に見えます。
アプリケーションが大きくなると、アセンブリコードの選択肢が少なくなります。 ARMプロセッサはC++を招待しますが、キールのような企業にツールが認定されていると尋ねた場合、「ハァッ」と返されます。また、検証ツールもLabViewテストプログラムを検証してください。
慎重なパターンを課す言語が役立つ場合がありますが、任意の言語、さらにはアセンブラーを使用して慎重なパターンを課すことができます。すべての値に関するすべての仮定には、その仮定をテストするコードが必要です。たとえば、除算する前に常に除数をゼロでテストします。
再利用可能なコンポーネントを信頼できるほど、タスクは簡単になりますが、再利用可能なコンポーネントは重要な使用について認定されることはほとんどなく、規制上の安全プロセスを通過できません。小さなOSカーネルを使用してから、ランダム入力で単体テストされる小さなモジュールを構築する必要があります。エッフェルのような言語が役立つかもしれませんが、特効薬はありません。
HAL/Sはスペースシャトルに使用されます。
使用する言語はわかりませんが、使用しない言語はわかります。
Javaサポートに関する注意。ソフトウェア製品には、Javaで作成されたプログラムのサポートが含まれている場合があります。 JavaテクノロジーISフォールトトレラントではなく、ISは設計、製造、OR使用を意図していませんOR失敗を必要とする危険な環境でのオンライン制御機器-安全性能、核施設、航空機航法OR通信システム、航空交通管制、直接生命維持装置、OR武器システム、Javaの故障など技術は、死亡、人身傷害、OR重度の物理的OR環境損傷に直接つながる可能性があります。