バグとは?バグがないソフトウェアは存在するのでしょうか?
高橋名人による、この 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にバグがありますね。1.4.1です。
— 荒木 宏之 (@h_araki) February 8, 2020
GOTOの分岐先行番号の桁数が増えると、GOTOが削られます。GOSUBも同様。GSBは平気みたい?逆に,桁数が減る場合は、空白が出来ます。(致命的ではないですが)
10 GOTO20
20 GOSUB40
30 GSB40:END
40 RTN
をRENUMすると再現します。#IchigoJam #IchigoJam
行番号をきれいに振り直すコマンド RENUM でコマンドが削られてしまうという指摘。
実は、これはバグではなく仕様、つまり想定している動作です。
行番号の桁数が増えると、プログラムの長さが伸びます。もし1024byteぎりぎりのプログラムだった場合、どうしたらいいでしょう?
1. エラーにして何もしない
2. 溢れた行は消える
3. 行の長さを変えずに処理
IchigoJam 1.4 では、利便性と実装容量のバランスから、3を選んでます。
更に、GSB1 がある状態で RENUM10000 とした場合、無限ループに陥るという報告。
ふと思い立って、元のプログラムの行番号が1桁、RENUMの行番号が5桁、で同じ操作をしてみると…暴走(汗)。ESCキーでは停止できず電源落とすしかない。 pic.twitter.com/3vhxxDxUhR
— ごりぽん (@goripon_tw) February 9, 2020
これは 想定外、バグです。ごめんなさい。
足りない分の桁を削っていきますが、コマンドの長さを越えて削られること(GSB1だと4文字で5桁の数が収まらない)を想定していないためのバグです。保存していないプログラムは消えてしまうので大変です。
ということで、IchigoJamのファームウェア、修正版をβ公開します。
IchigoJam 1.4β16
- RENUMで無限ループすることがある不具合修正
- RENUMでGOTO/GOSUB後の先頭にある番号を変更するように変更
- VER()で14100台を返していた不具合を修正
いろいろとテストはしましたが、もしかしたら、まだ想定していないバグがあるかも?ということで、β公開(ベータ、未完成を表す)です。
結論、バグのないソフトウェアは存在します。
ただ、ソフトウェアが複雑になればなるほど、想定外の状態になりやすいので、その実現難易度は上がります。
バグ0を目指すIchigoJam、何かおかしなことがあれば、ぜひご報告ください!