「1つの入口から1つの出口に向かうプログラムであれば、「順次」「選択」「繰り返し」の3つの基本構造とその組み合わせだけで、どのような処理も記述できる」とする構造化定理というものがあります.
ここでふと疑問に思ったのですが,ここで言う「入口」「出口」とはなんのことでしょうか?
改めて考えたときに,私のぼんやりとした入口・出口のイメージではむしろ入口・出口が複数あるコードと言うのが想像できず,また調べてもよく分かりませんでした.
本当は解釈の違いを正すためにもここで私の解釈を説明すべきなのでしょうが,如何せんぼんやりとしていて言語に落とし込めず...
私は主にJavaを書いて来たので,そうしたバックボーンもあるかもしれません.
些細なことでも良いのでご回答いただけますと幸いです.
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
アセンブラだと、入り口が複数というのは、簡単にできますし、昔は珍しくなかったと思います。
(例えば、プログラムサイズの制約がきつい場合には多用することになるかと思います)
明確な、関数とかメソッドという囲まれたものがないと、そういうことになります。
VBとかじゃないオリジナルのBASICだと、このあたりはアセンブラと同様です。
古いCOBOLだと、1つのコンパイル単位の中に、他の言語で言う関数(やメソッド)が書けませんでした。
「ラベルXの文から、ラベルYの文まで実行して戻ってこい」という命令がその代わりになります。
当然、その範囲が重なることもあり得ます。
(ラベルが、A、B、C、D と並んでいたとして、「ラベルAからCまで実行してこい」「ラベルBからDまで実行してこい」の2つの処理があるかも)
また、古いFortranだと、サブルーチン・関数の途中に、別の入り口を作るENTRY 名前(仮引数)
という文もありました。
出口が複数というのは、関数等からの出口が複数あるというのは普通でしょう。
あと、関数というまとまりじゃなくて、構造の話で言うと、ループの出口も複数あったりします。
Cの例ですが、
C
1for(i=0; i<N; i++){ 2 if(x[i]==a) break; 3 ・・・・ 4}
だと、break
による出口と、i<N
じゃなくなった時の出口と、2つの出口があります。
投稿2019/11/25 15:49
総合スコア85893
0
ベストアンサー
この場合の「入り口」「出口」とは、ある実行処理の実行始めの部分と、実行を終了して終わる(抜ける)部分を指します。「構造化定理」をwikipediaであたり、「入口」と「出口」の出処を探ってみると、
構造化定理 - wikipedia日本語版
Structured program theorem - wikipedia 英語版
「入口」に相当する英単語は「entry path」、出口に相当する英単語は「exit path」です。冗長に直訳すれば、それぞれ「入場の為の通り道、「退場の為の通り道」でしょうか。恐らく質問者さんにとっては、相変わらず分かりづらい単語でしょうね。
私自身はCOBOLと言うプログラミング言語に明るくないのでその例を除かせてもらいますが、古くから使われているアセンブリ言語などでは、分岐や繰り返しの構造は、ある「ラベル(≒アドレス)」へのジャンプによって実現しています。また、ある処理を始めるにあたり、呼び出し元によって複数の実行開始位置から実行することができます。これらを「入口」と呼ぶことができるでしょうし、処理を終わって脱出するときも、終了条件を満たしたら即、飛びたいラベルへジャンプするので、これらを「出口」と呼ぶこともできます。また、そんな構造を持つことが可能です。
Javaでは処理の単位は大きくは「メソッド」であり、あるクラスのメソッドからあるクラスのメソッドの「途中」へ飛び込むような無作法はできません。メソッドの途中でreturn
文を書き、ひとつのメソッド中に複数のreturn
文、あるいはエラーによってはthrow
を書くことでその時点で複数の「出口」と言って言えないこともありませんが、そのメソッドを呼び出す上位から見れば、単一の出口です。そんなことからJavaから「複数の入口と出口」を連想するのは、難しいのでしょう。
アセンブリ言語が分かりづらければ、BASICと言うプログラミング言語について軽く調べてみるとイメージがつき易くなるかもしれません。BASICと名がつくプログラミング言語は多いですが、よく目にするVisual Basicではなく、昔ながらの行番号指向のBASICがそれです。GOSUB
と言うサブルーチン(Javaで言うメソッド)への分岐を除いて、基本的に行番号を指定して分岐(ジャンプ)します。無用心にプログラムすると、すぐに複数の入口と出口が頻出する、いわゆる「スパゲティプログラム」と化します。
投稿2019/11/25 14:36
総合スコア9256
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
「構造化定理」は知りませんが、おそらく古い文献などで
みられたのではないでしょうか?
その昔は GO TO 文でコード内をとびまわるような
プログラムがままあったようで、それに対する
指標として提唱されたのが構造化プログラミングですね。
※個人の解釈です。
そういう意味では無秩序なプログラミングに対して
入口や出口という概念を適用してそのような定理を
定義している、というはなしではないでしょうか。
投稿2019/11/25 14:49
総合スコア7460
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
多分具体的な例でないと考えにくいと思うので、いくつか例示します。
例によって独自解釈なので注意してください。
Javaで構造化が完全でない例
Java
1private void method() 2{ 3 while(...) { 4 ... 5 if (cond1) { 6 return 1; // A 7 } 8 if (cond2) { 9 return 2; // B 10 } 11 ... 12 } 13 return 0; // C 14}
出口A,B,Cの3つあり、while{}内に興味がなくて読み飛ばすと、returnは常に0と誤解してしまいます。
Javaで構造化が完全な例
Java
1private void method() 2{ 3 int result = 0; 4 while(...) { 5 ... 6 if (cond1) { 7 result = 1; // A 8 break; 9 } 10 if (cond2) { 11 result = 2; // B 12 break; 13 } 14 ... 15 } 16 return result; // C 17}
出口がCだけになり、while{}内に興味がなければ読み飛ばすことが出来、必ずresultが返ることが分かります。
C言語で非構造化の例
gotoでラベルジャンプできる言語だと、もっと大胆に行ったり戻ったりできるので、制御構造の{}自体が意味をなさなくなります。
C
1void func() { 2start: 3 while (...) { 4 ... 5cont1: 6 if (cond1) { 7 goto start; 8 } 9 if (cond2) { 10 goto error1; 11 } 12 } 13 goto cont2: 14 15error1: 16 ... 17 goto cont1; 18 19cont2: 20 return 0; 21}
こうなってしまうと、全部のコードを読まないと全体の制御構造が分からなくなります。
このため、gotoを多用する非構造化なプログラミングスタイルは忌み嫌われる傾向にあります。
最後に
個人的には例外機構のない言語で、エラー処理のために統一された使い方をされてるラベルジャンプは好きです。ただ現実的には多くの言語で、ラベルジャンプはそんなに見かけないと思います。あえて挙げればCOBOLやDBのストアードプログラムとかで、たまに見る程度、かなぁ。
投稿2019/11/26 05:12
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こんにちは。
入り口はエントリーポイント(≒関数の先頭)、出口はreturn文と考えて概ね合っていると思います。
そして、複数のreturn文は複数の出口と言えると思います。
複数の入り口は分かりにくいですね。普通の関数は入り口は1つしかありませんので。
複数の関数で構成され、それらの関数が呼び出し関係にあるモジュールをここで言う「プログラム」として解釈すれば解りやすいかも知れません。そのモジュールを使う際に呼び出す複数の関数は複数の入り口に該当すると言えるでしょう。
しかし、そもそも構造化の反対の概念は、フローチャートやアセンブラのような処理の流れですから、入り口や出口はいくらでも自由に作れます。
投稿2019/11/25 13:55
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。