トップ物理教育情報教育GPS考古学


    BASICでオブジェクト指向を学ぶ
     (オブジェクト指向は難しくない)

               プログラミング教育の勧め
      −− N88BASICでタートル・グラフィックス ーー
         



      N88互換BASIC for Windows95 の プログラム画面と実行画面
 

はじめに 


 以前、「情報処理」という3年の選択科目を担当していたとき、簡単なプログラミング教材として作成して、実践していたものを紹介いたします。
 当時、生徒が熱中して取り組んでいたことを思い出します。コンピュータは、MS−DOSマシーンで、その上で走るBASICを使っていました。
 その後、機械はWindowsマシーンに代わってしまい、その上では「BASIC」のような手軽に動く、プログラム言語が使えなくなってしまいました。また、自らプログラムを組んでコンピュータを動かす時代では無くなって来たと思い、序論でも書いたように、「プログラミング教育」を諦めてしまった。
 しかし、我々の現況を見ると、私が危惧していたように、コンピュータの動作原理すら知らずに、ソフトを使うというのが当たり前になり、与えられた狭い土俵の上でしかコンピュータを利用しない人ばかりで、”時代のトレンド”という”誘導”に流され、知らず知らずに「便利だ、便利だ」と言いながら、コンピュータ・ソフトに”使われている”のが実態だろうと思われます。
 ブラックボックスとしてのコンピュータを盲目に使うのではなく、コンピュータのしくみを知った上で、”コンピュータを動かす”自立した個人の重要さを、今更ながら痛感します。 

 プログラミング教育の勧め。( コンピュータは難しくない!)


 不思議なことに、我が国では、序論で書いたように、「情報教育」に於いてすら、コンピュータのしくみを詳しく教えようとしていないのです。
 コンピュータの動作原理は多くの人々が想像しているより単純です。
コンピュータを理解する近道は、自ら簡単なプログラムを作って動かしてみることだと思います。 また、与えられたソフトと違い、自由に工夫できる創造の世界があると気付くでしょう。
 とくに、早い段階での学校教育において「プログラミング教育の復活」が望まれます。

しかし復活を妨げるいくつかの障害があります。

 プログラミング教育の実践を妨げているもの


  @ Windows環境では、昔のBASICのような、素人でも簡単に使える言語がない。
 殆どの言語は、構造化プログラミングやオブジェクト指向プログラミングに適したように言語設計されているため、初心者には敷居が高く理解が難しい。

  A たとえ、BASICを教えても、将来それが役に立つとは思えない。

  B プログラミング経験を持つ教師の絶対数が極端に少ない。
 パソコンの黎明期には、プログラミングに関心を持ち、BASICで自作のプログラムを作った経験のある教師も多かったが、Windowsに移ってからは、簡単にプログラム出来る環境が失われたため、非常に少なくなっている。大学等の「情報」関係の卒業生でも、形だけのコンピュータ教育を受けただけの者が多く、生徒に自信を持って、プログラミングを教えることが出来る人材は少ない。

  C 生徒自身、プログラム作りの必要性を日常生活で感じていないので.関心が低い。
..等々
 これらのこともあって、高校で昔のような実践は殆ど不可能と考えていた。

 プログラミング教育は可能である


  しかしあるとき、最新のWindowsでも動くN88BASIC互換?のフリーソフトの存在を知り、試しに動かして見たところ、想像以上に素晴らしい出来のソフトで、古いパソコン上での操作を上回る扱い易さに驚いた。 作者の潮田 康夫 氏に感謝いたします。 N88互換BASIC for Windows95

   この上で、私が以前作った教材を使えば、上記の困難が克服できるのではと考えるようになった。

 その理由を前掲の4つの困難に即するかたちで説明すると

  @ 初心者でもたやすく理解できるBASIC言語を使うこと。
  
 BASICは、旧式の言語であるが、コンピュータの動作に忠実な設計なので、かえってコンピュータの動作を理解するのに役立つ


  A その上で、最新のプログラミングの基礎である構造化やオブジェクト指向のしくみを教えることにより、将来、他のプログラム言語への移行が容易になる。

 BASICプログラムですが、オブジェクト指向の観点から、TURTLEグラフィックスの全機能を実現しています。 欠点はあるものの、かえって、純粋なオブジェクト指向言語では隠されているオブジェクト内部の仕組みがそのまま見れるので、オブジェクト指向とは如何なるものか理解でき、より教育的である。
オブジェクト指向は、決してプログミング言語レベルの話ではなく、プログラム作成の作法を指すもので、BASICでも、オブジェクト指向の作法を使ってプログラムを書くことは可能である。
 オブジェクト指向の仕組みの理解なしに、最初からオブジェクト指向言語を使って初心者を教育することは、かえって、オブジェクト指向がきわめて難解であるかのような印象を与えることになり、逆効果である。
 プログラミングの醍醐味は細部の詳細から全体の構想の詳細まで、一人の力で見通せるようになれるところにある。(このBASICプログラムは短いので、それが可能である。 ぜひ、細部まで読み解いて戴きたい。 そのための教材であり、それを省くと価値は半減する。)
     オブジェクト指向言語はオブジェクト内部のしくみを隠蔽して、プログラムできるようにするための言語だから、コンピュータのしくみと、その上で動くプログラムのしくみを初めて学習しようとする者への入門用としては適さない言語である。 


  B プログラミング経験のない教師でも、BASIC言語なら短期間で使い方や言語仕様をマスターできる。

  また、この教材のプログラムを予習することで、プログラム方法を学ぶことができる。


  C 生徒が興味を持つ、カラフルな図形描画プログラムなので、意欲をもって課題に挑戦してくれる。

 また、オブジェクト指向はロボット操作やゲームのキャラクター操作につながることを説明すると、向学心のある生徒は、将来他の言語でプログラムの勉強をしたいと思うようになる。
(実際、Windowsでは、画面上に様々な機能を持った「部品」を配置していますが、「部品」はすべて、それぞれ機能を備えた「オブジェクト」として、設計されています。)


 以上の観点から、永くお蔵入りしていた教材プリントを紹介いたします。

註) 
  ここでいう”オブジュクト指向プログラム”とは、厳密なものではない。
  BASIC言語では厳密な意味のオブジェクト指向や構造化プログラミングを実現できる仕組みがない。

  オブジェクトの複製が簡単に作れない( ”オブジェクト型”=”クラス”ともいう がない)。
構造化プログラミングとは、プログラムをサブルーチンの集まりとして、記述する方法であるが、BASICでは、サブルーチン内に限定して使える局所変数(後述のスタック上に変数領域が確保されて元のプログラムに戻ったとき破棄される)が使えない。
 サブルーチンに引数を渡せない。..等々
  特にBASICはすべて大域変数(プログラム全体で共有して使う変数)しか使えないので、実習で生徒が戸惑うが、かえって教育的である。


タートル・グラフィック教材を使う前に   (重要!)


なお、この教材を使う前に、BASICの基礎的なプログラムを学習させる必要があります。
コンピュータはどのように動作するのかを教えることに重点を置く。

 たとえば、
@ (コンピュータは条件判断する機械) IF THEN GOTO 文。
 (通常は行番号の順に実行されるが、実行順を変え、ジャンプさせることができる)
実習例 占いプログラム
 ここで、文字列変数、INPUT文、PRINT文の学習
 プログラムのラベルを使い、プログラムも、プログラムの位置を名前で管理できることを教える。


A (プログラムの大部分は繰り返しループ) FOR NEXTループ を使った例
  (変数とは何か。データ・メモリーは名前をつけて管理する)
 実習例 級数計算
1〜100までの和、1/Nの和  等
 ここで、数値変数と、”=”が代入操作を意味すること。 IF文の = との違いの説明
 変数とはデータの記憶場所に名前をつけたものであることを理解させる。
 また、FOR NEXTループ(繰り返しループ)を、IF THEN GOTO 文 (条件ジャンプ命令)で書き直す課題を与える。

B  (サブルーチンのしくみ、高度な命令を作る) GOSUB文
 GOTO文との違いを説明する。
(初期コンピュータ EDSAC 以来、コンピューターはハードウェアのしくみとして、スタック・ポインターを持っていて、ジャンプ命令とならんで、CALL命令(サブルーチン呼び出し命令)を機械語レベルで備えている。)
 GOSUB文を実現するには、プログラムの戻り場所を記憶させる機構(スタック=仮置きする棚のようなもの)が見えない所に存在していることを教える。
 呼ばれたサブルーチンはRETURN文で元の呼んだプログラム位置に戻ること。(スタックから仮置きした番地を取り出す)。サブルーチンはプログラムのどの場所でも呼び出して、利用することが出来る。
 サブルーチン内でさらに(別のあるいは同じ)サブルーチンを呼び出す(多重呼び出し、再帰呼び出し)こともできる。(戻り番地をスタックに上重ねする。)・・・・(再帰呼び出しはBASICでは無理)
 サブルーチンは高度な命令のように見なせることを説明する。
 また、「BASICの1命令=機械語で作られたいくつかのサブルーチンを呼び出す操作」であることを説明する。

(註) プログラムを多くのサブルーチンの集まりとして記述し、プログラムやデータのブロック化や階層化を行うことにより、プログラムを見通しのよいものにする方法を「構造化プログラミング」と云う。

C TURTLEのサンプルを理解させるために
 LINE命令、   : を使った複文、    ’ を使った注釈行、SCREEN命令、CLS命令も説明する。
( 旧の N88BASIC のMANUALはネット上で入手できる。)


それでは、以下に、その教材プリントを示します
                 プリントのpdfはこちら

下の[課題]にある数10行のサンプル・プログラムのみで、タートルグラフックスの全機能を実現しています。

教材 BASIC で タートル・グラフィックス


       BASICでタートル・図形を描こう。

[タートル・グラフィックスとは]  

 LINE命令で図形を描くには、つねに始点、終点の座標を計算して命令を実行しなければならない。
我々が手で紙に図形を描く場合のように、ペンを動かしてペンの通ったあとが線として残るようにすれば、より楽に図形を描くことができるはずである。
このペンに相当するものとして「亀さん」(タートル)を用意しよう。
この亀さんに向きを変えろとか、前に進めとかの命令を与えて図形を描かせるイメージの図形描画法を「タートル・グラフィックス」という。

 亀に与える基本命令は、

ペンの上げ下ろし(上げると紙にペンが触れないので、亀が動いても線は描かれない。下ろすと描ける。)
   PEN UP (PU)
   PEN DOWN (PD)

前進命令(現在、亀が向いている向きへまっすぐ前進)
   FORWARD (FD)
 この場合別に、進む距離をドット数で与えなければならない。

方向転換命令(右回転と左回転)
   RIGHT TURN (RT)
   LEFT  TURN (LT)
この場合別に、回転角を与えなければならない。

の3タイプである。
 この他に、亀をホーム・ポジション(原点)に戻し、元の方向に向ける命令
   HOME (HM)
やペンの色を変える命令
   CHANGE COLOR (CC) がある。

[タートル・グラフィックの実現]

 これらの命令をBASICのサブ・ルーチンで実現している。(サブ・ルーチンとは何かについては、別紙プリント参照)
 それぞれの命令(サブ・ルーチン)の呼び出し方は
 ペン・アップは  GOSUB *PU で  
 ペン・ダウンは  GOSUB *PD で呼び出す。
 前進命令進む距離(ドット単位)を変数Lに代入して
             GOSUB *FD で、
 回転命令回転角(°単位)を変数KAKUに代入して
   右回転は    GOSUB *RT で
   左回転は    GOSUB *LT で呼び出す。
 ホーム・ポジション命令
             GOSUB *HM で呼び出す。  
 色を変える命令
             GOSUB *CC を呼ぶ。
 タートルの初期化命令(画面解像度やπの設定をおこなっている。)
             GOSUB *INIT を呼ぶ。

[サンプル・プログラムについて]

 メイン・ルーチンは100行から200行である。
 タートル・グラフィック用のサブルーチン群が1000行から1720行までに書かれている。
 2000行以降のサブルーチン *SIKAKU は、四角形を描くプログラムで、これは上のタートル・グラフィック用のサブルーチン群を使って作成している。
メイン・ルーチンの140行で *SIKAKU を呼び出している。


[課題
 以下のプログラムをキー入力しなさい。
コメント文  ’  から右の日本語の説明文 は入力しなくてよい。

100 GOSUB *INIT
110 GOSUB *HM
120 COL=3
130 GOSUB *PD
140 L=100:GOSUB *SIKAKU
200 END
1000 *FD:'前進  進む量は変数Lに入れて呼び出す。色変数COL
1010 X0=X:Y0=Y:X=X0+EX*L:Y=Y0+EY*L
1020 IF PN=1 THEN LINE(X0,Y0)-(X,Y),COL
1030 RETURN
1100 *RT:'右へ方向転換  回転角は変数KAKUに入れて呼び出す。
1110 THETA=THETA+2*PI/360*KAKU
1120 EX=COS(THETA):EY=SIN(THETA)
1130 RETURN
1200 *LT:'左へ方向転換  回転角は変数KAKUに入れて呼び出す。
1210 THETA=THETA-2*PI/360*KAKU
1220 EX=COS(THETA):EY=SIN(THETA)
1230 RETURN
1300 *PD:'ペン・ダウン(描画開始)
1310 PN=1:RETURN
1400 *PU:'ペン・アップ(描画中断)
1410 PN=0:RETURN
1500 *HM: 'ホームポジションに戻る。(画面の中央で下向きに設定)
1510 X=320:Y=200:EX=0:EY=1:THETA=2*PI/360*90:RETURN
1600 *INIT:'初期化  最初に実行すること。
1610 SCREEN 3:CLS 3:PI=3.1416:RETURN
1700 *CC:'change color 色を変える。
1710 COL=COL+1:IF COL>7 THEN COL=1
1720 RETURN
2000 *SIKAKU
2010 FOR I=1 TO 4
2020 GOSUB *FD
2030 KAKU=90:GOSUB *RT:GOSUB *CC
2040 NEXT I
2050 RETURN


 (参考) オブジェクト指向プログラミングは難しくない!

     

・オブジェクト指向プログラミングとは

 プログラムを、分割し、亀のようにひとまとまりの機能(データ+それを操作する小プログラム群)をもつ物(=オブジェクト)の集まりとして記述するプログラム手法。
 オブジェクト内部で使われる変数(=データ)や内部で動くプログラム(=内部ルーチン)は外部から隠されていて、直接操作できない。
 メソッドと呼ばれるサブルーチン群を通してのみ、操作するように制約されている。 その制約のおかげで、外部から見て、内部の詳細を知らなくとも、公開されたメソッドのみを使って、独立した(=オブジェクト)として、それを扱うプログラムが書ける。
 

プログラム中の変数についての解説

・ タートルオブジェクト内の変数隠れた内部変数で、外部から直接操作されない変数)
  X0 : 亀が進む前の位置のx座標値
  Y0 : 亀が進む前の位置のy座標値
  X : 亀の進んだ後の位置のx座標値
  Y : 亀の進んだ後の位置のy座標値
  THETA : 亀の向いている本当の角度(真下向きからの角度 ラジアン単位)  
  EX  亀の向きの単位ベクトルeのx成分  
  EY : 単位ベクトルeのy成分  
  COL : FD命令で引く線の色番号   
  PN : ペンが上がっていれば PN=0 (FD命令で線を描かない)
      ペンが下がっていれば PN=1 (FD命令で線を描く)   
  PI  π 円周率

・ タートルを操作する命令(メソッドと呼ばれる サブルーチン
 *HM 、*FD 、*RT 、*LT 、*PU 、*PD 、*CC 、*INT 

・ メソッドに渡す 変数(引き渡す数・・「引数」と呼ばれる)
     *FD に渡す L   、 *RT *LT に渡す KAKU

    
以上。


[課題]
  下の図形を描くサブルーチンを2100行以降に新たに追加しなさい。
  サブルーチンには新ラベルを付けて、メインルーチンの140行のGOSUB命令のラベル名を新ラベル名に変えて、プログラムを実行すること。
(注意 GOSUB *SIKAKUを利用する場合には、変数Iは SIKAKU内部で使っているので、別の変数を使うとよい。)

 
    *SANKAKU     *HOSI5         *HOSI8         *KAITEN1


        *KAITEN2          *UZU1                 *UZU2


       *UZU3            *ZYUBAKO             *HANABI1


[課題]
     カメ(タートル)をもう1匹増やすには、どうすればよいか、考えてみよう。
  
 ヒント 内部変数をもう1セット分増やす、どちらのカメへの命令か識別するための変数を追加する。等

・・・・・・・実際にBASICで実現するのは、大変なことを、理解させる。 → オブジェクト指向言語ならオブジェクトを型(ひな形)として定義するので、その型をもつデータをメモリー上に新たに確保するだけで済む。 実際にメモリー上に確保されたオブジェクトをインスタンス(具体物あるいは個別オブジェクト)という。インスタンスは何個でも増やすことが出来る。

補足 オブジェクト指向言語の利点 (インヘリタンス)


 BASICでは難しいが、プログラムを改良して、線描画だけでなく、亀の図形を動かすように、”機能を追加して進化させる”ことも、可能だろう。
 これを、オブジェクト型(クラス)の”継承(インヘリタンス)”といい。オブジェクト指向言語では、プログラムの重複部分を省略して追加・改良部分のみ書くだけで済むように、工夫されている。


 余談  (プログラムのソース・コード公開の重要性について)


 上に紹介したタートル・グラフィックスの実践は、必修教科「情報」が生まれる10年ほど前、学校に生徒用コンピュータ教室(LAN教室)が新設されたとき、その活用として学校独自の科目(3年文系選択科目)「情報処理」を設定して始めたものです。
 その開講に先だって指導計画を練った訳ですが、1学期はワープロによる「文書処理」の学習に当て、2学期には「BASICによるプログラム作成の学習および実習」を考えました。そのプログラミング課題として生徒の関心を惹きそうな上述のタートルグラフィックス実習を用意しました。
 さて、3学期には何をしようかと考えたのですが、卒業間近ですから、授業時数が限られ、腰を据えた新たな学習は無理です。そこでタートルグラフィックスの延長として、「3次元のタートル」を使って卒業作品を作らせたらどうだろうか、と思いついたのです。
 この「3Dタートル」は「LogoMotion」と名付けられたフリーソフト(東大・人知研・佐藤 隆氏作 http://hp.vector.co.jp/authors/VA000672/) で、描画タートルと視点タートルの2匹のタートルを備え、まず描画タートルで立体的な(遠近法を使って立体的にみせる)ワイヤーフレームを描かせたのち、それを眺める視点である視点タートルを宇宙船のように移動させて、そのワイヤーフレームを様々な角度や位置から眺めたり、中を通り抜けさせたりできる、というすぐれものです。 3Dですから、当時としては画期的なものだった。
 しかし、そのソフトは当時主流のNECのPC98でしか動きません。そして残念なことに、LAN教室にあるのはすべて、富士通のFMRで、グラフィックの仕組みが異なるためそのソフトは動かないのです。
 しかし、私はその魅力的なソフトを諦めきれませんでした。
 幸いなことに、それは、「オープン・ソース」、つまりコンパイル前のC言語とアセンブラで書かれた元のプログラムがすべて公開されていたのです。 つまり、動かない理由が、PC98固有のグラフィック・ルーチン(高速化のためアセンブラで書かれていた)を使用するためだと想像されるので、 それをFMR用のグラフィック・ルーチンに置き換えて、コンパイルすればFMRでも動くはずだと考えたのです。 そこで、FMR用のグラフィック・ルーチンを備えたC言語コンパイラを探したところ、「TurboーC」シリーズにFMR用があったことが分かり、早速それを手に入れました。
 グラフィック・ルーチンと思われるルーチンを虱潰しに探し、それを対応するFMR用グラフィック・ルーチンに置き換えて、コンパイルすると、あっけなくFMRで動いたのです。
 これで、やっと私の「情報処理」授業開講に自信がついたという次第です。

 この経験から、私は「オープン・ソース」の有り難みと重要性に、初めて気付かされました。(遅ればせながら、佐藤隆氏に感謝いたします。)
 現在、フリーソフトと銘打ったソフトが氾濫していますが、その殆どは、ソースコードを公開していません。私はそれらは「フリーソフト」の名に値しないものだと考えています。
 ソースコードを公開してはじめて、「社会的共有財産」として、誰もが”安心して”使える価値あるソフトになるものと考えます。

 最後に、その3Dタートルを実践しての「成果」を述べるべきでしょうが、正直に言って私の期待したような「成果」は得られませんでした。たぶん、授業が「3年文系対象」で女子生徒が殆どだったためか、「方向音痴」(失礼!(+_+:;) )な生徒が多く、立体的な構造物を作るのが苦手な上に、3Dの操縦が難しかったため、作品は「あらぬ向きに迷走する飛行船」が多かった。


        このページのトップへ

情報教育


情報教育序論



コンピュータの歴史


e-mail

ご感想等