プログラムを書く時の基本的な考え方(8):構造化プログラミング(その2)
前の記事からの続きです。
③プログラムは3つの制御構造で書ける
第二の要素はプログラムは次の3つの構造で作ることができる、ということです。
1. 連接(逐次)
2. 選択(条件判断、条件分岐)
3. 反復(ループ、繰り返し)
いろいろな学習書・教科書に書いてあるので、ここでは省略しますが、数学的に証明されているらしい。実際、わたしもそうやってプログラム書いてました。
プログラムを書き始めた頃は、処理の制御(処理を別のところに飛ばす)の必要があると、GOTO文というのを使っていたのです。わたしが最初に覚えたプログラミング言語がBASIC(Beginners' All-purpose Symbolic Instruction Code)だったので、すぐに覚えたのがGOTO文です。
④GOTO文は便利だが、使わない
何かの条件でプログラムの制御をすぐ次の文(次に書いてある処理)でなくて、他のところに持って行きたい時がある。そういう時に、
IF 条件なんたらかんたら・・・ GOTO 何行目
みたいに書くのです。BASICはそれぞれの文(Statementという単位)ごとに処理が実行されるので、文ごとに行番号(ナンバー)が書いてある。というか、自分で書くのですが。上の文も実は正確には、
10 IF 条件なんたらかんたら・・・GOTO 何行目
みたいに文の先頭に行番号(ここでは10としました)が付いている。全ての行に番号(常識的に考えれば分かりますが、昇順に並んでます)がついているので、GOTO でその行番号を示せば、そこに制御(次の処理)が移ります。GOTOの飛ばし先は前でも後ろでも大丈夫。
10行目から100行目に飛ぶ
もありだし、
100行目から50行目に飛ぶ(戻る)
もできます。これが100行目から5行目に飛ぶ・・・だったりすると、順番に処理していった結果、再度10行目を処理するということもありえます。
・・・というようなことを、BASICを含め、原初のプログラミング言語たちでは、みんなやっていた。原初のプログラミング言語とは、とりあえず、アセンブラ、FORTRAN、COBOL、BASICだと思ってください。昔、よく使われていたプログラミング言語です。実は他にもありますが、主たるものはこれら4つです。
それで、このGOTO文(GOTO制御)は「害悪」だと言われた・・・(苦笑)
確かにね、害悪にもなりますね。制御が複雑に絡みあうことを許しちゃうから。絡み合った状態を「スパゲッティ(スパゲッティ状態)」と言ってますね。色々な教科書に出てくるから、皆さん、ご存知ですね。スパゲッティはいかんと。美味しいのになぁスパゲッティ。
⑤アセンブラではGOTOするしかない
それでも、アセンブラだと制御方式は基本的にそれしかないから(・・・マクロアセンブラとかは多少なんとかできるかと思いますが、まあここでは無視してください。)アセンブラ使いのプログラマはGOTOがどうしていかんのだと言いたくなりますよね、おそらく(苦笑)。
繰り返しますが、確かによろしくはない。分かりにくくなりがちだからね。分かるように書けばいいのだ・・・という昔堅気のプログラマもいたりするのですが、わたしも崇め奉っている、かの有名な(皆さん、知らんかもしれんけど)カーニハン大先生とか、プローガー大先生とか、リッチー大先生とかが、GOTOは使うな・・・と言うもんだから、GOTO文を使うことを止めたのです。だって、この人たち、わたしの時代のプログラマからすれば神だもの、神のおっしゃることは聞かないといけない。
だんだん、話が雑談めいて来ましたので、改めて姿勢を正して話しますと、そういう訳でGOTO文を使わないプログラムが分かりやすくて良いと。GOTO使わないならどうすれば良いのか・・・という答えが前述した3つの制御構造です。それでプログラムは全部書けちゃうのだよと、大先生たちがおっしゃるので、世界中のプログラムからGOTO文が消えました。実はあるケースでは、あえてGOTO文を使っても良いよ・・・ともおっしゃっているので、そこだけ使うことはしたという事実はあります。ここでは詳細は省きますが。
GOTO文を使わないで3つの制御構造でプログラムを書く。そうすれば自ずとプログラムは分かりやすくなり、メンテナンスもしやすくなり、構造化しやすくなるのだ。これはその通りで、GOTO文でどこか遠くに制御が飛んでしまうようなプログラムは「部品化」できません。
プログラムを書くときに前に似たようなの書いたよな、と思い出すことがあります。それでそのプログラムを引っ張り出してエディタでじっと見る。ああ、ここが使える・・・と思ってそこをコピペするのです。
でもね、GOTO文で制御があっちこっちいってると、これは尋常じゃない。大丈夫かな、ここ切り取ってコピペして・・・という疑問というか不安がいっぱいです。だからGOTO文を使わなくなりました。GOTO文があるとプログラムを「部品」として扱うのが難しくなるのです。
以上、構造化プログラミングはこの2つの要素からなるプログラミング理論です。
構造化プログラミングの目指すところは、「生産性の向上」です。「プログラミングの効率化」と言ってもいい。そのために構造化プログラミングするのです。ここが大事。あとでまた言います。
コメント