9
高崎経済大学論集 第48巻 第4号 2006 105頁~113- 105 - 単純ごみ箱モデル・プログラムのPerlへの移植 A transplant of single garbage can program to Perl Tetsu FUJIMOTO Single Garbage Can Program in BASIC language (Takahashi, 1993) was transplanted with Perl language. Major tasks were (1) replace process flow crossings with GOTO phrase by control structure, (2) assign appropriate variable names, (3) replace operators. Because the target program was short, transplantation was not so difficult. But it may not be a precise transplant. 問  題 高橋(1993)による Single Garbage Can Program(「単純ごみ箱モデル・プログラム」以下 SGCPと略記する)は BASIC 言語によってプログラムされている(表1)。BASIC 言語によるプ ログラムを構造化プログラミング言語によって移植しようとする場合の課題にはいくつかあり得る が、本プログラムにかかわる問題及びそれに伴う課題としては以下のようなものがある。 第1に、処理の流れが交差している部分を、制御構造に書き換えるという課題である。例えば、 190290行のブロックにおいて、280行に「GOTO 200」とあり、290行に「GOTO 210」とある。 つまりこのブロックの中で、処理の流れが交差しているという問題があり、これを制御構造によっ て書き換える必要がある。 第2は、if then 文の書き換えである。複数の条件によって分岐させたい場合、BASIC 言語では 複数の if then 文を連ねて表現することになるが、構造化プログラミング言語では if elsif else を使 った書き方として、一つのブロックにまとめることになる。本プログラムでは、310340行のブロ ックが該当する。 第3は、370行にある「IF K<1000 THEN GOTO 200」である。プログラムの最後の方にある370 行から最初の方にある200行へとジャンプをしているのだが、書き換えに当たっては、190290のブロックをサブ・ルーチン化する必要性が考えられる。

単純ごみ箱モデル・プログラムのPerlへの移植€¦ · 単純ごみ箱モデル・プログラムのPerlへの移植 藤本 哲 A transplant of single garbage can program

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 単純ごみ箱モデル・プログラムのPerlへの移植€¦ · 単純ごみ箱モデル・プログラムのPerlへの移植 藤本 哲 A transplant of single garbage can program

高崎経済大学論集 第48巻 第4号 2006 105頁~113頁

- 105 -

単純ごみ箱モデル・プログラムのPerlへの移植

藤 本   哲

A transplant of single garbage can program to Perl

Tetsu FUJIMOTO

Single Garbage Can Program in BASIC language (Takahashi, 1993) was transplanted with Perl

language. Major tasks were (1) replace process flow crossings with GOTO phrase by control

structure, (2) assign appropriate variable names, (3) replace operators. Because the target program

was short, transplantation was not so difficult. But it may not be a precise transplant.

問  題

高橋(1993)による Single Garbage Can Program(「単純ごみ箱モデル・プログラム」以下

SGCPと略記する)は BASIC言語によってプログラムされている(表1)。BASIC言語によるプ

ログラムを構造化プログラミング言語によって移植しようとする場合の課題にはいくつかあり得る

が、本プログラムにかかわる問題及びそれに伴う課題としては以下のようなものがある。

第1に、処理の流れが交差している部分を、制御構造に書き換えるという課題である。例えば、

190~290行のブロックにおいて、280行に「GOTO 200」とあり、290行に「GOTO 210」とある。

つまりこのブロックの中で、処理の流れが交差しているという問題があり、これを制御構造によっ

て書き換える必要がある。

第2は、if then文の書き換えである。複数の条件によって分岐させたい場合、BASIC言語では

複数の if then文を連ねて表現することになるが、構造化プログラミング言語では if elsif elseを使

った書き方として、一つのブロックにまとめることになる。本プログラムでは、310~340行のブロ

ックが該当する。

第3は、370行にある「IF K<1000 THEN GOTO 200」である。プログラムの最後の方にある370

行から最初の方にある200行へとジャンプをしているのだが、書き換えに当たっては、190~290行

のブロックをサブ・ルーチン化する必要性が考えられる。

Page 2: 単純ごみ箱モデル・プログラムのPerlへの移植€¦ · 単純ごみ箱モデル・プログラムのPerlへの移植 藤本 哲 A transplant of single garbage can program

高崎経済大学論集 第48巻 第4号 2006

- 106 -

Page 3: 単純ごみ箱モデル・プログラムのPerlへの移植€¦ · 単純ごみ箱モデル・プログラムのPerlへの移植 藤本 哲 A transplant of single garbage can program

単純ごみ箱モデル・プログラムのPerlへの移植(藤本)

- 107 -

第4は、変数名の付け方である。BASIC言語ではシステム上の制約から、8文字までしか使え

ないことが多かった。8文字を超える変数名を使えないわけではなかったが、9文字目以降は無視

されていることが多かった。従って略記号的表記の変数名を使わざるを得なかった。しかし構造化

プログラミング言語では、もっと長い変数名を使うことが通常は可能である。それを生かして読み

やすいプログラムとすることが課題となる。

以上に加えて、ローカル変数とグローバル変数の使い分けが課題となろう。BASIC言語では区

別がなく全てグローバル変数であるが、構造化プログラミング言語ではローカル変数やグローバル

変数などを使い分けるのが通常のあり方である。本プログラムは短いので全てグローバル変数とし

ても混乱は少ないが、今後プログラムの改造を加えるのならば、きちんと使い分けておいたほうが

望ましい。しかし、本稿で用いる Perl言語は、「Perlでは、デフォルトで、すべての変数はグロー

バル変数です」(シュワルツとフェニックス(2003)、73頁)という特性があり、本稿ではグローバ

ル変数を主体としてプログラミングすることにする。

方  法

本稿では構造化プログラミング言語として Perlを用いる。作者は Larry Wallという人である。

Perlはインターネットでのウェブサイトの CGI(Common Gateway Interface)のためによく使わ

れるプログラミング言語である。但し Perlは、正確にはプログラミング言語ではなく、スクリプ

ト言語と分類されることもあるが、本稿のような用途においてはプログラミング言語として扱って

も差し支えないと思われるので、そのように呼ぶことにする。

本稿において Perlを用いる理由は、現時点において使いやすいからである。無償で使うことが

でき、多数の解説書が出版されている。また先にも触れたが CGIのための言語としてよく普及し

ている。近年オープン・ソース・ソフトウェアという類いのソフトウェアに注目が集まっているが、

Perlはそれに近いソフトウェアであると、一般の人には説明するのが無難であろう。様々なライ

センスの方式があるが、本稿では触れないことにする。

開発には、米国 Apple Computer社製の基本ソフトウェア(オペレーティング・システム)であ

る、MacOSX10.4(Tigar)のターミナルにおいて使うことができる、Perl version5.8.6を用いた。

テキスト・エディタである miを用いてプログラムを作成し、Perlを実行するという形である。

結  果

先に述べた課題に取り組むべく作り上げたのが、表2に示すプログラムである。

第1に、元のプログラムの190~290行における処理の流れが交差しているのを、制御構造によっ

て書き換えることが必要であった。本稿ではサブ・ルーチン g a r b a g e _ c a n _ p r o c e s s と

Page 4: 単純ごみ箱モデル・プログラムのPerlへの移植€¦ · 単純ごみ箱モデル・プログラムのPerlへの移植 藤本 哲 A transplant of single garbage can program

高崎経済大学論集 第48巻 第4号 2006

- 108 -

Page 5: 単純ごみ箱モデル・プログラムのPerlへの移植€¦ · 単純ごみ箱モデル・プログラムのPerlへの移植 藤本 哲 A transplant of single garbage can program

単純ごみ箱モデル・プログラムのPerlへの移植(藤本)

- 109 -

Page 6: 単純ごみ箱モデル・プログラムのPerlへの移植€¦ · 単純ごみ箱モデル・プログラムのPerlへの移植 藤本 哲 A transplant of single garbage can program

高崎経済大学論集 第48巻 第4号 2006

- 110 -

reset_garbage_canがそれに該当する。サブ・ルーチン garbage_can_processが呼び出されると、

先ず reset_garbage_canで三つの変数をリセットする。その後、変数 $energy_from_participants、

$total_effective_energy、$energy_required_by_problem、$energy_required_by_choiceといった変

数に値を与える。元プログラム280行の if then文に該当するのが、「# case of no entry」と書いて

ある所の if文である。ここで条件が真になった場合、サブ・ルーチン reset_garbage_canを呼び出

してリセットして、redo演算子によって、すぐ下に書いてある、while文の条件式の評価をせずに

ループの先頭に戻っている。そして元プログラム290行目の if then文の条件分岐を、do while文と

して表現することで、「case of no resolution」の場合にループを回している。

第2に、元プログラムの310~340行のブロック複数の if then文をif elsif else文で書き換えるこ

Page 7: 単純ごみ箱モデル・プログラムのPerlへの移植€¦ · 単純ごみ箱モデル・プログラムのPerlへの移植 藤本 哲 A transplant of single garbage can program

単純ごみ箱モデル・プログラムのPerlへの移植(藤本)

- 111 -

とが必要であった。しかしこの部分を書き換えるのは容易であった。

第3は、元プログラムの370行にある「IF K<1000 THEN GOTO 200」であった。つまり決定回

数が1000回になるまで繰り返すということで、 while 文による表現が自然であると思われた。

main ブロックのすぐ下の行の while 文がそれである。190~290行のブロックはサブ・ルーチン

garbage_can_processとされた。

第4は、変数名をより長く分かりやすいものに付け替えるという課題であった。ほぼ同じものとし

ては、$j,$max_j,$resolution,$oversight,$flight1,$flight2といったものがある。略記号をより長くし

たものとしては、$energy_from_participants,$energy_required_by_choice,$total_effective_energy,

$energy_required_by_problem,$type_of_decision,$max_type_of_decisionといったものがある。略

記号をより長くすることで分かりやすくしたかったのだが、長すぎてしまうので、適当な長さにと

どめたのが、$solution_coefficient(元プログラムでの SC, Solution Coefficient to deflate total

effective energy),$load_coefficient_of_ERP(同LC, Load Coeffcient of ERP)といったものである。

変数の意味内容を考えて全く異なる表記としたのが、$number_of_trial(I),$number_of_decisions(K),

$max_number_of_decisions(MAXK)といったものである。

加えて、本プログラムでは、サブ・ルーチンを導入したが、その名称も長くて分かりやすいもの

とした。それらは、garbage_can_processとreset_garbage_canである。

その他、一回ループを回るたびに変数に1を加えていくインクリメントには、インクリメント演

算子である「++」を使って書き換えたり、二項代入演算子「+=」を使ったりなどは、BASIC

言語とは異なるが Perl言語では一般的な表記法である。また、二つの項の値が等しいことを調べ

る二項比較演算子は、BASIC言語では「=」であるが、Perl言語では「==」である。

考  察

高橋(1993)のプログラムによるシミュレーションの結果は表3のようであり、本稿で移植した

プログラムによるシミュレーションの結果は表4のようである。前者に比べて後者では、やり過ご

しの発生比率が低く、最長考決定の所要期間が短い。

このような結果になったのが偶然的なものなのかを確かめるため、移植したプログラムを100回

繰り返した平均値を見てみる事にした。その結果(表5)、上記の傾向はやはり再現された。次に

最長考決定を見ると決定タイプ毎に傾向が異なる。負荷係数が高くなるにつれて各決定タイプの出

現回数は、決定タイプ1(問題解決)では少なくなっていくが、決定タイプ3(やり過ごし解決)

は多くなっていく。また決定タイプ2(見過ごし)と4(やり過ごし放置)はほとんど変わらな

い。

以上の結果は、移植に不備がある(アルゴリズムにおいて正確な写像となっていない)可能性を

示唆している。あるいは、アルゴリズムにおいて正確な写像となっていても、プログラミング言語

Page 8: 単純ごみ箱モデル・プログラムのPerlへの移植€¦ · 単純ごみ箱モデル・プログラムのPerlへの移植 藤本 哲 A transplant of single garbage can program

高崎経済大学論集 第48巻 第4号 2006

- 112 -

表3 高橋(1993)によるシミュレーションの結果

0.1 2.034 450 349 150 51 201 71 12 10.2 2.146 432 336 176 56 232 261 14 30.3 2.382 419 331 169 81 250 57 143 10.4 2.575 397 331 172 100 272 50 146 30.5 2.72 374 330 176 120 296 45 163 30.6 3.29 352 333 178 137 315 41 400 40.7 3.847 299 352 179 170 349 36 410 10.8 4.307 270 351 167 212 379 29 513 40.9 4.819 234 347 167 252 419 24 514 11.0 5.549 193 357 164 286 450 22 516 4

負荷係数 LC

決定1回 に要した 平均期間

決定のタイプ 最長考決定

問題解決 見過ごし 出現回 所要期間 決定 タイプ 解決 放置 計

やり過ごし

解係数SC=1、決定回数K=1000回。出所 高橋(1993)138頁、表7.1「問題の負荷と決定のタイプ」

表5 移植したプログラムによるシミュレーションを各100回繰り返した平均値(最長考決定の決定タイプを除く)

0.1 1.043 498.4 491.8 3.00 6.79 9.79 257.2 5.32 48 2 5 450.2 1.036 494.9 497.1 2.64 5.43 8.07 214.1 6.28 41 1 7 510.3 1.042 497.3 493.4 3.37 6.03 9.40 231.4 7.33 37 1 14 480.4 1.051 493.6 495.9 3.89 6.70 10.59 341.5 10.93 32 1 12 550.5 1.046 494.7 496.2 3.48 5.67 9.15 226.5 13.30 26 2 17 550.6 1.183 490.2 498.0 5.00 6.76 11.76 224.9 138.0 14 1 23 620.7 1.068 494.2 496.0 5.17 4.69 9.86 250.1 26.83 13 1 36 500.8 1.092 493.5 495.5 5.75 5.30 11.05 196.4 44.09 14 1 34 510.9 1.188 490.6 496.1 7.82 5.40 13.22 289.0 122.19 14 1 49 361.0 1.143 492.4 495.5 7.64 4.45 12.09 204.0 88.26 13 0 53 34

負荷係 数LC

決定1回 に要した 平均期間

決定のタイプ 最長考決定 問題 解決

見過 ごし 出現回 所要 期間

決定タイプ 解決 放置 計 1 2 3 4

やり過ごし

解係数は1。決定回数は1000回。最長考決定の決定タイプ欄は、100回繰り返した時のタイプ毎の出現回数を合計したもの。

表4 本稿で移植したプログラムによるシミュレーションの結果

0.1 1.006 474 524 1 1 2 6 4 40.2 1.083 483 499 5 13 18 946 11 40.3 1.103 461 514 8 17 25 22 7 40.4 1.031 492 501 2 5 7 124 7 40.5 1.027 495 496 2 7 9 3 8 40.6 1.023 457 537 3 3 6 34 10 40.7 1.078 536 452 6 6 12 42 42 30.8 1.007 491 507 2 0 2 5 3 10.9 1.065 484 509 4 3 7 256 46 31.0 1.037 497 497 3 3 6 9 19 4

負荷係数 LC

決定1回 に要した 平均期間

決定のタイプ 最長考決定

問題解決 見過ごし 出現回 所要期間 決定 タイプ 解決 放置 計

やり過ごし

解係数は1、決定回数は1000回。

Page 9: 単純ごみ箱モデル・プログラムのPerlへの移植€¦ · 単純ごみ箱モデル・プログラムのPerlへの移植 藤本 哲 A transplant of single garbage can program

単純ごみ箱モデル・プログラムのPerlへの移植(藤本)

- 113 -

処理系の違いが影響を及ぼしたのかもしれない。それを確かめる一つの方策としては、構造化プロ

グラミング手法を使う優先順位を下げ、 BASIC的なやり方で移植する、つまりなるべく同じプロ

グラムとなるように移植してみることが考えられる。

結  論

高橋(1993)による BASIC言語で書かれた Single Garbage Can Programを、Perl言語で移植し

た。その際の主な課題は、GOTO文による処理の流れの交差を制御構造によって書き直すことと、

適切な変数名を付けること、そして演算子の変換であった。元々短いプログラムであるので、移植

もそれほど困難ではなかった。しかし正確な移植とはなってない可能性がある。

(ふじもと てつ・本学経済学部助教授)

(参考文献)深沢千尋(1999)『すぐわかる Perl』技術評論社。シュワルツ,ランダル・L(著)、近藤嘉雪(訳)(1995)『初めての Perl』ソフトバンク。シュワルツ,ランダル・L、トム・フェニックス(著)、近藤嘉雪(訳)(2003)『初めての Perl 第3版』オライリー・ジャパン。高橋伸夫(1993)『組織の中の決定理論』朝倉書店。ウォール,ラリー、ランダル・L・シュワルツ(著)、近藤嘉雪(訳)(1993)『Perlプログラミング』ソフトバンク。