17
並列処理プログラミング教育における Scratch の可能性についての考察 Consideration of the possibility of Scratch as a programming education tool for parallel processing programming 喜家村 奨 Susumu Kiyamura 要約 いくつかの先進諸国では,プログラミング教育が小・中学校のカリキュラムに既に導入されて おり,日本においても 2020 年度に向けてその準備が進んでいる.しかし,今まで専門家の作業 であったプログラミングを一般の学生達に教育することは容易ではない.その理由の 1 つとし て,プログラミング教育の指導法が確立されていないことがある.このような現状の中,プログ ラミング初級者のための教育ツールである Scratch が国内外で注目されている.更にインターネ ットサービスが多様化し,システムのネットワーク化が進む今日,並列処理プログラミング教育 についても,真剣に考えなければならない状況にある.本稿では,Scratch が並列処理プログラ ミング教育ツールとしても有効であることを並列処理における様々な問題を例示することによっ て示す.また,現状の Scratch の並列処理機能についても検証し,その問題点を考察する. キーワード:プログラミング教育,並列処理プログラミング,ネットワークシステム,ICT 活用 Abstract In some developed countries, programming education has already been introduced in curricula of ele mentary and junior high schools, it is progressing to be ready for the 2020 fiscal year in Japan. How ever, it is not easy to teach students programming that is a work of experts. One of the reasons, is that a teaching method of programming education has not been established. In this situation, as an educational tool for programming beginners, Scratch has been attracting attention at home and abroad. In addition, Internet service is diversified, and as today’s network systems progress, for the parallel processing pro gramming education, there is a situation that must be seriously considered. In this paper, we show by example the various problems in parallel processing that Scratch is also effective as a parallel processing programming education tool. It also examines the parallel processing capabilities of the current Scratch by considering the problems. Keywords : programming education, parallel processing programming, network system, use of ICT 人間科学部研究年報 平成 28 33

Scratch の可能性についての考察...とである.本稿では,Scratch での並列処理プログラミングで重要な機能ついて説明する.また Scratch のメッセージ通信について,その振る舞いを検証する.さらに加えて,Scratch

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

並列処理プログラミング教育におけるScratch の可能性についての考察

Consideration of the possibility of Scratch as a programming educationtool for parallel processing programming

喜家村 奨Susumu Kiyamura

要約いくつかの先進諸国では,プログラミング教育が小・中学校のカリキュラムに既に導入されており,日本においても 2020年度に向けてその準備が進んでいる.しかし,今まで専門家の作業であったプログラミングを一般の学生達に教育することは容易ではない.その理由の 1つとして,プログラミング教育の指導法が確立されていないことがある.このような現状の中,プログラミング初級者のための教育ツールである Scratch が国内外で注目されている.更にインターネットサービスが多様化し,システムのネットワーク化が進む今日,並列処理プログラミング教育についても,真剣に考えなければならない状況にある.本稿では,Scratch が並列処理プログラミング教育ツールとしても有効であることを並列処理における様々な問題を例示することによって示す.また,現状の Scratch の並列処理機能についても検証し,その問題点を考察する.

キーワード:プログラミング教育,並列処理プログラミング,ネットワークシステム,ICT 活用

Abstract

In some developed countries, programming education has already been introduced in curricula of ele­

mentary and junior high schools, it is progressing to be ready for the 2020 fiscal year in Japan. How­

ever, it is not easy to teach students programming that is a work of experts. One of the reasons, is that a

teaching method of programming education has not been established. In this situation, as an educational

tool for programming beginners, Scratch has been attracting attention at home and abroad. In addition,

Internet service is diversified, and as today’s network systems progress, for the parallel processing pro­

gramming education, there is a situation that must be seriously considered. In this paper, we show by

example the various problems in parallel processing that Scratch is also effective as a parallel processing

programming education tool. It also examines the parallel processing capabilities of the current Scratch

by considering the problems.

Keywords : programming education, parallel processing programming, network system, use of ICT

人間科学部研究年報 平成 28年

― 33 ―

第 1章 はじめに

アメリカやイギリスなどの先進諸国では,プログラミング教育の必要性が重要視されており,

既に初等,中等教育において,プログラミング教育が一般化されている(1).日本でも,文部科学

省が「2020年代に向けた教育の情報化に関する懇親会 最終まとめ」(2)に

「高等学校では,履修率が約 2割と考えられる現状から,全ての生徒がプログラミングを学

ぶこととするとともに,中学校においては計測・制御に加えて動的コンテンツ等に関するプロ

グラミングを学ぶようにすること,小学校においてはプログラミングの体験的な学習機会を確

保することなどが検討されている.」

と示している.この文章からも今後,日本においてもプログラミング教育の一般化がすすむこと

が予想される.しかし,今まで専門家の職業とされてきたプログラミングを一般的学問として教

えるには,教える人材の不足,教育コンテンツ・インフラの不整備,指導手法の未確立など様々

な問題がある.

このように,いかにプログラミングを教育するかが情報教育の課題なっている状況にあって,

初心者のプログラミング教育ツールとして世界で利用されているツールの 1つに米国 MIT で開

発された Scratch がある1.Scratch はビジュアルプログラミング言語の一つで,ブロックを組み

立てるようにプログラミングができ,細かな文法ミスなどにとらわれずにプログラムの構造を設

計することに注力できる.また,主に画面上のキャラクタを操作する(動かしたり,色を変えた

り,音を出したりする)ゲームを作る感覚でプログラミングができるようになっており,画面を

みながら直感的に自分のプログラムが正しく動いているかが確認できる点で初心者にも有用であ

るとされている(4)(5).

更に IT システムの現状について,もう 1つ考えなければならないことがある.それは,現在

の IT システムの多くはクラウド上の複数のコンポーネント(サービス)を結合してシステムが

構成されており,今までのプログラミング教育でなされてきたプログラミング言語を理解すれば

プログラミングができるという時代ではなくなりつつある点である.つまり,これからの IT シ

ステムを構築するためには,同時並列の動作する複数のコンポーネントが実行されるシステムに

おいて,どのような問題が発生し,それをどのように解決するかをプログラムの制作者は理解し

ている必要がある.このような理由から,これからのプログラミング教育では学習者が並列処理

についての学習することが重要である.幸いにして,Scratch は初心者向けプログラミング教育

ツールではあるが,オブジェクトが並列実行されるように設計されている.つまり,Scratch を

プログラミング教育に用いることで,同時に並列処理プログラミング教育も可能であるというこ

────────────────────────────────────────────────1 日本国内の Scratch 登録ユーザは 2015年に 5万人,2016年は 9万人にまで増えた.約 1.8倍の伸び率で,今までにない関心の高さを示している(3).また本稿で使用した Scratch のバージョンは 2016年 8月時点の Scratch 2.0である.

人間科学部研究年報 平成 28年

― 34 ―

とである.本稿では,Scratch での並列処理プログラミングで重要な機能ついて説明する.また

Scratch のメッセージ通信について,その振る舞いを検証する.さらに加えて,Scratch の並列処

理機能の拡張について考察する.

本稿の構成は,以下のとおりである.まず,次の 2章では Scratch の概要について説明する.

3章では Scratch における並列処理プログラミング手法を実例をあげて説明する.4章では

Scratch のメッセージ通信について,その振る舞いについていくつか検証してみる.5章では並

列処理システムの代表的な問題である「5人の哲学者の問題」を Scratch で実装する.最後に 6

章では Scratch の現在,実装されている並列処理機能について考察する.

第 2章 Scratch について

Scratch は米国 MIT(マサチューセッツ工科大学)のメディアラボ ライフロングキンダガー

デングループによって開発された子供向けプログラミング開発環境である.ブロックをつなげる

ようにして,プログラムを作成していく.2013年には,バージョンが Scratch 2.0となり,今ま

でのバージョンと異なり Web ブラウザ上で動作するようになり更に利用しやすくなった.以

下,Scratch の構成とプログラミングスタイルについて説明する.

2.1 Scratch の構成

Scratch の画面構成は図 1のようになっている.Scratch では,①ステージに配置したスプライ

トオブジェクトのためのプログラムをスクリプトエリアに記述していくことによって全体の処理

を記述する.他のプログラミング言語のように,メインルーチンという概念はなく,あくまで

個々のオブジェクトの振る舞いを記述していく.

②スプライトリスト内のスプライトをクリックすると,③スクリプトエリアがそのスプライト

のスクリプトエリアに切り替わる.ここに④ブロックパレットにある様々な機能ブロックをドラ

ッグし,結合することによってプログラムを記述していく.例えば,左右の矢印キーで猫を操作

するプログラムは図 1のように記述できる.

並列処理プログラミング教育における Scratch の可能性についての考察

― 35 ―

2.2 Scratch のプログラミングスタイル

Scratch では,発生したイベント(例えば緑の旗が押されたなど)に対して,それぞれのオブ

ジェクトがどのように振舞うかを記述していく.このようなプログラムをイベント駆動型のプロ

グラムという.またそれぞれのイベントごとの処理をイベント(メッセージ)ハンドラという.

Scratch では 1つのオブジェクトが複数のイベントハンドラを持つ場合,それぞれのイベントハ

ンドラが並列に処理されることに注意する必要がある.このことについては,以下の詳しく説明

する.更にオブジェクトは完全に独立して動作するため,オブジェクト同士が共同して処理をす

るためには,オブジェクト同士の通信が必要となる.

第 3章 Scratch のおける並列処理機能の実現

この章では,並列処理のための機能(通信,共有リソースの管理,プロセス動的生成)を

Scratch でどのように実装できるかを説明する.さらに並列処理プログラミングおいて注意しな

ければならない問題についても例をあげて説明する.

また,本稿では,並列動作する実体について,一般的な並列処理に関する文章では“プロセ

ス”と表記し,Scratch のプログラムの説明に関する文章では,“オブジェクト(またはスプライ

ト)”と表記することとする.

3.1 並列プロセスの記述

まず,最初に Scratch における並列プロセスの記述方法について説明する.C や Java 言語な

どのプログラムでは,ライブラリを利用するなど特殊な方法を利用しないと並列動作するプロセ

スを記述することができない.しかし,Scratch では簡単に並列プロセスが記述できる.図 2の

ステージ上には,猫とオウムが行き来している.(1)がオウムのプログラムで(2)が猫のプロ

図 1 Scratch の画面構成

人間科学部研究年報 平成 28年

― 36 ―

グラムである.オウムと猫は,それぞれは緑の旗がクリックされると動き出し,端にあたると反

転する.この 2匹の動作は全く独立して実行される.つまり Scratch でスプライトのためのプロ

グラムを記述することは,並列動作する個々のプロセスを記述することに他ならない.このよう

に Scratch は簡単に並列プロセスの処理を記述することができる.このことは,従来からのプロ

グラミング環境になれているプログラマにとっては違和感を覚えるかもしれないが,これが

Scratch 流のプログラミングである.つまり Scratch では main ルーチンをみつけて,プログラム

全体の動きを把握するというような読み方はできない.プロセス間の関係性を理解し,全体がど

う動作するかをイメージできなければ正しくプログラムが動かない.これが Scratch が並列処理

プログラミング教育のツールとして有効である 1つの理由である.

3.2 プロセス間通信

並列動作するオブジェクト同士が情報を交換,または同期をとるためには,プロセス間での通

信が必要である(7)(8).通信の方法としては,共有変数を利用する方法と,メッセージ送って通信

する方法の 2つが考えられるが Scratch では,この両方の方法が利用可能である.以下,それぞ

れの方法について説明する.

(1)共有メモリを利用した通信

共有メモリによる通信では,あるオブジェクトが

共有メモリに値を書き込み,それを他のオブジェク

トが読み出すことによって情報を交換(または同

期)する.Scratch で共有メモリを利用するには,

変数を定義するときに図 3に示すように「すべての

スプライト用」と設定するだけでよい.このように

設定することによって,この変数は共有変数とな

り,どのオブジェクトからでもアクセスできるようになる.ただし,どのオブジェクトからでも

読み書きが可能で,しかも上書きができてしまうので,書き込みを制限するなどのアクセス制御

図 2 並列プロセスの記述例

図 3 共有メモリの設定

並列処理プログラミング教育における Scratch の可能性についての考察

― 37 ―

が必要な場合は,プログラムの作成者が注意しなければならない.

(2)メッセージ通信による情報交換 1(メッセージを送る)

メッセージ通信する場合,Scratch には送信用ブロックとして「メッセージを送る」ブロック

と「メッセージを送って待つ」ブロックの 2種類のブロックが用意されている.送信側はこの 2

つのブロックのうち,いずれかのブロックを使ってメッセージを送信する.受信側は「メッセー

ジを受け取ったとき」ブロックで通信を待つ.送信側が送信ブロックを実行すると,ただちに受

信側がメッセージを受け取り処理が実行される.また Scratch のメッセージ通信の形態はブロー

ドキャスト通信であり,受信側が複数のオブジェクトでも構わない.送信が起こったときに,受

信ブロックで待っている全ての受信オブジェクトがそのメッセージを受け取って処理を実行す

る.図 4はブロードキャスト通信のプログラム例である.図 4(1)はメッセージの送信者であ

る猫オブジェクトのプログラムである.猫は「よーいどん!」と叫んだ後,「メッセージを送る」

ブロックでメッセージを送る.図 4(2)と(3)が受信側のコウモリと犬オブジェクトのプログ

ラムである.どちらも猫が送信したメッセージを受け取とった後,右端に向かって走り出す.猫

が 1度だけメッセージを送信すると,そのメッセージは,コウモリと犬オブジェクトが同時に受

け取る.図 4(4)の受信プログラムのリスト log をみると受信メッセージ処理が実行され 2匹

が走りだしたことが分かる.

(3)メッセージ通信による情報交換 2(メッセージを送って待つ)

送信側で「メッセージを送って待つ」ブロックを利用すると,送信側のプログラムは受信メッ

図 4 メッセージ通信による情報交換

人間科学部研究年報 平成 28年

― 38 ―

セージハンドラの処理が終了するまでウエイト状態となる.図 5(1)は送信側(猫オブジェク

ト)のプログラムで,2回の送信をおこなった場合の処理の進み具合をリスト log にロギングし

ている.図 5(2),(3)は受信側(コウモリとペンギンオブジェクト)のプログラムで,受信

後,それぞれ長さの異なるループ処理を実行した後に log への書き込みを処理をしている.この

プログラムを実行し,リスト log に書き込まれた内容をみると「送って待つ」ブロックの送信直

後の log への“送信 1処理完了”の書き込みは,2つの受信イベントハンドラからの log の書き

込みが終った後になっている.つまり,送信側の処理は,2つの受信メッセージハンドラ両方の

処理が終了するまで待たされ,受信側の処理が終了してから,「送って待つ」ブロックの次の処

理(log への書き込み処理)が行われることがわかる.

3.3 並列処理における排他制御のついて

複数のオブジェクトが並列に処理する場合は,それらの共有するリソースへのアクセスを排他

的に制御する必要がある.以下にその方法について説明する.

(1)排他制御(セマフォを用いた単純な排他制御)

共有リソースの排他制御の方法としては,ダイクストラが提唱したセマフォを利用する方法が

ある(7)(8).Scratch では共有変数が簡単に利用できるので,セマフォを実現することは簡単であ

る.図 6はセマフォを利用して共有リソースを排他制御している例である.

図 5 送って待つブロックを使ったメッセージ通信

並列処理プログラミング教育における Scratch の可能性についての考察

― 39 ―

猫オブジェクトと犬オブジェクトはどちらもボールで遊びたい.しかしボールは 1つしかな

い.よって,猫と犬は交代でボールを使うことになる.このボールが猫と犬にとっての共有リソ

ースであり,排他制御の対象となる.図 6(1)は猫のプログラムである.もしセマフォの値が 1

なら,0をセットしてボールを使う.もし,0ならボールが他のオブジェクトによって使われて

いるので,ボールが使えるようになるまで待つ.犬のオブジェクトのプログラムも処理の内容は

同様である.

ここで 1つ注意しなければならないことがある.それは,セマフォの値の評価と値の更新処理

の間に,他の処理が実行されないことを保障できなければ,セマフォが正しく動作しないことで

ある.通常,図 6(1)のようにセマフォの値を評価し,そのすぐあとに値の更新をすれば問題

はないはずであるが,図 6(2)のように評価の後に処理(ボールであそぼーと 1秒言う)を加

えると,複数のオブジェが同時にセマフォにアクセスしたときに矛盾が生じる可能性がある.制

御系の処理プログラムなどでは,値の評価と更新を同時に行うコードが用意されているが

Scratch のプログラムではそのようなコードは存在しない.よって,セマフォの値の評価の後,

値を更新するまでに,他の処理が割り込まないことを保障できない.このような状態をなくす 1

つの方法としては,待ち行列を利用する方法がある.以下にその方法について説明する.

(2)メッセージ通信と待ち行列を用いた排他制御

(1)で説明したセマフォを用いた排他制御では,セマフォの値の評価と更新処理の間に他の処

理が割り込まないことが保障できないと矛盾が生じる可能性がある.そこで,ここでは,待ち行

列を利用してリソースを排他制御する方法を示す.また,共用リソースを利用するオブジェクト

と管理するオブジェクトの間は,メッセージ通信で情報交換するようにしている.

図 6 セマフォの実装

人間科学部研究年報 平成 28年

― 40 ―

図 7は共有リソースを管理するオブジェクトのプログラムである.リスト req_q がリソースの

待ち行列にあたる.リソースの利用を要求するオブジェクトは,リソース管理オブジェクトにリ

ソースの利用を要求する.リソースの管理オブジェクトはリソースの利用者がいないとき,待ち

行列の最初を読み出し,そこに書かれているオブジェクトにリソースの使用を許可する.使用し

ているオブジェクトから開放のメッセージが届くと,リソースを開放し,次の要求オブジェクト

にリソースの使用を許可する.

この方法なら,リクエストは常に待ち行列にたまり,1度に 1者にしかリソースの許可,開放

を行わないので,先ほどのセマフォを使ったときのような不都合は起こらない.リストへの要素

の追加と値の更新は 1つのブロックで処理されるので,他のオブジェクトが同時にアクセスして

不都合が生じることがないからである.

3.4 クローンによるプロセスの動的生成

Scratch では,「クローンを作る」ブロックを使うと,そのオブジェクト(または他のオブジェ

クト)のクローンを生成することができる.クローンはもとのオブジェクトのスクリプトを実行

することに加え,「クローンされたとき」ブロックを使うことによって,クローニングされた直

後の処理も記述することができる.図 8はりんごオブジェクトが多数,上から落ちてくるプログ

ラムである.オリジナルのりんごオブジェクトは緑の旗がクリックされる後,ずっとランダムな

間隔で自分のクローンを生成し続ける(図 8(1)).生成されたクローンは画面上方のランダム

な位置から落ちてくる(図 8(2)).

図 7 メッセージ通信と待ち行列を用いたリソースの管理

並列処理プログラミング教育における Scratch の可能性についての考察

― 41 ―

第 4章 Scratch のメッセージ通信の検証と対策

並列処理プログラムを記述する場合,プロセスやメッセージ通信の振舞いについて,正しく理

解しておかないとプログラムが正しく動作しないことがある.そのような観点から,この章では

Scratch のメッセージ通信動作について検証してみる.

4.1 送信が多重に起こった場合の振る舞いについての検証

ここではまず,「メッセージを送る」ブロックを使用し,受信メッセージハンドラが処理途中

に新たにメッセージが送信されてきた場合,Scratch はどのような挙動をするか検証してみる.

図 9(1)は送信側のプログラムでメッセージの送信を 5回繰り返し実行している.図 9(2)

は受信側のプログラムで,メッセージを受信するごとに受け取った回数をリスト log に書き込ん

でいる.このリスト log の内容を見ると 1回の送信ごとに,受信メッセージハンドラが受け取っ

た回数をちゃんとリスト log に書き込んでいることが分かる(図 9(3)).つまり 5回の送信そ

れぞれに対する受信メッセージハンドラの処理が完了していることが分かる.では,受信メッセ

ージハンドラが処理に時間を要してしまった場合はどのような挙動をするのだろうか.図 9(4)

は(2)の受信メッセージハンドラの処理をメッセージ受信後,ループ処理をしてから,リスト

への書き込みをするように変更している.このように変更し,リスト log の結果をみてみると,

図 9(5)のように 5回の通信を行っているにも関わらず,受信側は最後のメッセージハンドラ

の処理しか完了していないことが分かる.つまり受信メッセージハンドラの処理途中に新たにメ

ッセージが送信されてくると,現在実行中の受信メッセージハンドラの処理がキャンセルされて

しまう.もし,このようにメッセージハンドラの処理が途中でキャンセルされることに問題があ

る場合は 3.2(3)で紹介した「メッセージを送って待つ」ブロックを利用するとよい.

図 8 クローンによるプロセスの動的生成

人間科学部研究年報 平成 28年

― 42 ―

4.2 デッドロックの検証

「メッセージを送って待つ」ブロックを使用すると,受信メッセージハンドラの処理が終るま

で,送信側のスクリプトがウエイト状態になることは 3.2(3)で示したとおりである.では,こ

のブロックを送信側受信側の両方で使った場合,デッドロックは起こらないのだろうか.

図 10(1)は猫オブジェクトのプログラムで,猫オブジェクトはメッセージ 1を送った後,メ

ッセージ 1の受信応答(メッセージ 1.ack)を待ち,受信応答が返ってきたとき,次のメッセー

ジを送信する.図 10(2)は犬オブジェクトのプログラムで,メッセージ 1を受け取った後,メ

ッセージ 1の応答メッセージを送りコスチュームを次に変える.通信が問題なく処理されると犬

のコスチュームが次々と変わり続けるはずである.しかし実行するとそうはならない.つまりデ

ットロックが起こる.その理由は両オブジェクトが相手の受信メッセージハンドラの処理終了を

待つ状態になるからである.このように「メッセージを送って待つ」ブロックを用いて,通信す

る場合はデッドロックに対する注意が必要である.

図 9 送信の多重化されたときに受信側の振る舞いの検証

並列処理プログラミング教育における Scratch の可能性についての考察

― 43 ―

4.3 複数の受信メッセージハンドラが同時に受信した場合の振る舞いの検証

1つのメッセージハンドラに同時に複数のメッセージが送られた場合は 4.1で示したように,

先に実行されているメッセージハンドラの処理がキャンセルされた.では,1つのオブジェクト

に複数のメッセージハンドラが記述されており,それらのメッセージハンドラに同時にメッセー

ジが送信された場合,そのオブジェクトの処理はどのようになるのだろうか.

図 11の例では,猫オブジェクトのプログラムは他の 3つのオブジェクトからメッセージ 1,

メッセージ 2とメッセージ 3をそれぞれ 2回ずつ受信する.各送信オブジェクトが 2回ずつ,メ

ッセージを送信した場合,それぞれのメッセージハンドラが書き込んだリスト log の内容をみる

と,各メッセージハンドラの最初の log への書き込み(101, 201, 301)は全ての実行されてお

り,かつ,処理の終了直前の log への書き込み(1001, 2001, 3001)も書き込まれている.つま

り,それぞれのメッセージハンドラの処理は 4.1のときのように処理がキャンセルされることは

なく,全く独立に最後まで処理されていることが log への書き込み順序でわかる.このことか

ら,1つのオブジェクト内に複数のメッセージハンドラが記述されている場合,それぞれのメッ

セージハンドラは並列に実行される.このことを理解しておかないとオブジェクト内の変数の更

新が上書きされるなどの問題が生じる可能性があるので注意が必要である.

図 10 デッドロックに検証

人間科学部研究年報 平成 28年

― 44 ―

第 5章 「5人の哲学者の問題」の実装

ここでは,3章で示した待ち行列による共有リソースの管理方法を用いて,有名な並列プロセ

スにおけるデッドロックの問題である「5人の哲学者の問題」をプログラミングしてみる.

5.1 5人の哲学者の問題

ダイクストラが提案した「5人の哲学者の問題」(8)のシナリオは以下の通りである.

5人の哲学者が 1つの寮に住んでいる.哲学者はいつもは自分の部屋で考え事をしている

が,お腹が空くと食堂に食事をしにやってくる.食堂には円卓があり,そのまわりには哲学

者の名前が書いた椅子が 5脚置いてある.哲学者の名前は哲学者 0,哲学者 1,哲学者 2,

哲学者 3,哲学者 4であり,この椅子は反時計回り置かれていた.各哲学者の左側には金の

フォークが置かれており,中央にはスパゲッティの入った大きな皿が置あり,皿が常に満杯

になるように給仕されていた.哲学者はお腹が空くと食卓に来て,自分の椅子に座り,まず

左に置いてあるフォークをスパゲッティに突き立てる.しかし,これを口に運ぶためには自

分の右側のフォークが必要である.食べ終わると哲学者はまた自分の部屋に戻って,また考

え始める.

この哲学者の問題のオブジェクトの構成例を図 12に示す.システムには 5つの哲学者と 5の

フォークオブジェクトが存在し,フォークを取り上げるメッセージ(pickup.{req,ack})とフォー

クを置くメッセージを(putdown.{req,ack})を通信する.

図 11 複数のメッセージハンドラの動作の検証

並列処理プログラミング教育における Scratch の可能性についての考察

― 45 ―

5.2 Scratch での 5人の哲学者の実装例

図 13(1)には,哲学者 0のプログラムを示す.まず,哲学者は空腹になると円卓に座りにく

る.続いて,自分の左側のフォークを持とうとする(0pickup0.req メッセージの送信),左側の

フォークを持つことができれば(0pickup0.ack の受信ができれば),続いて,自分の右側のフォ

ークを持とうとする(0pickup1.req メッセージの送信),右側のフォームも持てれば(0pickup1.

ack の受信ができれば),スパゲッティを食べる.食べ終わると,左側のフォークを置き(0put-

down0.{req,ack}の送受信),続いて右側のフォークを置き(0putdown1.{req,ack}の送受信),また

自分の部屋に戻っていく.

次に共有リソースであるフォークの振る舞いについて説明する.図 13(2)はフォーク 0のプ

ログラムである.フォーク 0は哲学者 0と哲学者 4で共有される.それぞれの哲学者はフォーク

を持つために 0pickup0または 4pickup0メッセージを送信してくる.フォークオブジェクトはリ

クエストメッセージを待ち行列に追加する.フォークが誰も取っていない状態で,待ち行列が空

でなければ,待ち行列を読み出し,その要求をした哲学者にフォークの利用を許可する(ack の

送信).putdown がくるとフォークが利用可能となるので,再び待ち行列の確認をする.

もちろん,このシステムは,5人が同時に左側のフォークを持った状態になるとデッドロック

してしまう.デッドロックを解決する方法としては,①「左利きの哲学者がいることにする」,

図 12 5人の哲学者のプロセス構成図

人間科学部研究年報 平成 28年

― 46 ―

②「給仕に食堂には 4人以上入らないように哲学者の動きを制御させる」などの解法がある.興

味ある読者はデッドロックフリーになるようにプログラムを改造してみて欲しい.

第 6章 考察

この章では,並列処理プログラミングの効率化のために Scratch に必要な機能について考察する.

6.1 パラメータ付きメッセージ通信

Scratch のメッセージ通信ではパラメータの受け渡しができない.そのために同じような受信

メッセージハンドラの処理を何度も書く必要がある.例えば,猫が何か果物を買うメッセージを

送る場合を考える.もし,その果物が何かをパラメータで渡せれば,受信側のイベントハンドラ

は 1つ記述すればよい(図 14).しかし,今は,パラメータを付けてメッセージをおくことがで

きないので果物の種類分,イベントハンドラを用意しなければならない.

図 13 哲学者 0とフォーク 0のプログラム

図 14 パラメータ付きメッセージブロックのイメージ

並列処理プログラミング教育における Scratch の可能性についての考察

― 47 ―

6.2 複数のメッセージの選択受信処理

メッセージハンドラが並列で動作することは,デッドロックが起こりにくいなど有効な面もあ

るが,共有リソースを管理するオブジェクトなど複数のオブジェクトからのメッセージを受け取

る場合,いくつかのメッセージを選択的に受信できるブロックがあると便利である.Scratch の

通信はブロードキャストメッセージ通信なので,1つのメッセージで複数のオブジェクトからの

リクエストを受け取ることもできる.しかし,先に述べたように,パラメータを付加できないの

でブロードキャストで処理しようとすると,どのオブジェクトからのリクエストかが分からなく

なってしまう.図 15は 2つのメッセージを選択的に受信できるようなブロックがあるとして,5

人の哲学者のフォークオブジェクトのプログラムの一部を示した例である.

6.3 受信イベントハンドラがキャンセルされることについて

複数の送信者が同じメッセージを送る場合,1人が送って,受信側がその処理の途中で,もう

1人が同じメッセージを送ってくると,受信メッセージハンドラの処理が途中でキャンセルされ

てしまうことは先に述べた.これは通信がブロックされないという意味では有効であるが,処理

が途中で終ってしまったことを送信側が分からないことには少し気をつけなければならない.確

認応答メッセージを送ることが 1つの解決方法であるが,この点については,通信の特性をプロ

グラム作成者が理解し,プログラミングをする必要がある.

6.4 複数のクローンが存在する場合の通信について

同じオブジェクトのクローンがステージ上に複数存在する場合の通信は注意が必要である.な

ぜなら,メッセージ通信はブロードキャストであり,全てのクローンがメッセージを受信してし

まうからである.対策としては,クローンにユニークな ID を付加し,その ID を利用できるよ

うにブロックを拡張することなどが考えられる.

第 7章 おわりに

本稿では,Scratch における並列処理プログラミング手法を実例をあげて説明し,初心者向け

図 15 メッセージの選択受信のブロックのイメージ

人間科学部研究年報 平成 28年

― 48 ―

のプログラミング教育ツールといわれている Scratch が,実は高度な並列処理プログラミング教

育のために有効であることを示した.さらにメッセージ通信について検証し,通信が多重化する

と,メッセージハンドラの処理が途中でキャンセルされ,そのことを送信側のオブジェクトが知

ることができないことなどの問題点を指摘した.さらに Scratch の並列処理機構の機能拡張につ

いても考察,提案した.

Scratch で実現されているオブジェクト指向的なプログラミングスタイルがこれから先のプロ

グラミングスタイルとして主流になるかはともかく,Web 上の多くのシステムが多数のコンポ

ーネントが並列動作することによって実現されている今,本稿がシステムの開発をする技術者や

これからプログラミンを学ぶ学習者,また,プログラミング教育に携わる指導者のために有意義

なものになることを期待する.

謝辞

本稿の作成にあたり,本学 人間科学部 情報メディア学科の高橋参吉教授が的確なアドバイス

と今後の研究に対する助言を与えてくださったことに感謝します.また,研究のための時間と環

境を与えてくださっている帝塚山学院大学 人間科学部に感謝します.そして,いつも元気を与

えてくれる妻と子に感謝します.

参考文献⑴ 教育・学習分野の情報化に係わる国内外の動向と先進事例(総務省 HP より)

http : //www.soumu.go.jp/main_content/000311276.pdf(P.13)⑵ 文部科学省:「2020年代に向けた教育の情報化に関する懇親会 最終まとめ」

http : //www.mext.go.jp/b_menu/houdou/28/07/__icsFiles/afieldfile/2016/07/29/1375100_01_1_1.pdf(P.6)⑶ ZD Net Japan 2016年 8月 16日の記事

http : //japan.zdnet.com/article/35087480/

⑷ Scratch で学ぶプログラミングとアルゴリズムの基本 中植正剛,他著 日経 BP 社,2015⑸ Scratch ではじめよう!プログラミング入門 杉浦 学著 日経 BP 社,2015⑹ 並列処理プログラミングの原理 M. ベン-アリ著 渡辺榮一訳 啓学出版,1986⑺ 並列処理概論 渡辺勝正著 コロナ社,1991⑻ ホーア CSP モデルの理論,吉田信博訳,丸善株式会社,1992

並列処理プログラミング教育における Scratch の可能性についての考察

― 49 ―