2017年10月19日木曜日

メモ:ぬるぽ

 我が国も購入を決定したF-35、開発時の名をJoint Strike Fighterと呼ぶが、この戦闘機のプログラムにはC++が使用されている。その前に開発されたF-22では信頼性を重視して米国防総省が開発したAdaという言語を使っている。
 C言語を使おうとしたことが有る人ならわかると思うが、C言語には「未定義」「実装依存」が多い。またプログラミングの勉強の最初のほうで使うであろうscanfは、少し調べると「危険だから使うな」という話が溢れてくる。

 話は変わるが、アリアン5というロケットの初号機は、ソフトウェアのバグによって打ち上げに失敗している。この時使用された言語はAdaで、浮動小数点数の計算に問題が有った。このロケットは無人であり、比較的高い高度で爆発したために人的被害はなかった。しかしロケット1機の損失コストは膨大なものになる。
 他にも、パトリオットミサイルは内部の時間処理に浮動小数点数を使用しており、時計が約0.3秒ずれたことにより迎撃に失敗、多数の死傷者・負傷者を出す結果となってしまった。

 航空宇宙・防衛産業では少しのプログラムミスが大きな結果となってしまう。プログラムミスが戦闘機で発生した場合、対価は国民の命で支払うことになる。
 そこでF-35ではどうしたか。
 JSF++というC++のコーディングルールを作った。


 と、シリアスムードで書いてみたけど、「軍用規格ってどんなもんぞ」って軽く読んでみただけ。

 JSF C++ コーディング ルール - MATLAB & Simulink - MathWorks 日本

 基本的にはstdio.hやtime.h等は使うな、#if #endif #defineはヘッダの多重インクルード対策以外に使うな、読み間違いしやすい名前は避けろ、とかそういう感じ。あんまり厳しくない。


 1つ面白いのは、「ポインタはnullとの比較、nullの代入はしません。nullの代わりに0を使え」みたいなのが書いてある。
 「組み込み現場のCプログラミング標準コーディングガイドライン」という本によると、「ポインタにはnullを使い、0は使うな」というふうに書いてある。

 NULLマクロを使え、という主張では、Cでは0には様々な意味があり、整数の0、浮動小数点数の0(0.0)、真偽値の0(FALSE)、ポインタの0(NULL)等がある。それらの型が混在している場所では hoge = 0 と書いてあった際に、hogeの型を覚えていない限りは何を目的とした代入かがわからない。
 一方、hoge = FALSEと書いてあればフラグだとわかるし、hoge=NULLと書いてあればポインタだと理解できる。ということで、NULLの使用が推奨されているっぽい。

 一方、JSF++の方では、そもそも#defineマクロの使用が禁止されているので、NULLマクロが使えないという点がある。ただそれは const void * NULL = (void* )0; とか書いてヘッダで共有すればいい話であって、大きな理由ではない気がする。
 JSF++ではコード内で数値をハードコードすることを禁止しているので、int hoge = 0;というのはルール違反となる。そのため、hoge = 0というのは例外なくポインタに対する代入である、ということになるため、「紛らわしいからやめろ」ということにはならない。

 というのが、ちょっと考えて浮かんだ理由なんだけど、本来はどうなんだろうか。元文見ろという話だけど、英文140pの文章はきつい。だれか翻訳してくれ。

 他にもC++になってNULLの意味が変わったとか、いろいろありそう。


 企業で大規模な開発とかするならJSF++その他のルールに対応したテストツールを使うんだろうけど、個人でフリーに使えるJSF++テストツールって有るんだろうか。
 とりあえず「こういうのはやんないほうが良いね~」とか「こうすると良いね~」ってのを頭の片隅にでも入れておけば、何も考えないでやるよりは役に立つんじゃないかな、と思いつつ。

0 件のコメント:

コメントを投稿