福野泰介の一日一創

ソフトウェアにバグは付き物といいます。
バグとは?バグがないソフトウェアは存在するのでしょうか?

高橋名人による、この BASIC のプログラム、どういう動作をするでしょう?

10 CLS 20 INPUT A 30 PRINT A 40 END

左側にある数はコンピューター内のメモリ内の位置を表し、特に指定がなければ小さいものから順に実行されます。(行番号と呼ぶ)
10 CLS(クリアスクリーンの略)、画面を消します。
20 INPUT(インプット)A、ユーザーからの入力を待ち、エンターが押されたときの数を変数Aに記憶します。
30 PRINT(プリント)A,変数Aを表示します。
40 END(エンド)プログラムを終了します(後ろに何かあっても実行されません)

これだけシンプルなプログラム(ハードウェアに対して、ソフトウェアとも呼ぶ)なら、バグはなさそうですね?
実はそうでもないのです。

20のINPUT、何も入力せずにエンターを押すとどうなるでしょう?
100000と入れるとどうなるでしょう?
Aと入れるとどうなるでしょう?
驚きましたか?想定してしない動作のことをバグと呼びます。

必ず正の数でをいれてほしいときは、下記を追加して、もう一度入力するのも手です。

25 IF A<0 GOTO 20

もっと厳格に、4桁までの数をいれてほしい時、INPUTの代わりにINKEYなどのコマンドを使って、入力部分を自分で作っちゃいましょう。

10 GSB@INPUTA 20 PRINT A 30 END 100 @INPUTA:?"?";:LC POS(1),POS(2),1 110 K=INKEY() 120 IF K>=ASC("0") AND K<=ASC("9") IF POS(1)<5 ?CHR$(K); 130 IF K=8 IF POS(1)>1 ?CHR$(K); 140 IF K!=10 OR POS(1)=1 GOTO 110 150 A=0:FOR I=1 TO POS(1)-1:A=A*10+SCR(I,POS(2))-ASC("0"):NEXT 160 LC POS(1),POS(2),0:?:RTN

130行でバックスペースが効くようにしています。カーソル左右を使えるように改造したり、マイナスの数に対応したり、作りたいものを作れば、バグ(想定外の動作)のないソフトウェアができあがります!

IchigoJam 1.4.1 にバグ疑惑。


行番号をきれいに振り直すコマンド RENUM でコマンドが削られてしまうという指摘。
実は、これはバグではなく仕様、つまり想定している動作です。
行番号の桁数が増えると、プログラムの長さが伸びます。もし1024byteぎりぎりのプログラムだった場合、どうしたらいいでしょう?

1. エラーにして何もしない
2. 溢れた行は消える
3. 行の長さを変えずに処理

IchigoJam 1.4 では、利便性と実装容量のバランスから、3を選んでます。

更に、GSB1 がある状態で RENUM10000 とした場合、無限ループに陥るという報告。


これは 想定外、バグです。ごめんなさい。

足りない分の桁を削っていきますが、コマンドの長さを越えて削られること(GSB1だと4文字で5桁の数が収まらない)を想定していないためのバグです。保存していないプログラムは消えてしまうので大変です。

ということで、IchigoJamのファームウェア、修正版をβ公開します。

IchigoJam 1.4β16
- RENUMで無限ループすることがある不具合修正
- RENUMでGOTO/GOSUB後の先頭にある番号を変更するように変更
- VER()で14100台を返していた不具合を修正

いろいろとテストはしましたが、もしかしたら、まだ想定していないバグがあるかも?ということで、β公開(ベータ、未完成を表す)です。

結論、バグのないソフトウェアは存在します。
ただ、ソフトウェアが複雑になればなるほど、想定外の状態になりやすいので、その実現難易度は上がります。

バグ0を目指すIchigoJam、何かおかしなことがあれば、ぜひご報告ください!

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / アイコン画像 / プロフィール画像 / RSS