サブルーチン

プログラマーからひとこと

これまでいろいろな命令をおぼえてきましたが、そのクライマックスになりそうなのが、これから出てくる「GOSUB」命令です。
ここまでおぼえれば初心者のプログラムはもう最後といっていいかもしれません。

GOSUBゴーサブ
英語としてもわりとヘンですが、もともとの意味は「GO to SUB routineゴー・トゥ・サブ・ルーチン」といって、まあ「サブルーチンに行け」的なことだったみたいです。

サブルーチンといえば、前にもちょっとだけ出てきましたね。
「行って帰ってくる小さなプログラムのブロック」なんて説明もしましたが、おぼえてましたか?
この「行って帰ってくる」をカンタンにするのがGOSUB命令ですが、くわしくはインテリ君の説明にまかせましょう。

GOSUB命令

ワンパク
サブルーチンのハナシはもう終わったんじゃねェのか? ヨウするに「行って帰ってくる小さなプログラムのブロック」がサブルーチンなんだろ?

インテリ
そこまでは合ってるよ。これからおぼえるGOSUB命令は、それをもっとラクにするための命令だね。

神崎
たしかサブルーチンは、こういうものだったよね。
0001#. ’メインルーフ゜
0002#. @MAIN
0003#. PRINT”ココハ メインルーフ゜ テ゛ス”
0004#. GOTO @SUB
0005#. @MAIN2
0006#. GOTO @MAIN
0007#.
0008#. ’サブルーチン
0009#. @SUB
0010#. PRINT”ココハ サフ゛ルーチン テ゛ス”
0011#. GOTO @MAIN2
これだとホントにサブルーチンにするイミのない、グルグル回るだけのプログラムだけど……。

インテリ
うん、でもおさらいとしてはこれでいいんじゃないかな。4行目でサブルーチン@SUBに行って、11行目でメインループの中の@MAIN2に帰るんだね。

ワンパク
コレをカンタンにするのがGOSUB命令だってのか? スデにかなりカンタンな気もするが……

インテリ
まあ見てみようよ。GOSUB命令を使うと、こういうプログラムになるね。
0001#. ’メインルーフ゜
0002#. @MAIN
0003#. PRINT”ココハ メインルーフ゜ テ゛ス”
0004#. GOSUB @SUB
0005#.
0006#. GOTO @MAIN
0007#.
0008#. ’サブルーチン
0009#. @SUB
0010#. PRINT”ココハ サフ゛ルーチン テ゛ス”
0011#. RETURN
4行目でGOSUB命令を使っているのがわかるね。

ワンパク
それだけじゃねェぞ、5行目にあったラベルが消えてんじゃねェか! これじゃサブルーチンから戻ってこれなく……アレ?

神崎
サブルーチンの最後が、GOTO命令じゃなくRETURNになっているね。

インテリ
GOSUB命令は、RETURN命令とセットで使うんだ。
プログラムを見ればだいたい分かるかな? GOSUBのあとにRETURNがあると、GOSUBしたすぐアトまで自動で帰るんだね。

ワンパク
……リクツはワカッたぜ。あんがいカンタンなモンなんだな。

神崎
サブルーチンに行くたびにラベルを付けなくてよくなるのは、たしかにベンリかな。

ワンパク
しかしコレ……サブルーチンって、ホントにやらなきゃダメか? ワザワザGOTOGOSUBで飛ばさなくても、メインループの中でやればいいコトじゃねェか?

インテリ
いいトコロに気が付いたね。ジツはここまでで使ったサブルーチンは、たしかにサブルーチンの良さがちゃんと出てないんだな。
そこで、このプログラムを見てもらおうか。
0001#. ’メインルーフ゜
0002#. @MAIN
0003#. A=1
0004#. GOSUB @SUB
0005#. A=2
0006#. GOSUB @SUB
0007#. GOTO @MAIN
0008#.
0009#. ’サブルーチン
0010#. @SUB
0011#. PRINT A;”カイメ ノ サフ゛ルーチン”
0012#. RETURN
ドコがポイントか、わかるかな?

神崎
サブルーチンに行く前に、変数のナカミを変えているね。それにメインループの中から2回、同じサブルーチンに飛んでいるよ。

ワンパク
それからサブルーチンの中でも変数を使ってるぜ! つまり……サッパリわからねーな!

インテリ
そ、そうなの?
まず同じサブルーチンでも、RETURNで帰る行がちがうというのが1つ目のポイントかな。

神崎
同じRETURNなのに、4行目から飛んできたときは4行目に帰ってきて、6行目から飛んできたときは6行目に帰るんだね。ちゃんとしてるなあ。

ワンパク
タシカにそれと同じコトをGOTOでやるのはメンドクセェな……。アチコチから飛ぶんならGOSUBを使えってコトか。

インテリ
もう1つのポイントは、1コだけのサブルーチンでも、GOSUBする前の変数によってPRINTする字が変わるコトだね。

神崎
PRINTにかぎらず、変数によってやることを変えられるんだね。

インテリ
そういうコトだね。いろいろなプログラムを見てみるとわかるけど、決まった動きを、変数のナカミによって変えながらできるのがサブルーチンの良さだね。

ワンパク
つまりサブルーチンってのは、プログラムのどこから、どんなジョウタイでも、「オイこれやっとけ」って言えば空気を読みながらひととおりのシゴトをこなすってワケだな。

インテリ
どうしたのワンパク君、よくわかってるじゃないか!

ワンパク
いや、リソウのパシリってこんなカンジじゃねえかって考えたら……

インテリ
……

神崎
……


今回のまとめ

GOSUB~RETURN命令
GOSUB @(ラベル)
RETURN
GOSUBで指定したラベルまでジャンプします。その後にRETURNと書いてあれば、GOSUBの直後まで戻ります。