program

人生もプログラムも「川の流れのように」 プログラムの流れ3項

なぜプログラムは流れるのか。それは、コンピュータの頭脳であるCPUが同時に解釈・実行できる命令の数が基本的に1つだけだからである。しかし、プログラムの流れは1種類だけではない。ここではプログラムの流れの種類(順次進行、繰り返し、条件分岐)についてまとめる。

1 プログラムの流れは3種類

  • 順次進行:メモリーに記憶された順序で順番に進む流れ
  • 繰り返し:プログラムの特定の範囲を何度か繰り返す流れ
  • 条件分岐:何らかの条件に応じてプログラムの流れが枝分かれする流れ

特殊なケースとして、突然どこかに流れて行ってしまう「無条件分岐」という流れもある。

 

2 プログラムの流れを図示するフローチャート

フローチャートとはプログラムの流れ(flow)を表す図(chart)で、流れ図ともいう(図1)。フローチャートのメリットは、特定のプログラミング言語に依存しないことである。プログラミング言語は、フローチャートの流れを文書(プログラム)で表現し直したものに過ぎない。つまり、プログラミング言語の種類の違いは方言のようなものである。

フローチャートで覚えるべき図記号は、以下の4つで十分である。

  • ○(だ円):始まりと終わりを表す
  • :処理を表す
  • ひし形:条件分岐を表す
  • |↓:図記号を直線で結んで流れを表す。流れを明確にするときは矢印にする

図1.Wikipedia

 

3 繰り返しのブロックを表す帽子とパンツ

繰り返しのブロックを表す際には以下のような記号を用いる。その形状から矢沢氏は、帽子とパンツとしている(正式名称ではない)。

コンピュータのハードウェア的な動作では、繰り返しは条件に応じて前の処理に戻ることで実現している(ジャンプ命令)。しかし、C言語やJavaなどの高水準言語では、プログラムのかたまりである「ブロック」を使って繰り返しを表す。そのため、帽子とパンツで繰り返し処理を表すことが適しているのである。

図2.masudahp.web

 

4 構造化プログラミング

構造化プログラミングとは、ダイクストラという学者によって提唱されたプログラミング・スタイルである。プログラムの流れを順次進行、条件分岐、繰り返しだけで表し、ジャンプ命令を使わないというものである。

コンピュータのハードウェア的な動作としては、ジャンプ命令を使わなければ条件分岐も繰り返しも実現できない。しかし、VBScriptなどの高水準言語では、条件分岐はIf〜ElseIf〜Else〜End Ifというブロックで表せ、繰り返しはFor〜Nextというブロックで表せる。つまり、プログラミングの世界で「構造化○○」という用語があったら、プログラムの流れをブロックで表し、ジャンプ命令(GoTo命令など)を使わないことを意味している。

例えば構造化例外処理とは、従来のVisual Basicでは、エラーが発生したらエラー処理を行う部分にプログラムの流れをジャンプさせていたが、それをブロックで表せるようにしたものである。プログラムの流れを複雑に絡み合った「スパゲッティ状態」に陥らせないために、ジャンプ命令を避けるのである。

 

5 アルゴリズムとフローチャートで考える

アルゴリズム(algorithm)とは、与えられた問題を解く手順のことである。問題を解くとは、プログラムの流れとして表すことである。

アルゴリズムを考えるポイントは、プログラム全体の流れと、プログラムの部分部分の細かな流れの2段階で考えることである。ここでは全体の流れについて述べる(細かな流れについては次回)。それは「初期化処理」→「繰り返し処理」→「終了処理」という流れである。

ユーザーがプログラムをどのように使うか考える。まずプログラムを起動する(初期化処理)。次にプログラムを必要なだけ使う(繰り返し処理)。最後にプログラムを終了する(終了処理)。以下に、例として「じゃんけんゲーム」と「ワープロ」の流れを挙げる。

 

じゃんけんゲーム

  • 初期化処理:変数と乱数のタネを初期化する
  • 繰り返し処理:ユーザーとコンピュータが5回じゃんけんする
  • 終了処理:ユーザーの勝ち数を表示する

ワープロ

  • 初期化処理:途中まで書いた原稿を読み込む
  • 繰り返し処理:文字の入力を繰り返す
  • 終了処理:原稿を保存する

 

6 割り込み処理という特殊な流れ

特殊なプログラムの流れとして「割り込み(interrupt)処理」と「イベント・ドリブン(event driven)」の2つがある。

割り込み処理とは、プログラムの特定の部分(割り込み処理ルーチン、割り込み処理ハンドラ)に、突然プログラムの流れをジャンプさせることである。CPUが持っているハードウェア的な機能を利用して実現される。電話にたとえられることが多い。

マイコンの回路図において、Z80 CPUにはINT上線とNMI上線というピンがあった。これらはI/Oからの割り込み要求信号を受け付けるものである。ハードウェア的には、CPUに接続されたI/Oからの割り込み要求信号によって割り込み処理が行われる。ハードウェアから要求があったという条件でプログラムの流れが分岐するため、特殊な条件分岐だと言える。

 

7 イベント・ドリブン

イベント・ドリブン(event driven)とは、あるイベント(出来事)の有無と、その通知の内容に応じてプログラムの流れが決定するという、特殊な条件分岐である。WindowsのようなGUI(Graphical User Interface)環境用のプログラムでよく利用される。いわゆる2つのプログラムが対話するものである。

アプリケーションのユーザーが、マウスをクリックしたりキーボードを押すことを「イベント」と呼ぶ。Windowsがイベントを検知し、アプリケーションの持つWndProc( )(処理のブロック)を呼び出すことで、イベントの発生をアプリケーションに知らせる。アプリケーションはイベントの種類に応じて処理を行う、という流れである。

イベント・ドリブンを表すのに便利なものが「状態遷移図」である(図3)。状態遷移とは、複数の状態があって、様々な要因によって別の状態に変わっていく流れのことである。

図3.電卓アプリの状態遷移図

 

最後に

プログラムの流れには、順次進行、繰り返し、条件分岐の3種類があること。その流れを図示するフローチャートがあること。そして、特殊な条件分岐である割り込み処理とイベント・ドリブンについてまとめた。

プログラムの流れの基本は、順次進行である。それは、CPUのPCレジスタの値が自動的に増えていくようになっているからである。条件分岐と繰り返しは、高水準言語ではブロックで表され、ハードウェア的にはPCレジスタにジャンプ先のメモリー・アドレスが設定されることで実現されている。特殊な条件分岐もあるが、まずはこういった流れをしっかりイメージすることが大切である。

次回はアルゴリズムについてまとめる。

コンピュータはなぜ動くのか~知っておきたいハードウエア&ソフトウエアの基礎知識~


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>