[BASICのはじめ方] Part14: GOSUBとRETURNによるサブルーチン

BASIC

はじめに:サブルーチンとは? 🤔

プログラムを書いていると、同じような処理を何度も繰り返したい場面が出てきます。例えば、特定の計算をしたり、定型文を表示したりする場合です。そんなとき、同じコードを何度も書くのは大変ですし、間違いやすくなりますよね。

ここで役立つのが「サブルーチン」という考え方です。サブルーチンは、特定の処理をひとまとめにしたプログラムの部品のようなものです。必要な時にこの部品を呼び出すことで、コードをスッキリさせ、再利用しやすくします。

古いスタイルのBASICでは、GOSUBRETURN という命令を使ってサブルーチンを実現していました。このセクションでは、その使い方を学びましょう!

GOSUB と RETURN の仕組み ⚙️

GOSUBRETURN はセットで使います。

  • GOSUB [行番号またはラベル名]: プログラムの実行を、指定された行番号またはラベル名の場所へジャンプさせます。重要なのは、ジャンプする直前の場所(GOSUB 命令の次の行)を覚えておくことです。
  • RETURN: GOSUB でジャンプしてきた場所へ、プログラムの実行を戻します。つまり、覚えておいた場所(GOSUB の次の行)から処理を再開します。

これにより、「ちょっと別の処理(サブルーチン)を実行して、終わったら元の場所に戻ってくる」という流れが実現できます。

基本的な使い方と例

言葉だけでは分かりにくいので、簡単な例を見てみましょう。

' メインプログラム
PRINT "プログラムを開始します。"
GOSUB 100 ' 100行目のサブルーチンを呼び出す
PRINT "サブルーチンから戻りました。"
GOSUB 100 ' もう一度サブルーチンを呼び出す
PRINT "再びサブルーチンから戻りました。"
END       ' プログラム終了

' サブルーチン本体
100 PRINT "  これはサブルーチンの中です!" ' サブルーチンの処理
RETURN    ' 呼び出し元に戻る
実行結果のイメージ:
プログラムを開始します。
  これはサブルーチンの中です!
サブルーチンから戻りました。
  これはサブルーチンの中です!
再びサブルーチンから戻りました。

コードの解説:

  1. 最初のPRINT文が実行されます。
  2. GOSUB 100 に到達すると、プログラムは100行目にジャンプします。この時、「次に実行すべきは GOSUB 100 の次の行(PRINT "サブルーチンから戻りました。")だ」という情報が記憶されます。
  3. 100行目のPRINT文が実行され、サブルーチン内のメッセージが表示されます。
  4. RETURN 命令に到達すると、記憶されていた情報に基づいて、GOSUB 100 の次の行(PRINT "サブルーチンから戻りました。")に戻ります。
  5. PRINT "サブルーチンから戻りました。" が実行されます。
  6. 再び GOSUB 100 が実行され、同じように100行目にジャンプし、処理後に RETURN で戻ってきます。
  7. 最後の PRINT 文が実行され、END でプログラムが終了します。

このように、GOSUB を使うことで、100行目からの処理を何度も呼び出すことができました。👍

注意: BASICの方言によっては、行番号の代わりに「ラベル」を使うこともできます。ラベルは、行の先頭に付ける名前のことです(例: MySubroutine:)。

' ラベルを使った例 (FreeBASICなど)
PRINT "プログラムを開始します。"
GOSUB MySubroutine
PRINT "サブルーチンから戻りました。"
END

MySubroutine:
  PRINT "  これはサブルーチンの中です!"
RETURN

ネスト(入れ子)呼び出し nesting calls 🔄

サブルーチンの中から、さらに別のサブルーチンを GOSUB で呼び出すことも可能です。これを「ネスト」または「入れ子」呼び出しと呼びます。

PRINT "メインプログラム開始"
GOSUB SubA ' サブルーチンAを呼び出す
PRINT "メインプログラム終了"
END

SubA:
  PRINT "  サブルーチンAに入りました"
  GOSUB SubB ' サブルーチンAの中からサブルーチンBを呼び出す
  PRINT "  サブルーチンBから戻りました"
RETURN ' メインプログラムへ戻る

SubB:
  PRINT "    サブルーチンBに入りました"
  PRINT "    サブルーチンBの処理を実行中..."
RETURN ' サブルーチンAへ戻る
実行結果のイメージ:
メインプログラム開始
  サブルーチンAに入りました
    サブルーチンBに入りました
    サブルーチンBの処理を実行中...
  サブルーチンBから戻りました
メインプログラム終了

RETURN 命令は、直前に実行された GOSUB の呼び出し元に正しく戻ります。これにより、複雑な処理も段階的に構成できます。

GOSUB/RETURN の利点と注意点 ✨⚠️

利点 (Advantages)

  • コードの再利用: 同じ処理を何度も書く必要がなくなります。
  • 整理整頓: プログラムを機能ごとに部品化し、見通しを良くすることができます(GOTO の多用よりは構造的です)。
  • シンプルさ: 概念が比較的単純で、古いBASIC環境でも広く使えます。

注意点 (Cautions)

  • 変数のスコープ: GOSUB で呼び出されるサブルーチンは、メインプログラムと同じ変数空間を共有します(変数は基本的にすべてグローバル変数)。サブルーチン内で変数を変更すると、意図せずメインプログラムや他のサブルーチンに影響を与える可能性があります。😥
  • スパゲッティコードの危険性: GOSUB を無計画に多用すると、プログラムの流れが追いづらくなる「スパゲッティコード」になる可能性があります。
  • 引数と戻り値がない: サブルーチンに値を渡したり、サブルーチンから結果を受け取ったりする標準的な仕組みがありません(通常はグローバル変数を介して行います)。

GOSUBRETURN は、プログラムを構造化するための第一歩として重要ですが、上記のような注意点もあります。現代的なプログラミングでは、より洗練されたサブルーチンの仕組み(次のステップで学ぶ FUNCTIONSUB など)が推奨されることが多いです。

まとめ 📝

今回は、GOSUBRETURN を使った基本的なサブルーチンの作成方法を学びました。

  • GOSUB は指定した行(またはラベル)へジャンプし、戻る場所を記憶します。
  • RETURN は記憶された場所へ戻ります。
  • これらを使うことで、コードの再利用性が高まり、プログラムを整理しやすくなります。
  • ただし、変数の管理やコードの複雑化には注意が必要です。

まずは簡単なプログラムで GOSUBRETURN を使ってみて、その動作に慣れていきましょう! 😊 次のステップでは、より現代的で強力なサブルーチンの書き方である FUNCTIONSUB について学んでいきます。

コメント

タイトルとURLをコピーしました