ここ数十年,プログラミングの世界で忌み嫌われた命令はgoto文である。goto文はBASICやCOBOLで行番号やLABELにジャンプするために使用する。アセンブラではjmpや比較結果に基づく,jzやjnzで同様にラベルへジャンプする。

 ジャンプする理由はループや条件分岐を作るためである。なぜ忌み嫌われたかというと,わかりにくい処理,複雑に絡み合ったコード,いわゆるスパゲッティ・プログラムが作成できてしまうからだ。

 単純な繰り返しや分岐が目的なら,goto文を使っても,スパゲッティ・プログラムにはならないのだが,goto文は自由度が高すぎるので,変数の値によってあるコードブロックをスキップして,他のコードブロックに飛び,そのブロックを実行後,呼び出したコードブロックの上のブロックに戻るといった複雑すぎるロジックが作れてしまうのだ。

 複雑なロジックを作って,「この方が効率がよい」とうそぶくプログラマは頭のよいフリをしたい人で,プロとして優秀ではない。なぜかと言うと,半年後にそのプログラムを変更したい,機能を追加したいと思ったときに余計な時間が掛かってしまうからだ。

 しかし,逆に言えばスパゲッティにならないなら,ラベルにジャンプしても構わないとも言える。

 上記のプログラムはマインドストームNXTのタッチセンサーを使うNBCのプログラムだ。 SetSensorTouch(IN_1)でポート1のセンサーがタッチセンサーであることを宣言し,OnFwd(OUT_BC,100)でB,Cのモーターを全速(100%)で動かす。ReadSensor(IN_1,Switch)でSwitchにタッチセンサーの値を入れる。タッチセンサーは押されていないときに0,押されているときに1を返す。brtst EQ,CheckSensor,SwitchはSwitchの値を0と比較する。EQ(Equal)だったら,ラベルCheckSensorにジャンプする。つまり,タッチセンサーが押されたら脱出するループを作っているのだ。タッチセンサーが押されたら,Off(OUT_BC)でモーターを止める。

 こんな単純な使い方なら,ジャンプを使っても構わないだろう。