2007年01月22日
川俣晶の縁側PCホビイズムtotal 2888 count

【テスト文書】計算型goto文・複雑な条件判断と分岐をたった1行にまとめられる超効率構文!!

Written By: 川俣 晶連絡先

 PCホビイズムメーリングリストには、既にいくつかの文書を送信しています。

 この文書は、一般性のある読み物なので、オータムマガジンにも掲載しておきます。

 PCホビイズム(メーリングリスト含む)に関しては、PCホビイズム暫定ポータルをご覧ください。

 ちなみに、Cでもこうやればスマートになるとか、他の言語ならこうだ!といった話題で盛り上がれば、PCホビイズム的には大成功です。

以下本文 §

 以下は、PCホビイズムにおける「面白さのお裾分け」の実践テストとして書かれた文書です。

 こういう文章が、日常的に多数のPCホビイストからファンに向けて送られるようになれば、なかなか楽しい日々が過ごせそうですね。

計算型goto文・複雑な条件判断と分岐をたった1行にまとめられる超効率構文!!

概要:

初期の小型BASIC言語等に備わっていた計算型goto文という機能を使うと、僅かなコードで複雑な機能を書けて面白いっす。

対象読者:

プログラミングに興味のある人

書いた人:

川俣晶 (autumn@piedey.co.jp)

● 初期の小型BASIC言語とは

 初期の小型BASIC言語のTiny BASIC等は、基本的に行番号を付けてプログラムを記述します。

 以下は典型的なハローワールドです。

10 print "Hello Wolrd!"

20 end

 プログラムは、行番号の少ない行から多い行に向かって実行されます。

 この流れを変更する機能がgoto文です。

 たとえば、20行目でプログラムを終了させず、処理を10行目に戻すには以下のよう書き直します。

10 print "Hello Wolrd!"

20 goto 10

 このプログラムは、強制的に停止させるまでHello Wolrd!の出力を続けます。

 ここで、goto文が飛ぶ先となる行番号は数式にできます。(小型ではない本格BASICでは定数しか書けない。あくまで小型のBASICのみ)

 つまり、以下のように書いてもOK!

10 a=4

20 goto a*10

30 print "私を飛ばさないで~"

40 print "Hello Wolrd!"

 このプログラムは、変数aに4という値を入れた後、goto文の飛び先としてa*10という式を指定しています。計算の結果、これは40ですから、40行目からプログラムの続きを実行します。つまり30行目を飛ばしてしまいます。

 これが計算型goto文です。

● Cのswitchよりもスマートだよ!

 計算型goto文を使うと、Cのswitchよりもスマートに書けるケースがあります。(Cに似た構文の他の言語であるJavaやC#等でも同様)

 たとえば、「じゃんけんプログラム」を作っているとき、変数aの値が1ならグーの処理を、2ならチョキの処理を、3ならパーの処理を書くとします。

 Cのswitchを使うと以下のようになります。

switch(a)

{

  case 1:

    グーの処理

  case 2:

    チョキの処理

  case 3:

    パーの処理

}

 計算型goto文を使うと以下のように記述できます。

10 goto a*100

100 グーの処理

200 チョキの処理

300 パーの処理

 Cで9行だったものが、計算型goto文を使うとたった4行になってしまいました。

● 込み入った条件を数式で処理

 でも、単純に番号が揃っていない場合には使えないだろう……と考えるのは甘い!

 たとえば、1のときは100行目、2のときは270行目、3のときは310行目……のような不揃いな飛び先でも大丈夫。

 こういう数式もありだからです。

goto (a=1)*-100 + (a=2)*-270 + (a=3)*-310

 ちなみに、条件式は成立しているとき-1に、していないときは0になります。たとえばaが1の時、この式の値が100になることを確かめてみてください。

 別のやり方として、飛び先行番号を配列に入れおくという方法もあります。

@(1)=100

@(2)=270

@(3)=310

goto @(a)

 ここで、@(……)は括弧内の式を添え字として配列にアクセスする構文とします。配列の値を入れるのは最初の1回だけでOKです。あとはgoto @(a)だけ書けば飛びます。

 さて、値が一定の範囲ではないときにはエラーを処理する行に飛ばしたいときも簡単。たとえば、変数aが1~3の場合はa*100に飛ばし、それ以外の場合は900に飛ばす場合は以下のように書けます。

goto (a>=1 and a<=3)*(a*100) + (a<1 or a>3)*900

 実はこの手のテクニックを多用すると、他のプログラム言語で複数の行を要する条件判断を1行で書けることが珍しくありません。つまり、条件のロジックを解析し、それを数式に置き換えることができれば、複数条件の場合分けを1行にまとめられます。

● 計算型goto文の弱点

・計算式が行番号に依存するので、うかつに行番号を変えられない。行を挿入して行番号が詰まってきたときにも、容易に振り直しができない。

・直感的にどのような条件の時、どの行に飛ぶのかが分かりにくい。

 いずれも、生産性を気にするなら、致命的な弱点と言えます。滅んで当然です。

 しかし、極限まで効率を上げたい場合には有効な手法です。低レベルのプログラミングでは、計算型goto文と似た技術が使われることは珍しくありません。たとえば、アセンブラの世界では、計算型goto文に相当する「間接ジャンプ」という機能が常識的に使われています。

● ここが面白いよ、計算型goto文!

 やはり、複雑な条件が1行で書けるといういのが面白いですね。

 10行ぐらいかな……と思ったコードが1行でできてしまうと、書いた本人にも驚きです。

 更に、「この条件判断がソースに見あたらないよ。どこでやってるの?」「この1行だよ!」「えっっっ!?」といった驚きを引き出せればしてやったり……という感じですね。

 下記のワンべぇを作成した理由の1割ぐらいは、計算型goto文を再度実現するためだったのは事実です。

● 補足

 世の中には、サブルーチン呼び出しを行う計算型gosub文も存在しますが、同様のテクニックが使用できます。

● 計算型goto文が今すぐ試せるソフト

(他にあればご一報を)

・ワンべぇ: WONBE, WonderWitch BASIC Environment

WonderWitch用の簡易BASIC言語『ワンべぇ』

http://www.piedey.co.jp/wonbe/

WonderWitch用とWin32用のソースとバイナリを含みます。

手っ取り早く試すには、これに含まれるWin32バイナリーを実行するのが早道かも。

・ワンべぇWM: An Tiny BASIC for Windows Mobile 5.0

Windows Mobile 5.0用超小型BASICインタプリタ

http://www.piedey.co.jp/softs/wonbeWM.html

W-ZERO3があればすぐに動きます。W-ZERO3だけで全ての機能が動作します。

終わり

Facebook

キーワード【 川俣晶の縁側PCホビイズム
【PCホビイズム】の次のコンテンツ
2007年
01月
23日
補足・計算型goto文を持たないCで、複雑な条件判断と分岐をたった1行で行う方法
3days 0 count
total 2289 count
【PCホビイズム】の前のコンテンツ
2007年
01月
18日
PCホビイズム宣言【草案】
3days 0 count
total 2857 count

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

http://mag.autumn.org/tb.aspx/20070122171335
サイトの表紙【PCホビイズム】の表紙【PCホビイズム】のコンテンツ全リスト 【PCホビイズム】の入手全リスト 【PCホビイズム】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.34 (Alpha-Test) Copyright (c) 2004-2018 Pie Dey.Co.,Ltd.