...

プログラミング初心者が陥りやすい 逐次処理概念習得

by user

on
Category: Documents
14

views

Report

Comments

Transcript

プログラミング初心者が陥りやすい 逐次処理概念習得
プログラミング初心者が陥りやすい
逐次処理概念習得の落とし穴
―Basic 言語向け処理手順視覚化支援プログラムの開発―
青
木
武
典
Pitfalls Which Prevent Programming Beginners from Understanding the Concept
of Sequential Processing: Development of a Visualization Tool
for the Basic Programming Language
Takenori Aoki
要約
プログラミング初心者が Basic 言語や C 言語に代表される手続き型プログラム言語を習得しよ
うとするとき,実質的には処理過程がほとんどブラックボックスであるコンピュータ内部での処
理手順を具体的なイメージとして捉えるには何が必要か。人間同士のコミュニケーションでは許
容される曖昧さが許されないコンピュータという機械を相手に,機械に行わせたい指示を正確に
伝えるには何が必要か等を考察しながら,コンピュータ・プログラムが行っている処理手順を視
覚的なイメージとして捉える方法を考察した。
この考察にもとづき,Basic 言語を習得しようとしている初心者向けに,自分の作ったプログラ
ムがコンピュータ内部でどのような順序で実行されていくのかを比較的手軽に視覚的に把握でき
るような処理手順視覚化支援プログラムを開発したので,
その機能と利用方法について報告する。
キーワード:プログラミング,Basic 言語,初心者,視覚化,学習支援
1.はじめに
情報処理学会による「日本の情報教育・情報処理教育に関する提言 2005」1)では,情報教育と
ともに情報処理教育の重要性を指摘している。この提言では,現行の学習指導要領が将来のわが
国を担う国民が持つべき「情報社会を生きる力」を育成する「情報教育」に力点を置いているこ
とに一定の評価を示しながらも,コンピュータによる自動化された情報の蓄積・加工・伝達が,
あらゆる情報の短時間での高度な取り扱いを可能にしたことによる量的変化,および自動化によ
る人間の介在不要という質的変化が社会に大きな変化をもたらしているという認識のもと,
「情報
の理解」に重点を置いた現行の「情報教育」と同様あるいはそれ以上に,コンピュータ等による
「情報処理の理解」がより高い「実践力」
「参画する態度」を持った次世代の国民を養成するため
には重要であることを強調している。
―21―
『情報科学研究』第18号
提言はさらに,現行の「情報教育」と「情報処理的視点」を再統合する新たな「情報教育」の
基盤をなす概念として「手順的な自動処理」の構築という考え方を提示し,コンピュータの原理
に関する「知識的な理解」にとどまるのではなく,実際に自ら「手順的な自動処理」に接して体
験し,その特性を身体的に納得して得た「体験的理解」を持つことが,実践力を伴う「情報処理
の理解」を得るために不可欠であると述べている。
ここでいう「手順的な自動処理の構築」とは①問題解決のための問題の定式化とその解法の定
式化②解決方法の自動処理可能な記述③問題解決の検証と反復,という3つの活動の全体を指す
ものであるが,このうち②の記述の方法として中心的な役割を果たすものがコンピュータ・プロ
グラム言語による問題解決方法の記述とその実行である。
筆者は本学部において,文科系学部学生を対象にプログラミングの初歩を教える授業を担当し
てきたが,その経験をもとに,プログラミング初心者が Basic 言語や C 言語に代表される手続き
型プログラム言語を習得しようとするとき,何が大きな障害になるのかを考えてきた。日常論理
とプログラム作成に必要とされる論理的思考の違いはなにか。実質的には処理過程がほとんどブ
ラックボックスであるコンピュータ内部での処理手順を具体的なイメージとして捉えるには何が
必要か。人間同士のコミュニケーションでは許容される曖昧さが許されないコンピュータという
機械を相手に,機械に行わせたい指示を正確に伝えるには何が必要か等を考察しながら,コン
ピュータ・プログラムが行っている処理手順を視覚的なイメージとして捉える方法を考察した。
これらの検討をもとに,比較的手軽に自分の作ったプログラムが,コンピュータ内部でどのよ
うな順序で実行されていくのかを視覚的に把握できるような処理手順視覚化支援プログラムを開
発したので,その機能と利用方法について報告する。
2.逐次処理手順を理解すること
現在のコンピュータのほとんどは,いわゆる「フォンノイマン型」コンピュータといわれる,
コンピュータが直接処理できる機械語の命令をひとつずつ逐次的に処理する「逐次処理」機械で
ある。その機械語を生成するための各種プログラミング言語には,手続き型,関数型(Lisp 等),
論理型(Prolog 等)など,各種のものが考案されているが,Fortran,COBOL,Basic,Algol,PL/I,
Pascal,Ada,C,Java 等,現在主流となっているプログラミング言語の多くは,手続き型といわれ
る,コンピュータのハードウェアの処理手順に近い手順でプログラム処理手順すなわちアルゴリ
ズムを記述していく言語である。
一方,我々人間が行っている思考や推論の過程も基本的には逐次処理であり,企業活動の遂行
手順も,その多くは標準的な業務手続きに従った逐次処理といわれているが,コンピュータに処
理手順を指示する手続き型言語の記述は,我々人間が直感的に感じるほど,近いものではない。
ここでは,多くの手続き型言語でいわれる逐次処理手順を理解しようとするとき,多くのプログ
ラミング初心者が一度は直面する問題を
・逐次処理を理解する以前の問題点
・逐次処理をプログラミング言語で記述するときの問題点
に分けて検討していく。
『情報科学研究』第18号
―22―
2.1
逐次処理を理解する以前の問題点
最初に,Basic や C 言語などの処理手順を逐次的に記述し処理していく手続き型言語に限らず,
これから初めてプログラミングに挑戦しようとしている初心者の多くが経験する困難な点を指摘
する。
(1) 目的と手段に関する問題点
プログラミングとは要するに「プログラムを作る」ことであるが,ワープロソフトや表計算ソ
フトなどの既成のプログラムを「使う」ことに必要な知識・技能と,プログラミングのようなプ
ログラムを「作る」ために必要な知識・技能の違いを認識していないと,何のためにプログラミ
ングの技術を習得するのかを見失ってしまいがちになる。まったくの初心者の段階では,ソース
プログラムの入力の仕方や,作成したプログラムの実行の仕方,あるいは特定のプログラミング
言語の文法規則を覚えることに注意を集中せざるをえないが,この段階を過ぎれば,何のために
プログラミングの知識を身に付けるのかをもう一度考えてみる必要があるであろう。
本論の冒頭で紹介した「日本の情報教育・情報処理教育に関する提言 2005」では,この点に関
連して,情報処理教育の目的の主要な概念として,
「手順的な自動処理」の構築という考え方を提
唱している。ここで「手順的な自動処理」の構築とは
①
問題を同定および記述した上で,その定式化をおこない,解決方法を考える。
②
解決方法を,アルゴリズムとして組み上げ,自動処理可能な一定形式で記述した,コン
ピュータ上で実行可能なものとして実現する。
③
実現したものが問題解決として適切であるかを検証し,必要なら問題の定式化まで戻って
やりなおす。
という一連の活動をさすものと規定している
2)
。これらの一連の活動の内,プログラミング技術
が直接的に関連するのは②の部分であるが,その前後の①の解法の定式化と③の検証と反復まで
を含んだ全体の活動を「手順的な自動処理」の構築と捉えている。
またこの提言では,
「手順的な自動処理」の構築が初等中等教育段階における情報教育の実践手
段と有効であると述べ,その理由として「手順的な自動処理」の構築が以下のような性格を持っ
ている点を挙げている 3)。
①
問題の定式化や解決方法のなどの思考を必須とする点
②
曖昧さのない処理内容/手順の記述を必要とする点
③
思考内容の外部化/客観化が行える点
④
多様な表現手段としての側面を持つ点
さらに高等教育段階では,『大学の一般情報教育において,「手順的な自動処理」についての制
作体験をさせる。また各専門分野において,その専門に関連した情報系科目を選択可能とする(教
員養成系においては必修とする)。』と提言し,その理由として
すべての学生に高等教育にふさわしい情報・情報処理の理解を持たせ,わが国全体としての
ICT に対する理解水準を底上げすること,および,その中に ICT に関する適性と関心を持つ学
生に対してはその適性を伸ばし,各分野における ICT 人材となれるように育成するために必要
である。特に後者については,今日のわが国の情報システム開発において,個別専門分野と情
報技術の両方に精通した人材の不足が,適切なシステム開発の妨げとなり,多大な損失を招い
ている点に留意する必要がある。これを改善するためには上記の施策がぜひとも必要である。
―23―
『情報科学研究』第18号
また,将来の情報教育を担う教員についても,この水準で教育を経ることで,十分な情報教育
が行えるようにすることをめざす。また,教員養成系の専門教育については,これまでは情報
系の内容が必ずしも必須ではなかった。しかし,本提案がめざす小学校段階からの系統的な情
報教育のためには,すべての教員が情報系の内容についても一定水準の内容を修得する必要が
あると考える 4),
と述べている。
このような観点から本学部のような文科系学部における情報処理教育のあり方を考えたとき,
パソコンの普及,
特にハードウェアの高速化・低廉化と Windows に代表される GUI インターフェー
スを介した操作方法の簡便化と共通化,インターネット,携帯電話に代表される情報通信機器と
情報通信インフラの普及,マルチメディアと総称される各種メディアを統合的に扱う技術の普及
によって,一昔前までのパソコンを使いこなすには特殊な技術が要求されるという先入観は払拭
され,誰でも一通りコンピュータを「使う」ことはできるようになった一方,情報処理を取り巻
く環境がますます複雑になってきたため,コンピュータや情報システムの中ではどのようなこと
が行われているのかを理解することがますます困難になり,システムのブラックボックス化が進
むとともに,情報システムで処理されたデータを鵜呑みにする傾向がますます強くなったものと
懸念される。現実には情報システムの一方を支えるソフトウェアの開発は,現在においてもきわ
めて労働集約的であり,一見無機質的に見えるコンピュータシステムも,そのソフトウェアを設
計・開発する過程はきわめて人間的要因の強いものであることが見落とされがちである。文科系
学部出身の学生の多くが,このようなソフトウェア開発業務に直接携わることがないにしても,
その多くは情報システムの利用者として直接・間接に情報システムで処理されたデータや,情報
システムに投入されるデータを自ら扱うことは不可避であるので,ソフトウェアシステムがどの
ような人間によって,
どのように作られていくのかを理解することは不可欠であると考えられる。
(2) ソースプログラム入力に関する問題点
どのようなプログラムであれ,具体的にプログラミングをするときには,ソースプログラムの
入力作業を行わなければならないが,ワープロで文章入力に慣れている学生ほど,当初はソース
コード入力にとまどう傾向が強い。これは多くのプログラム言語では,通常の文章入力ではめっ
たに現れない演算子や括弧など,特殊記号やシフトキーを押してのキー入力が多いためである。
これには「慣れる」しか方法はないが,特に当初は「スピードよりも正確さを」重視するように
心がけることと,普通の文章入力で人間相手の文章では問題にならないようなちょっとしたタイ
プミス(例えば“,(カンマ)
”と“.(ピリオド)
”の間違い等)が,コンパイル時や実行時に山
のように大量のエラーメッセージを出力する原因になることを経験して体感してもらうしかない
ようである。
また,コメントや文字列定数等,カナ漢字変換プログラムを使って全角文字を入力することが
必要な箇所以外ではカナ漢字変換機能は止めておく習慣を付けておくことも必要である。特に一
般的なテキストエディタ等を利用してソースプログラムを入力するとき,
「区切り文字」のスペー
スを全角で入力すると後始末が大変なことになる 5)。
ソースプログラムの入力に(例えば Visual Basic のプログラムを MS Visual Studio の開発環境に内
蔵されているエディタを利用するように)Language Sensitive なエディタを利用する場合には,変
数名を定義するときに変数名に大文字と小文字を混在させておけば,ソースプログラムの他の箇
『情報科学研究』第18号
―24―
所ではすべて小文字あるいはすべて小文字で入力しても,1文入力して Enter キーを押すと,内
蔵エディタの編集機能が定義済みのキーワードや変数名を自動的に正しい綴りに変換してくれる
ので,タイピング・ミスを発見しやすくなる。ただし,xxxDate と xxxData 等の場合,どちら
も変数名としているような場合には,xxxDate と入力すべきところを xxxData と間違って入力
してもエラーにならず,Basic 言語のようにデータ型の違う変数同士の混合演算も自動的に型変換
をしてくれる言語では,プログラムの実行時にもエラーとはならないので,このような間違いを
発見することは非常に困難になる場合がある。いくらソースプログラムを冷静・克明にチェック
しているつもりでも,自分では xxxDate と入力したはずだという先入観があるので,xxxData
という文字が xxxDate と読めてしまうという事態になりかねない 6)。
2.2
逐次処理をプログラミング言語で記述するときの問題点
Basic や C 言語などの手続き型言語では,1つのプロシジャーや関数プログラムの中では,ソー
スプログラムに書かれた命令や文を 1 行ずつ上から下に「順次」実行していくのが原則である。
ただし実際には,よほど簡単なプログラムでない限り,上から順番に命令を実行していき,その
まま最終行にたどり着いてそれで終わり,というプログラムはない。
現在,多くの手続き型言語がプログラム構造の基礎として準拠している構造化プログラミング
の考え方では,ソースプログラムに記述された命令や文を記述された順に逐次処理を行っていく
「順次」構造を基本に,一定の条件が満たされている間処理を繰り返す「反復」構造と,ある条
件が成立するかしないかで以降の処理を分ける「分岐」構造の3つの構造の組み合わせで,要求
されるアルゴリズムを記述するものである。
処理1
処理2
(1) 順次構造
YES
NO
NO
条件
処理1
条件
処理2
(2) 分岐構造
YES
処理1
(3) 反復構造
図1.構造化プログラミングの3つの基本構造
順次構造を構成する命令や文には代入文や入出力文など,さまざまな機能を持つものが必要で
あるが,代表的なものは「代入文」であろう。これに対して,他の2つの構造「反復」と「分岐」
に対しては,概念的にはそれぞれに対して1つずつの統語法があれば十分なはずであるが(例え
ば,反復構造に対しては「while~end while」,分岐構造に対しては「if~then~else~end
if」等),実際には多くの言語が,「反復」「分岐」のそれぞれに対して複数の統語法を用意して
―25―
『情報科学研究』第18号
いる。
例えば,Visual Basic の場合,反復構造を構成する統語法として,一定回数繰り返しを行うため
の「For~Next」ループと,不定回数繰り返しを行うための「Do~Loop」ループに大別される。
「Do~Loop」ループはさらに,繰り返しの判定条件として「~である間」を表す「While」条
件と,
「~になるまで」を表す「Until」条件を使い分けることができ,さらにこれらの条件をルー
プの入り口で判定する「前置」条件と,ループの出口で判定する「後置」条件に分けることがで
きる。一方,
「For~Next」ループに対しても,Visual Basic と同じ文法構造を持つ Excel のマクロ
言語 VBA では「For Each~Next」ループも利用できる。
このように多様な統語法があるのは,プロのプログラマにとっては,状況に応じて最適な統語
法を使用することで,プログラムの構造を見通しの良いものにし,潜在的なエラー(バグ)が忍
び込むのを防ぐのにおおいに価値のあるものであるが,プログラミングの初心者にとっては,覚
えなければならない統語法の種類が増え,さらにどういう状況でどの統語法を使うのがよいのか
を身に付けるのは容易なことではない 7)。
ここでは,Basic 言語を中心に,初心者が逐次処理概念を修得するのに克服しなければならない
障壁の代表的なものについて検討する。
(1) 代入文を正しく理解しているか
Basic 言語では,代入文は形式的には
左辺式
=
右辺式
で表される。ここで「左辺式」とは変数または配列要素であり,
「右辺式」は変数,定数などを演
算子で結合した「式」である。代入文は「右辺式で表された式の値を計算し,その値を左辺式で
指定された変数に代入する」と読む。
慣れてしまえば取り立ててなんと言うこともない表現であるが,多くの初心者が最初に引っ掛
かる(あるいは,正しく理解していない)のが,この代入文である。具体的に,
非常に単純なプログラム
Input A, B
C = A + B
Print C
という Basic プログラムを実行し,
「変数 A に3,変数 B に5を入力すると,C の値はいくつにな
るか?」と質問すれば,誰でも「8です」と答えられるが,それでは
Input I
I = I + 1
Print I
ではどうか?「プログラムの動きを説明せよ」と問うと,多くの初心者が口ごもることになる。
この問題は「代入」文という用語と,代入という動作に「=(等号)
」という記号を使うことに
ある。どちらも数学用語を借用しているので,Basic 言語での「代入」と数学の「等式」とを混同
『情報科学研究』第18号
―26―
してしまう危険が高い。また,If 文などの条件式の中では,同じ記号「=」を本来の「等号」の
意味で使用するので,さらに状況を悪くしてしまう。「=」の代わりに「←」記号でも使えれば,
混同してしまう危険はかなり低くなると思われるが,他の言語を見渡しても,半角 1 文字で適当
な記号がないのが現状であろう。ちなみに,Algol 系の言語(Pascal,Ada 等)では「:=」を使っ
ているが,この方が「i ← i + 1」というイメージに近い 8)。
歴史的には,
「=」を代入記号として最初に使った Fortran では,IF 文の条件式の中での「等号」
には「.EQ.」という記号を当てていた。一方,マイクロソフトの Basic 言語では代入記号にも等
号にも共通して「=」を使用してきたが,Basic 言語から派生したマイクロソフトのスクリプト言
語 VBScript では,
「等号」に「=」だけでなく「EQU」という記号も規定している。現在の C 言語
系の言語では「等号」には「==」を使用しているが,C 言語の場合,条件式の中で「==」の代わ
りに誤って代入演算子「=」を使っても文法エラーにならないので,実行時にとんでもないエラー
を引き起こす原因のひとつになっている 9)。
また,Visual Basic の場合も,最近の.NET 版では代入演算子「+=」が追加されている。長い変
数名の値をインクルメントするには便利であるが,「X += 1」の意味をとらえるには,この代入
演算子が「X = X + 1」を意味していることがわかっていなければならないので,初心者にとっ
てはまず「i = i + 1」の意味を正しく理解するのが先決である。この点では,COBOL の「ADD
1 TO X」や C 言語の「++x」あるいは「x++」の方がわかりやすいといえる 10)。
(2) ループを正しく追いかけられるか
Basic では,反復構造(繰り返し)を作るための構文として,大別して「For~Next」と「Do
~Loop」の2種類の構文が用意されている。どちらの繰り返しも概念的には,判定条件の初期設
定,条件の再設定,繰り返しの継続判定の3つの部分が必要であるが,「Do~Loop」では,この
3つの部分の内,構文則で位置が確定しているのは繰り返し判定の部分
(While 節あるいは Until
節で記述する)だけで,初期設定はループに入る前に(すなわち,ソースプログラム上では「Do
~Loop」の外側で)記述しておかなければならないし,再設定は「Do~Loop」の中ならば,ど
こに書いてもかまわない。より厳密には,初期設定と再設定は他のプロシジャーの中で行っても
かまわないので,実行の順序だけが問題で,記述の位置については何の制約もないことになる 11)。
「Do~Loop」にはこのような自由度があるので,繰り返し条件の3つの部分が1カ所に集中
している「For~Next」の方が初心者には直感的にわかりやすいようである。
例えば簡単な例では
For i = 1 To 10
a(i) = b(i)
Next i
ならば,誰でもすぐ理解できる。
同じ「For~Next」でも
Sum = 0
For i = 1 To 10
―27―
『情報科学研究』第18号
Sum = Sum + a(i)
Next i
の場合は,For 文による繰り返しの前に(すなわち,For ループの外側で)「合計値」の初期化
が必要なので,多少の慣れが必要になる。
さらに複雑な例(配列 a の i1 番目の要素から i2 番目までの要素を,配列 b の j1 番目以降に
移動する)になると
j = j1
For i= i1 To i2
b(j) = a(i)
j = j + 1
Next i
のように,実質的なループの制御変数が2つ(i と j)あること,片方を For ループの制御変数
にして,もう一方は For ループの前に初期設定,For ループの中で再設定が必要なこと,などを
理解しなければならない。同じことを C 言語では
for (i = i1, j = j1; i <= i2; i++, j++ ) {
b[j] = a[i];
}
と書けるので,この方がループの2つの制御変数を For 文の中で1カ所にまとめて書けるために
見通しがよい 12)。
次に,同じ配列の中での移動になると,
①
配列 a の i 番目の要素から j 番目までの要素を1つ左(前)に移動させる場合
For k = i To j
a(k-1) = a(k)
Next k
②
配列 a の i 番目の要素から j 番目までの要素を1つ右(後ろ)に移動させる場合
For k = j To i Step -1
a(k+1) = a(k)
Next k
(後ろの方から移動させないと右隣りのデータを壊してしまう)
③
配列 a の i 番目の要素から j 個の要素を1つ左(前)に移動させる場合
For k = i To i+j-1
a(k-1) = a(k)
Next k
『情報科学研究』第18号
―28―
④
配列 a の i 番目の要素から j 個の要素を1つ右(後ろ)に移動させる場合
For k = i+j-1 To i Step -1
a(k+1) = a(k)
Next i
のように,観念的にはほとんど同じことをやればよいように見える処理も,ループの制御変
数の動かし方と配列の添え字の使い方が微妙に連動しているので,処理手順の厳密な設計を
しておかないと(できあがったプログラムを克明に追いかけないと)
,何をしているのかさっ
ぱり理解できない,ということになる。
図2.同じ配列内でのデータの移動
また,話はさかのぼることになるが,まったくの初心者は,Basic 言語のような手続き型言語で
配列データの一部を同じ配列の中で移動する場合も,本棚に並んでいる本の列の途中に空きを作
るように,適当な位置の本を右に強く押せば,右隣りの本も自動的に右にずれてくれるようなわ
けにはいかず,データをひとつずつ移動しなければならないことを理解しなければならない。こ
れはちょうど,横に並んだコインロッカーの中のものを1つずつ右に移す作業をイメージしても
らうとよい。
―29―
『情報科学研究』第18号
この辺が,プログラミングはおもしろいと言って自分で積極的にプログラムを追いかける学生
(残念ながら少数であるが)と,私には向いていないと言ってサジを投げる学生とがはっきり分
かれてくる分岐点のようである。
(3) 2重のループを正しく追えるか
(配列 a の要素 a(1)...a(n)を昇順にソート(直接選択法)
)
For i = 1 To n-1
For j = i+1 To n
If a(i) > a(j) Then
‘ 2つのデータの比較
‘ データの交換
t = a(i)
a(i) = a(j)
a(j) = t
End If
Next j
Next i
このアルゴリズムはソートのアルゴリズムとしては効率は悪いが,ソートアルゴリズムには,2
つのデータの「比較」と「交換」が必要であることを理解するとともに,このプログラムでは,
「比較」の If 文と「交換」の部分以外は,2つの繰り返しのループしかないことを示している。
この例で,2つのデータを交換する部分の3行(プログラムの右側に矢印を付した部分)も多
くの手続き型言語に共通するロジックであるが,2つのデータを交換するときには,両手を使っ
て左手と右手でそれぞれの物を持ち,両手を交差させて一挙に置き場所を交換するようなわけに
はいかず,一時的な置き場所(一時記憶領域)を設けておき,片手だけで2つの物の置き場所を
交換する作業をイメージできればよい 13)。
図3.2つのデータの交換
この程度のアルゴリズムを自分で追いかけることができ,必要ならば自分でこのソースリスト
を再現できるようになれば,どんなプログラムでも克明に追いかけることができるレベルに達し
たという自信が持てるであろう。
『情報科学研究』第18号
―30―
(3) 適切なコメントを付ける
Basic に限らず多くの手続き型言語では,ソースプログラム上の個々の文(その多くが代入文で
あるが)が処理している内容は非常に断片的なものである。この点では現在の手続き型言語の構
造は,人間の思考過程にマッチしたものではなく,はるかにコンピュータ寄りの論理構造を持っ
たものと言わざるを得ない。このギャップを埋める方法のひとつがソースプログラム上に適切な
コメントを書くことである。
このためには,個々の命令文では表せないよりマクロなレベルで,意味的なまとまりのある単
位に対して,ここでは「要するに」何をするのかを記述するように心がけるべきである。これは
(プログラム言語ではなく)普通の日本語で書かれた本のパラグラフ単位に要約あるいはパラグ
ラフの見出しを付けるのと同じ要領だと考えられよう。
ある程度のマクロレベルで適切なコメントを付けられるようになれば,プログラム設計時のモ
ジュール単位,モジュール間の独立性の確保,情報の隠蔽等の概念を理解するにも役に立つと思
われる。また,ドキュメント化への架け橋にもなるであろう。
(もっとも,本来は設計書が先にあっ
て,プログラムはそれを詳細化,手順化したもののはずではあるが。)
3.初心者向けプログラミング言語としての Basic 言語の得失
初心者を対象としたプログラミング言語には,どのような言語が最適であるのかについてはさ
まざまな議論があるが
14)
,ここでは筆者が実際の教育現場で教材として使用してきた Basic 言語
(主として MS Visual Basic 及び Active Basic)を中心に,初心者向けプログラミング言語としての
Basic 言語の得失について若干の検討を行う。
(1) 汎用性
Basic 言語そのものは COBOL,Fortran とともに,プログラミング言語としては長い歴史を持つ
言語である。当初はその名前(Beginner’s All purpose Symbolic Instruction Code)が示すように,初心
者向けの簡易言語として開発されたものであるが,パソコン(PC)が個人レベルに普及するとと
もに,PC で比較的手軽に使えるプログラミング言語として急速に普及し,現在でも使用者人口の
最も多い言語のひとつとなっている。また同時に PC が企業の情報システムのエンドユーザ側の主
要機器として位置づけられると,企業レベルでのエンドユーザ言語としても普及し,それととも
に単なる簡易言語としてではなく,企業ユーザの使用にも耐えられるように言語仕様も拡張され
てきた。
このように,Basic 言語は個人が利用する用途から企業情報システムの一端を担う用途まで幅広
い用途に利用できる機能を持っているので,言語の汎用性(多用途性)という点では幅広い要求
に応えられる言語といえる。この点は教育用プログラミング言語として Basic を習得した学生が
将来,実社会においてもその言語知識を直接的に活かせる機会も多いものと期待される。
一方,一口に Basic と言っても多くの開発元がさまざまなバージョンをリリースしているので,
Basic はバージョンによって些細な仕様の相違(いわゆる方言)が多い言語でもある。この点は一
定以上の言語知識と経験を持っている利用者には大きな障害ではないが,初心者にとっては些細
な相違が大きな障害となる可能性が高い。また,広範な用途に応えられるように機能を拡張して
―31―
『情報科学研究』第18号
きた結果,現在の Basic の全機能は非常に大きなものとなっており,これも初心者にとっては大
きな障害となっている。たとえば,マイクロソフトの Basic 系の言語の場合には,当初の簡易言
語のレベルから Quick Basic の時代に構造化プログラミングの構文則を大幅に取り入れ,さらに
Visual Basic になるとともに,Windows システムのもとで動く GUI インターフェースの機能を拡張
し,さらに最近の.NET 版ではオブジェクト指向言語としての機能を大幅に取り入れている。
ただし,マイクロソフトの Basic 言語は旧バージョンとの互換性については相当の考慮を払っ
ているので,すべての機能を知らなくても,必要最低限の知識だけでもなんとか動くプログラム
を作ることは可能である。具体的には,変数の明示的な宣言をしなくてもよいので,変数のデー
タ型についても(少なくとも最初のうちは)気にしなくてもよいこと,旧来からの入出力文も使
えるので,差し当たり必要な入出力文を知っていれば,膨大なクラスライブラリーを知る必要が
ないこと,サブプロシジャーや関数,メソッド呼び出しに使用する引数の渡し方(値呼び出しか
参照呼び出しか)を知っている必要がないこと,などの点が初心者への間口を広いものにしてい
る 15)。
その一方で,旧バージョンとの互換性を高めるために旧来からの統語法を引きずっている点も
多い。例えば「If 文」には旧来からの統語法と構造化プログラミング的な統語法とが併存してい
ること,「Do ループ」と「For ループ」の終端はそれぞれ旧来からの「Loop」と「Next」とい
う統語法を使用しているのに対して,ループ内からの脱出は「Exit Do」および「Exit For」
という新しい統語法によるなど,統一を欠いた統語法となってしまい,初心者にはこれらの統語
法を覚えるために余計な負担をかけるものになっている。
これらの点を勘案しても,適切な指導と教材があれば,Basic は初心者にとっては比較的「敷居
の低い」言語といえる。
(2) 教材調達の容易性
Basic 言語の使用人口の多いこと,初心者への敷居が低いことなどから,書店には Basic に関す
る教科書・参考書は溢れるほどあると言ってよい。またインターネット上にもさまざまな資料や
ブログでの発言等が公開されている。この点からは Basic は学生が自分で教科書や参考資料を探
すには比較的容易であるといえる。ただし当然ながら,これらの書籍やインターネット上の資料
は玉石混交であり,筆者の多分に主観的な印象では,平均的な品質は決して高くはない。これは
初心者に対する敷居が低いことの,ある意味では当然の結果ともいえよう。また,Basic 言語の適
用範囲が広いことから,それぞれの書籍で扱っている適用領域も多岐に渡っており,極端に専門
的で狭い領域のみを扱っているものから,何を目的として書かれているのか判断に困るものまで,
対象範囲の広さ,記述の品質のばらつきも大きい。そういう点では初心者が独力で適切な教科書
や参考資料を探すのはそう簡単ではないといえる。また,良い文章が書けるようになるには良い
手本が必要なように,プログラミングのセンスを身に付けるにも,良いプログラムの手本となる
ような例題を探すことも重要になるが,資料の総量が多い割には,良い品質の例題は決して多く
はないといえよう。単に文法事項の説明のためだけの例題は,むしろ経験者や他の言語から移っ
てきた人には参考になっても,初心者がプログラミングを(ある程度まとまった単位として)身
に付けるには,とても十分とはいえない。
この点は,授業で使用する教科書や参考資料を選択する教員にとっても同様であり,授業での
集合教育にも使えて,かつ学生が自分一人で自習するのにも使えるような教科書は比較的少ない
『情報科学研究』第18号
―32―
のが現状である。
(3) 自習環境の容易性
プログラミングの技術を習得するには,教科書や参考書を読むだけではもちろん,授業時間内
での実習だけでは圧倒的に時間が不足しているのが現実である。そのためには大学側でも授業時
間以外に学生が自習に使える設備を設けておくのはもちろんであるが,学生が自分のパソコンを
使って自分の都合の良い時間にプログラムを作り,自分の作ったプログラムを納得のいくまで実
際に走らせられる環境があることが望ましい。特に初心者の場合は,経験者であれば何でもない
ような,操作上あるいは文法上の些細な相違でつまづき,自分では何が違うのかわからず,学習
の意欲を失ってしまう危険が高いので,プログラム開発環境は授業で使っているのと極力同じで
あることが望ましい。
Basic 言語の場合,数多くの開発環境ソフトが市販されているが,平均的には一般的なワープロ
ソフトや表計算ソフトよりも割高であり,授業のためだけにこのようなパッケージソフトを購入
する(あるいはさせる)のは躊躇われるところである。幸い,インターネット上にも数多くの無
償で利用可能なソフトが公開されているので,授業で使用するソフトも学生が自分の PC でも同
じソフトが使えるかどうかを勘案しながら教材ソフトを選択することが教師・学生の双方にとっ
て得策であろう。例えば,マイクロソフトのパッケージソフト(例えば Visual Basic)も,Express
Edition というバージョンは,フルセットのパッケージに比べるとさまざまな制約があるものの,
初心者向けの授業で使用する機能は一通り揃っているので,これらを教材ソフトとして利用する
ことも十分可能であろう。
また,マイクロソフトの製品系列の場合,ワープロ(MS-Word)表計算(MS-Excel)ソフト等
のマクロ機能を使うと,マクロ記録中の処理手順がそのまま Basic のソースプログラム(VBA:
Visual Basic for Application)として生成され,この Basic プログラムは Excel さえあれば,Basic 言語
の開発環境がなくても Excel 上で実行させることができるので(もちろん Basic 固有の機能がすべ
て使えるわけではないが)
,Excel だけでもかなりの程度,Basic プログラムを作り,そのプログラ
ムを実行させる環境として利用することができる。
以下に Excel のマクロ機能を使って作成した Basic プログラムを土台にして,Excel だけではで
きない自動処理機能を Basic 言語に基づいてマクロプログラムに追加記述した例を示す。
(4) Excel VBA の利用例
ここでは図4の左側に示した Excel のワークシート上のデータ(展示会の招待者名簿のような
ものを想定していただきたい)を編集加工して,図4の右側のような表(招待者に会場で付けて
もらう名札を想定していただきたい)を作る処理を例にして,Excel のマクロ機能を使って生成さ
れた Basic プログラムに手を入れることで,Excel 上の手操作だけではできない連続処理を行うプ
ログラムを作ることを考える。
―33―
『情報科学研究』第18号
図4.ワークシート間の転送イメージ
1)元のデータは1人のデータが 1 行の横方向に[会社名]
[氏名]のようなレイアウトで一覧表
になっている。
2)このデータを宛名ラベルや名札のように,各招待者ごとに上段に[会社名]
,下段に[氏名]
のように配置して,プリント用紙1枚当たり縦4人,横2人の計8人分を配置することにする。
従って,名簿の1番目の人はプリント用紙用ワークシートの上段(1,2行目)左(1列目)
に,2番目の人は上段(1,2行目)右(2列目),3番目の人は中段(3,4行目)左(1
列目),...(以下同様)のように配置する。
3)データ数が数十件程度であれば,わざわざプログラムを作るまでもなく,すべて手作業で
行ってもたいしたことではないが,データ数が数百件,数千件もあれば,とても手作業ではで
きないので,なんとか自動化したい。
4)たとえば,3人目の人をプリント用ワークシートの中段(3,4行目)左(1列目)に転送
するのは,手作業で行うことを Excel マクロに記録させればよい。
5)1人分の処理手順が記録できれば,これをもとに Basic プログラムで何番目の人をどこに配
置すればよいのかを Basic のプログラムロジックとして記述できればよい。
処理手順は以下のとおりである。
1)事前に新しいワークシート(この例では“sheet2”)に名札用のレイアウトを作っておく。
2 ) た と え ば 3 人 目 の 人 の デ ー タ を “ sheet2 ” の 中 段 左 に 転 送 ( す な わ ち
sheet1!A3→sheet2!A3 へ,sheet1!B3→sheet2!A4 へ)する処理を手作業で行い,こ
の処理をマクロ記録する(マクロ名:項目転送)
この処理のマクロ記録を図5に示す。
『情報科学研究』第18号
―34―
Sub 項目転送()
'
' 項目転送 Macro: キー記録マクロそのまま
'
Sheets("Sheet1").Select
Range("A3").Select
Selection.Copy
Sheets("Sheet2").Select
Range("A3").Select
ActiveSheet.Paste
Sheets("Sheet1").Select
Range("B3").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Sheet2").Select
Range("A4").Select
ActiveSheet.Paste
End Sub
図5.“項目転送”マクロのソースプログラム
3)“項目転送”マクロに手を入れて,第 i 番目の人を転送するように変更する。
Sub 項目転送(i As Integer)
'
' 項目転送 Macro: キー記録マクロをなるべく生かしながら,
'
転送先の(行,列)位置を算出して
'
その位置に転送
'
Const Rs As Integer = 2
Const Cs As Integer = 2
Dim iR As Integer
Dim jC As Integer
'
'
'
iR = i * Rs - 1
jC = i Mod Cs
If jC = 0 Then
jC = Cs
End If
--- 行位置を求める
--- 列位置を求める
--- 項目転送
Sheets("Sheet1").Select
Cells(i, 1).Select
Selection.Copy
Sheets("Sheet2").Select
Cells(iR, jC).Select
ActiveSheet.Paste
Sheets("Sheet1").Select
Cells(i, 2).Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Sheet2").Select
Cells(iR + 1, jC).Select
ActiveSheet.Paste
End Sub
'------------------------------------------------Sub レイアウト編集()
'
' レイアウト編集 Macro
'
Const N As Integer = 200
Dim i As Integer
For i = 1 To N
項目転送 i
Next i
End Sub
図6.“項目転送”マクロに必要最小限の変更を加えたソースプログラム
―35―
『情報科学研究』第18号
①
第 i 番目の人のデータを転送するために,i の値は他のプログラム(
“レイアウト編集”
プログラム)から呼び出される時にパラメータとして渡される。
②
渡された i の値から,
“sheet2”の何行目(iR 行および iR+1 行),何列目(jC 列)に
転送べきかを算出するロジックを追加し,転送先のセル番地を「絶対セル番地」形式の
Cells(iR, jC)及び Cells(iR+1, jC)セルに格納する。
③ “項目転送”プログラムに i の値を渡すプログラム“レイアウト編集”プログラムを追
加する(Visual Basic エディタから直接入力する)。
必要最小限の追加修正であればこれでよいが,
“項目転送”プログラムを図7のようにさらに変
更すると,より Basic のプログラムらしくなる。
Sub 項目転送(i As Integer)
'
' 項目転送 Macro: 転送先の(行,列)位置の算出方法を工夫し,
'
転送方法を代入文に変更
'
Const Rs As Integer = 2
Const Cs As Integer = 2
Dim iR As Integer
Dim jC As Integer
--- 行位置を求める
'
iR = i * Rs - 1
'
'
--- 列位置を求める
jC = (i - 1) Mod Cs + 1
--- 項目転送
Worksheets("Sheet2").Cells(iR, jC) = Worksheets("Sheet1").Cells(i, 1).Value
Worksheets("Sheet2").Cells(iR + 1, jC) = Worksheets("Sheet1").Cells(i, 2).Value
End Sub
図7.さらに修正した“項目転送”プログラム
ここでは,Excel のマクロをもとに,それに手を加えて Excel マクロだけでは不可能な処理(こ
の例では全件の自動化)を可能にするような Basic 言語処理の例を示したが,この例のように,
Excel のセルを Basic プログラムで配列データとして扱うことで(VBA では Cells(i,j)とい
う配列データとしてワークシートのセルを扱うことができる)
,ワークシートの内容が更新される
ごとにワークシートの画面が更新されるので,処理手順を逐一画面上で追うことができる。
(もっ
とも実際は画面の更新処理が速すぎて,
「逐一」見ることは不可能だが,処理の様子の「雰囲気」
程度は掴むことができる。
このようなプログラムを実務の一環として利用する場合には,逐一画面を更新する処理の負荷
が大きく,処理速度が大幅に遅くなるので,実用的には処理途中は画面の更新を抑止しておくの
が普通である。このことは逆に,教材用のプログラムをこのような環境で動かせば(すなわち,
Excel のワークシートをプログラムが処理する変数が配置されている主記憶装置とみなすと),通
常は目に見えないプログラム実行時にプログラムが主記憶装置のどの部分をどのようにアクセス
しているのかを,あたかも目でみながらプログラム処理の経過を追うことができるようになる。
『情報科学研究』第18号
―36―
4.Basic 言語向け処理手順視覚化支援プログラムの開発
前節までの議論を踏まえて,教材として与えられたあるいは自分で作成した Basic 言語で書か
れたプログラムの詳細な処理過程を,プログラミング初心者が視覚的なイメージとして捉えるた
めの支援ソフトを開発したので,その概要を紹介する。
4.1.
開発の動機と目標
従来,筆者が担当しているコンピュータ・プログラミング関連科目(「コンピュータ・システム
B」,「コンピュータ・サイエンス」等)では,教室のホワイトボードに板書をしたり,事前に用
意した資料を PC のモニター画面に提示する等の方法で,例題プログラムの処理手順を説明して
いた。しかし,動的なプログラムの動きを紙あるいは静止画像で説明しても,学生に明確なイメー
ジを持たせるのは困難である。一方,例題ごとに動きのある説明資料を事前に用意するのは教師
の側の事前準備の労力が過大なものになる。また,黒板やホワイトボードでの板書は,教師側か
らは伝統的かつ手軽な方法であるが,プログラムの処理経過を説明するには必然的に同じ図の一
部を書いたり消したりすることになるので,受講者の側からはノートが取りづらく,その場で完
全に理解できればよいが,
説明の理解も中途半端,
ノートの記述も中途半端なものになりやすい。
このような状況を改善するために,主としてプログラミング初心者向けの,プログラムの動き
を視覚的イメージに訴えることで受講者の理解を高めるための視覚化支援プログラムを開発した。
開発に当たって,以下の目標を設定した。
(1) 対象言語は Basic 言語とする
Basic 言語にも開発元によってさまざまなバージョンが存在し,それに伴い多様な拡張機能
(いわゆる方言)があるが,(この支援プログラムのもともとの開発動機が,
「情報」の教職課
程を履修している学生に,各種のソート・アルゴリズムの特徴を説明することにあったので)
ファイル入出力機能や Windows システム固有の機能のサポートはせず,主として配列データの
処理過程を克明に追えることを主眼とした。
(2) MS Excel のマクロ(VBA)として実装する
特別な道具立てを必要とせず,学生が自宅の Windows PC でも簡単に利用できることを目的
として,マイクロソフトの表計算ソフト MS Excel さえあれば動くものとした。
(3) Basic 言語の断片でも動くこと
Basic のプログラム構造として完全なものでなくても,プログラムの一部だけでも動かすこと
ができるものとする。メイン・プログラムのない単独のサブ・プロシジャーでもよく,さらに
小さな単位で,For~Next や Do While~Loop の繰り返し単位だけでもよい。
変数の宣言や初期値の設定部分が欠けている場合は,連動して動く Excel のワークシート側
で指定すればよいこととした。
(具体的なイメージは次節の動作例を参照されたい。)
(4) 視覚効果の部分は利用者がある程度自由にアレンジできること
利用者自身が Excel の1つのワークシート上にこのプログラムが使う主記憶装置のレイアウ
トをデザインすることで,比較的自由に画面のデザインができるようにした。利用者が自分で
(もともと目に見えない)主記憶装置のメモリー配置を図式化する教育的効果が期待できると
同時に,プログラム開発者にとっては(多くの場合非常に面倒な)グラフィック処理を省略す
―37―
『情報科学研究』第18号
ることができる。このプログラム側から見たときの一番大きな制約は配列データを縦方向ある
いは横方向の連続したセルに配置しなければならないことである。
ワークシートをどのように見せるかについて,この他の点はほとんど Excel の機能にまかせ
ている。(この点についても具体的なイメージは次節の動作例を参照されたい。)
4.2.
動作環境
マイクロソフトの表計算ソフト MS Excel が動作する環境があればよい。このプログラムは MS
Excel の VBA マクロプログラムとして動作する。
(Excel 2000 以上の環境で動くことを確認してい
る。)
4.3.
利用手順
このプログラムは「表示設定」,
「実行」という2つの VBA マクロプログラムからなる。利用者
は,MS Excel を起動し,このマクロプログラムが含まれている Excel ファイルを開く。以下,標
準的な操作手順を示す。
(1) ワークシートに主記憶装置のレイアウトをデザインする
白紙状態のワークシートに,対象プログラムが使用する変数の記憶場所をデザインする。こ
のとき,使用するワークシートに適当な名前を付けておくとよい。
(なお,
“Work”という名前
のワークシートはマクロプログラムが使用するので,この名前を付けてはならない。
)
レイアウト上の実質的な制約条件は,配列データは縦方向あるいは横方向に連続したセルに
配置することだけである。(プログラム仕様上は2次元配列まで取り扱うこともできるが,以
降のステップでこのワークシートの前面に3つのフォームを配置するので,画面をスクロール
せずに一覧性を高めるためには,そう大きな配列を表示するのは実用的ではない。)
マクロプログラムとの実質的なインターフェースは,実行したいプログラムが使っている変
数および配列要素の記憶域に対応するセルだけなので,変数の記憶域に対応していないセルや
ワークシート全体のレイアウトは自由に設計してよい。(図8.参照)
図8.ワークシートに主記憶装置のレイアウトをデザインする
『情報科学研究』第18号
―38―
また,プログラム実行開始時にこのプログラムで使用している変数や配列要素の値が確定し
ていなければならないものについては,対応するセルに値を記入しておく。初期値の必要ない
ものは,対応するセルを空白のままにしておけばよい。
(2) ワークシート上でプログラムが使用するセル番地と変数名の対応表をつくる
ワークシート上の適当な位置(実行時に見える必要はない)に変数名とその変数に対応した
セル番地との対応表を記入する。(図8.の N 列,O 列を参照)
配列の場合は,Basic 言語で配列の下限・上限を定義するのと同じ書式“
(上限 To 下限)”の
形式で指定する。対応するセル番地は“CR 形式”で指定する。
このプログラムから利用者が作成したサブプロシジャーやユーザ作成関数を呼び出す場合
は,この対応表の変数名の列の下に続けて“*プロシジャー名”を記入し,その下に(パラメー
タも含めて)そのプロシジャーで定義している対応表を続ける。
(3) 「表示設定」マクロを実行する
「表示設定」マクロが開始されると,
「ソースプログラム」
,
「現在実行中の行」,
「コントロー
ル」というタイトルの3つのフォームが表示されるので,これらを適当な位置に移動して配置
する。(図9.参照)
図9.「表示設定」マクロを起動して3つのフォームを配置する
―39―
『情報科学研究』第18号
「ソースプログラム」フォームのテキストボックスに実行する Basic プログラムを入力する。
テキストボックスにソースプログラムを入力することもできるが,すでに用意したソースプロ
グラムを他のテキストエディタ等で開き,コピー&ペーストで貼り付けるのが一般的であろう。
このテキストボックスは縦方向にスクロールするので,多少長いプログラムを表示することも
できるが,一覧性の点からはスクロールせずに全体が見える程度にとどめておくのが望ましい。
(図 10.参照)
図 10.ソースプログラムを入力する
(4) 「コントロール」フォームの[設定]ボタンをクリックしてワークシートに記述した「メモ
リーの配置」表のセル範囲を指定する
(5) 「コントロール」フォームの[チェック]ボタンをクリックして,設定内容をチェックする
「表示設定」マクロプログラムは,「ソースプログラム」フォームに入力されたソースプロ
グラムと「メモリー配置」表とを参照してソースプログラムをチェックしながら,“Work”と
いうワークシートを作成して,そこに中間言語形式のプログラムを書き込む。
ソースプログラムに文法エラーがある場合は「現在実行中の行」フォームにエラーメッセー
ジを表示して処理を中断する。このプログラムはソースプログラムを中間言語に展開するため
に必要最小限のエラーチェックを行う機能しか持っていない点は了解いただきたい。
(6) エラーがなければ「ソースプログラム」フォームのテキストボックスには各行の先頭に行番
『情報科学研究』第18号
―40―
号が付されたソースプログラムが表示されるので,「コントロール」フォームの[実行]ボタ
ンをクリックして,プログラムを実行する(実行時の詳細は次節参照)
(7) プログラムの実行が終了したら,
「コントロール」フォームの[終了]ボタンをクリックする
と「実行マクロ」が終了し,3つのフォームが消える
これで通常の Excel に戻り,ワークシートにはプログラム終了時の変数の値が表示された状
態になる。
4.4.
処理経過の表示内容
前節(5)のステップで[実行]ボタンをクリックすると,
「現在実行中の行」フォームの上段の
テキストボックスに「実行を開始します」と表示される。
例として“シェルソート”のプログラム本体部分を図 11.に示す。
図 11.ソースプログラムの例
プログラムの実行は「コントロール」フォームの[項]
,[行],[ループ]ボタンをクリックし
ながら進められる。
現在実行中の行は,
「ソースプログラム」フォームの該当行が反転表示され,その行が「現在実
行中の行」フォームの上段のテキストボックスに多少大きな文字で表示される。下段のテキスト
ボックスには,その行を構成している「項目」の評価順序に従って,1回評価するごとに改行し
ながら表示していく。
(図 12.参照)
―41―
『情報科学研究』第18号
図 12.実行過程の表示
図4に示したソースプログラム 09 行目の処理経過を例に示す。(図 13.参照)
図 13.文の評価過程の表示
『情報科学研究』第18号
―42―
ソース行:
09: If a(j) > a(i + Gap) Then
評価経過:(1) j は: 4
:評価項目は j,値は 4
(2) a(4) は: 9
:評価項目は a(4),値は 9
(3) j は: 4
:評価項目は j,値は 4
(4) Gap は: 6
:評価項目は Gap,値は 6
(5) j + Gap は: 10
:評価項目は j+Gap,値は 10
(6) a(10) は: 3
:評価項目は a(10),値は 3
(7) a(j) > a(j + Gap) は:True :評価項目は a(j)>a(j+Gap),値は True
評価が行の最後まで達したときには,行末に“■”を表示して,行末に達したことを示してい
る。
「代入文」の場合,例えば図 13.の 11 行目は
ソース行:
11: t = a(j)
評価経過:(1) j は: 4
:評価項目は j,値は 4
(2) a(4) は: 9
:評価項目は a(4),値は 9
(3) t に代入: 9
:評価項目は t,値は 9
のように表示される。また,評価の各行で,ワークシートに指定された変数を参照する場合は対
応するセルを緑色で,代入する場合は対応するセルを赤色で表示する。
For~Next ループの場合,例えば
For k = k1 To k2 Step k3
|(ループの本体)
Next k
は
k = k1
Do While k3 > 0 And k1 <= k2 Or k3 < 0 And k1>= k2
|(ループの本体)
| k = k + k3
Loop
と等価である。すなわち,増分 k3 の正負によって継続判定の不等号の向きが逆になるので,For
文のところでは,
(1) For ループの初回の場合は
ソース行: xx: For k = k1 To k2 Step k3
評価経過:(1) k1 は: 1
:評価項目は k1,値は 1
(2) k に代入: 1
:評価項目は k,値は 1
(3) k は: 1
:評価項目は k,値は 1
(4) k2 は: 10
:評価項目は k2,値は 10
(5) k <= k2 は: True
:評価項目は k<=k2,値は True
―43―
『情報科学研究』第18号
ただし,増分 k3 がマイナスの場合は
(5’)k >= k2 は: False
:評価項目は k>=k2,値は False
のように,増分の正負によって不等号の向きを変える必要がある。
(2) 対応する Next 文では「k = k + k3」に対応する評価経過を表示し,
(3) For ループの2回目以降は初回のステップ(1)および(2)を省略した部分を表示する。
[項]ボタンをクリックすると,現在実行中の文の次の「項目」の評価結果を表示して,待機
する。
[行]ボタンをクリックすると,各「項目」を評価するごとに待機するのではなく,現在実行
中のソース行の終わりまで連続して実行する。この場合,途中経過の表示はテキストボックスに
残っているので,行内での処理経過を追うことはできる。
[ループ]ボタンをクリックすると,現在実行中の文を含む一番内側のループの終わりまで止
まらずに表示する。この場合は,[ループ]ボタンを押した以降のループ内の各行の経過は(実際
には表示されるが)すぐ次の行の経過表示で上書きされてしまうので実質的には見えず,ループ
が終了した状態が表示される。
5.おわりに
本稿では,プログラミング初心者が手続き型プログラミング言語を初めて習得しようとすると
きに直面する,手続き型言語が想定している逐次処理手順を特定のプログラミング言語の文法に
従って記述するときの困難さについて概括した。そこで要求される手順の記述単位が,我々人間
が日常生活レベルで経験している
「手順」のレベルよりも数段細かいレベルの記述が必要なこと,
また記述に当たって一切の曖昧さが許されないこと等を指摘した。
さらに,初心者が自分で記述した,あるいは教材として与えられた手続きを正確に理解するた
めには,ほとんどコンピュータの命令順序に近いレベルで処理手順を追いかけ,理解しなければ
ならない一方,そのプログラムが実際にコンピュータで処理されていく過程のほとんどが直接目
で見ることができないこと,従って,プログラムで記述した処理手順を明確で具体的なイメージ
として把握し,理解するためには,何らかの方法で視覚化する方法があれば,処理手順の明確な
理解に大いに役立つであろうこと,等を検討した。
これらの検討を踏まえて,本稿では教育用にも実務でも非常によく利用されている Basic 言語
を対象にした視覚化支援プログラムを開発し,このプログラムでは処理過程をどのように視覚化
しているのか,その機能の概要を紹介した。ただし残念ながら,このプログラムの初期バージョ
ンを開発してからまだ正味1年に満たず,このプログラムを実際の授業で使用した対象科目の履
修者がきわめて少数であること等から,学生の理解がどの程度進んだのかを定量的に把握するま
でには至っていない。ごく少数ながら,教材資料の一環として利用したときの学生の反応は,き
わめて良好であったので,一応の開発意図は達成されたものと認識しているが,同時にいくつか
の問題点も指摘された。
最後に,現状で把握している問題点を列記して,今後の改良への一段階としたい。
(1) 再帰呼び出し処理の視覚化にもう一段の工夫が必要なこと。
このプログラムの元来の目的のひとつに,クイックソート・アルゴリズム等でよく使われる
『情報科学研究』第18号
―44―
「再帰呼び出し」プログラムの動作手順を視覚的に表現することがあり,現行のバージョンで
も一通りの対応は行っている。具体的には,再帰呼び出しを行ったときに,呼び出された側で
必要な変数等のレイアウトを,呼び出し側と同じレイアウトを新しいワークシートにコピーを
して,呼び出された側の処理経過を,この新しいワークシート上に表示するようにしているが,
Excel で新しいワークシートを開くと,Excel のウインドウ全域を使用するため,呼び出し側の
変数の値等が一切見えず,これでは再帰呼び出しの大局的な動作手順を実感的に理解するのは
困難であるとの指摘を受けた。実際に動作の様子を画面上で追いかけてみると,再帰呼び出し
の特徴でもあり,理解を難しくしている大きな要因のひとつは,呼び出し時と戻り時に個々の
呼び出し時に引き渡されるパラメータの値の対応と,呼び出し元,呼び出し先の双方で共通し
て見えるメモリー領域の対応関係がどのようになっているのかを理解することが重要なので,
同時に呼び出し側の状態と呼び出された側の状態とがひとつの画面で同時に見えた方が,はる
かに理解が容易になると思われた。
この問題に対しては,Excel のワ-クシートずらして表示できれば事態はかなり改善されるは
ずであるが,現状ではそのような機能を実現する方法がみあたらないので,再帰呼び出しで呼
び出された側のメモリーレイアウトを,呼び出した側のワークシート上で,横にスクロールし
て表示するようにすれば,なんとか改善されるのではないと考えている。
(2) 対応する関数の種類の充実
現在のバージョンでは,式の中で関数を呼び出しているプログラムに対応している関数の種
類は多くない。筆者が自分で使用している範囲内では,新しい関数への対応作業自体はせいぜ
い数分の作業でおわるので,事前の準備段階で未対応の関数が現れた都度対応することでなん
ら支障はないが,今後不特定多数の学生にも自分で試せるように対応するためには,より抜本
的な対応が必要になるであろう。
(3) 画面表示をもっとアトラクティブに
処理過程を表示するとき,注意をうながす必要がある箇所等を,よりアトラクテティブな方
法で(例えば,該当箇所のセルのバックをブリンクさせる,自動実行させたときの次のステッ
プに移るまでの表示時間を指定できるようにする等)の意見が聞かれた。
現状では,どちらも Excel の VBA でサポートしている機能かどうか不明なので,今後のさら
なる検討を要する宿題となっている。
謝辞
本研究は商学部情報科学研究所共同研究『IT 利用教育の効果と課題』の一部として行われたも
のである。同研究会の山添謙,羽根秀也,木村昌史各先生には活発な議論と貴重な助言を頂きま
したことを感謝いたします。
注
1) 情報処理学会,『日本の情報教育・情報処理教育に関する提言2005(2006.11改訂/追補版)』,情報処理
学会,2006
http://www.ipsj.or.jp/12kyoiku/teigen/v81teigen-rev1a.html
2) 同上,5.「手順的な自動処理」の構築について,p.4
3) 同上,5.「手順的な自動処理」の構築について,p.4
―45―
『情報科学研究』第18号
4) 同上,7.提言 B. 高等教育段階,p.6
5) この点については,代表的な表計算ソフトである MS Excel でセルに式を入力するとき,全角で入力して
も Excel の方で適当に半角に変換してくれることの副作用という面もあると思われる。
6) このような問題は,プログラミングの初心者だけでなく,プロのプログラマにもしばしば見られること
であり,これは「論理」の問題というよりは,
「心理」の問題と言うべき領域に属するものである。プロ
グラミング作業におけるこのような認知的側面の問題に対する研究は従来ほとんど行われてこなかった
と思われる。
7) 初心者向け教育用プログラミング言語を新たに設計する場合には,多様な制御構造やデータ型を持つ言
語は初心者に無用な混乱をもたらす元であるとの認識で,意図的に最小限の制御構造だけに絞り込むこ
とが多い。例えば,東京農工大学の電子情報工学科が開発した「若葉(WAKABA)」では,Java の統語法
に準拠しながらも,分岐構造は「If-else 式」だけに,反復構造は「loop{ }」の無限ループだけに
絞り込んでいる。
吉良智樹,並木美太郎,岩崎英哉,
「初心者入門用言語“若葉”によるプログラミング学習環境の設計と
実現」,コンピュータと教育 51-2,pp.9-16,情報処理学会,1999
8) 情報処理教育用に日本語プログラミング言語「ことだま on Squeak」を開発している慶應義塾大学政策・
メディア研究科では,初心者に代入文を理解させるには「~を~に代入する」という表現も「←」とい
う記号も初心者には馴染みのある表現ではないとして,さまざまな試行錯誤を繰り返した結果,代入文
に対応する日本語表現として「~を~に変える」という表現を採用している。
岡田健,杉浦学,松澤芳昭,大岩元,
「プログラミングの初歩概念を学ぶための日本語プログラミング環
境」,慶應義塾大学,2006
http://www.crew.sfc.keio.ac.jp/~turkey/paper/20060826%20SSS2006paper.pdf
9) C 言語の原典であるカーニハン&リッチーの「プログラミング言語 C」
(いわゆる K&R 本)では,有名な
最初の例題プログラム“hello, world”に続いて,
while((c = getchar()) != EOF)
が出てくるが,他の手続き型言語の経験者(K&R 本の初版の和訳が出版された1980年代初頭では,多く
が Fortran 経験者)が初めてこの文を見たときには,この「=」が「等号」ではなく「代入記号」である
ことに戸惑いを覚えたようである。
10) COBOL では,行の先頭は必ず命令キーワードであるので,後の仕様で「代入文」が追加された時も
「COMPUTE I = I + 1」のように,キーワード「COMPUTE」が先行しなければならない。Basic 言語も
当初は代入文の命令キーワードとして「LET I = I + 1」のように,キーワード「LET」が先行した。
11) もちろん変数のスコープの条件を満たしていなければならない。
12) Fortran の「DO 文」,COBOL の「PERFORM 文」,Algol の「for 文」,Basic の「For 文」など,多くの手続
き型言語の指定回数繰り返し構文では,For 文(及びこれに相当する文)には必ず1つの制御変数を指定
しなければならないが,C 言語の「for 文」の場合は,文法的には
for (初期設定 ; 継続判定 ; 再設定 ) {
}
であり,
「初期設定」
「継続判定」
「再設定」の部分には「無指定」も含めて(原則)任意の式が書けるの
で,制御変数を2つ以上指定することも,何も指定しないことも可能である。たとえば,「for ( ; ; )
{ }」で終了判定のない無限ループを作ることもできる。
13) 2つの数値データ(x と y)を一時記憶域を使わずに交換するロジックとして(多少トリッキーである
が)
x = x – y
y = y + x
x = y – x
という方法もある。
14) 上記の注(7)および(8)で紹介した教育用プログラミング言語の開発事例も,その根本は初心者に最適な
プログラミング言語をめざしてそれぞれの研究者が研究を行った成果の一環である。
15) さきに例示した「2つのデータの交換」の部分を C 言語の関数として記述する場合には,
「数を“参照呼
び出し”で渡さなければならない」という知識が必須であり,このことは引数のデータ型によって「値
呼び出し」か「参照呼び出し」かの違いがあること,ひいては最小限の「データのアドレス」の概念を
知っていることが要求される。
参考文献
[1]情報処理学会,
『日本の情報教育・情報処理教育に関する提言 2005(2006.11 改訂/追補版)』,情報処
『情報科学研究』第18号
―46―
理学会,2006
http://www.ipsj.or.jp/12kyoiku/teigen/v81teigen-rev1a.html
[2]ブライアン・B・カーニハン,デニス・M・リッチー著,石田晴久訳,『プログラミング言語 C 第2版
ANSI 規格準拠』,共立出版,1989
[3]矢沢久雄,『プログラミングのセオリー
プログラムの価値を高める“定石”を学ぶ』,技術評論社,
2008/12/25
[4]ジェラルド・M・ワインバーグ著,木村泉,角田博保他訳,『プログラミングの心理学――または,ハ
イテクノロジーの人間学
25 周年記念版』,毎日コミュニケーションズ,2005
[5]山本哲史,「これが正しいプログラミング作法だ」
,『日経ソフトウエア』,2007 年7月号,pp.66-87
[6]マイクロソフト,
『Microsoft Visual Basic Programming System for Windows リファレンス』,マイクロソフ
ト,1993
[7]マイクロソフト,
『Microsoft Visual Basic Programming System for Windows プログラミングガイド』,マイ
クロソフト,1993
[8]プロジェクト A&できるシリーズ編集部編,『できる大事典 Excel VBA 2000/2002/2003 対応』,インプ
レスジャパン,2004
[9]川口輝久・河野勉,『かんたんプログラミング Visual Basic6基礎編』,技術評論社,1999
[10]川口輝久,『かんたんプログラミング Visual Basic 2005 基礎編』,技術評論社,2007
[11]土屋和人,『Excel VBA パーフェクトマスター』,秀和システム,2001
[12]大岩元監修,松澤芳昭・杉浦学編著,
『ことだま on Squeak で学ぶ論理思考とプログラミング』,イーテ
キスト研究所,2008
[13]岡田健・杉浦学・松澤芳昭・大岩元,
「プログラミングの初歩概念を学ぶための日本語プログラミング
環境」,慶應義塾大学,2006
http://www.crew.sfc.keio.ac.jp/~turkey/paper/20060826%20SSS2006paper.pdf
[14]吉良智樹・並木美太郎・岩崎英哉,
「初心者入門用言語“若葉”によるプログラミング学習環境の設計
と実現」,コンピュータと教育 51-2,pp.9-16,情報処理学会,1999
[15]木暮啓一,『Visual Basic 2005 乗り換えガイド』,秀和システム,2007
Summary
Programming beginners who are learning a computer programming language such as the Basic or the C,
often meet with difficulties that prevent them from understanding the concept of sequential processing of
computers. Sequential processing that are performed within the computer hardware is not familiar to them,
and it is not easy for them to make a concrete and accurate image of the processing. For the worse, the process
must be described without any ambiguity that is permitted among our human communication.
To overcome these barriers, the author proposes the necessity of visualization tools that depict the minute
process which is described by a programming language, and has developed a visualization tool for the Basic
language.
―47―
『情報科学研究』第18号
Fly UP