自動改札とロケットとFORTRAN

今日は首都圏全ての自動改札が止まってしまっていました。これはかなりの駅の改札機がブートに失敗してしまうため、入場記録のない人がでれないという混乱を避けるための措置だそうです。(全然関係ないけれどタッチ & ゴー しないでスルスル通れてしまうのは、かなり快適。ETC のような自動改札っていいかもとか思ったり)

で、このトラブルを起こした改札機がどうやら全て同一メーカーのモノらしいというニュースが。私たち組み込み屋としてみれば人ごとではないわけで、今頃開発者は凄いことになって居るんだろうなぁとか、損害賠償されたら大変だとか、そんな話に花が咲きました。

そんな流れの中でソフトウェアのバグが大変なことになった話として、FORTRANNASAのロケットだか探査機だかが海の藻屑にしてしまったという有名な話になりました。この不具合は FORTRAN の文法が如何にいけていないかという事例としても有名です。

FORTRAN のループ構文

DO 10 I = 1, 10

で、

DO 10 I = 1. 10

のように、カンマをピリオドに打ち間違えると、FORTRAN66 は 空白を無視するので、

DO10I = 1.10

という代入文に解釈してしまい、ループが消えてしまうというもの。この不具合で、火星探査機 Mariner 1が大西洋に沈んだという...。

が、これはどうも嘘らしいとです。

このアネクドートの出所はG J. Myersのソフトウェアの信頼性―ソフトウェア・エンジニアリング概説だと記憶しているが、これがどうもガセビアらしいのである。上記のようなミスは確かにあったのだけれど、それが原因でMariner 1を失ったというのは間違いらしい。

http://d.hatena.ne.jp/kmori58/20051208/p3

このバグがあったのは Mercury のほうで、しかも打ち上げ前に発見されたそうな。当然ロケットが落ちたりもしなかったとのこと。おー、落っこちたモンだと思いこんでましたよ。

ちなみに私が最初にこのネタを知ったのは,「エキスパート C プログラミング―知られざる C の深層」だったのだけど

* http://www.amazon.co.jp/exec/obidos/ASIN/4756116396/

この本にはちゃんと正しい内容が書いてあった.さすがだな.えらい.

http://nao.s164.xrea.com/td/2005-12-13.html

私もこのネタを最初に知ったのは エキスパート C プログラミング だったハズだけれど、「なんか NASA の宇宙開発がFORTRAN のせいでやばいことになったらしい」という記憶しかなくて容易に上書きされてしまっていたようです。いい加減だなぁ、私(^^;

ちなみに Mariner 1 は、仕様書のミスで落ちたらしい。数式で平均を表す場合 文字の上にバーを付けるけど、それが脱落してしまったミス仕様書を、そのままプログラマが実装してしまったため、平均を用いるところで実値をつかい結果明後日の方向に飛んでいってしまったのだそうな。(で、爆破された)