プ ログ ラ ミング に関 す る認知 科 学 的研 究②
松
原
康
夫
Cognitive
Scientific
Study of Programming
(2)
by Yasuo MATSUBARA
Programming as a human activity can be investigated from various points of view. In this series of papers, the process of programming is considered from the cognitive scientific point of view.
In this paper, we consider several topics related to the teaching of programming. Firstly, we consider how to teach concepts of control structure and data structure to students. Secondly, the merits and the drawbacks of the language LOGO are considered, in the
context of teaching programming to beginners. We propose several conditions required for a language alternative to LOGO. Finally, we consider the teaching of assembler and machine language, which is very important if students are to understand the mechanism of
computers. 1.は じ め に こ の 一 連 の 論 文 は,人 間 の プ ロ グ ラ ミン グ の 過 程 を認 知 科 学 的 な立 場 か ら考 察 す る もの で あ る。(1)で述 べ た よ うに,プ ロ グ ラ ミン グ 教 育 を通 して 認 知 科 学 的 な知 見 を得 る こ と だ け で な く,認 知 科 学 を教 育 に応 用 す る こ と も 本 研 究 の 目的 で あ る。 プ ロ グ ラ ミン グ を 多 くの 人 間 が 学 ぶ よ うに な っ た の は 比 較 的 最 近 の こ とで あ る。 そ の た め,一 般 に通 用 す る合 理 的 な教 え方 は 未 だ確 立 され て い な い。 しか し,パ ー ソナ ル コ ン ピ ュ ー タ の普 及 や,低 学 年 に お い て コ ン ピ ュ ー タ教 育 を進 め よ う とす る 国策 に よ り,プ ロ グ' ラ ミン グ を学 ぼ う とす る 人 口は今 後 急 速 に 増 加 す る こ とが 予 想 され る。 従 って,プ ロ グ ラ ミン グ に 関 す る教 育 方 法 論 の確 立 され る こ と が 必 要 と な る が,そ の際 単 な る経 験 に 基づ く もの で な く,認 知 科 学 的 な 考 察2)に 耐 え る合 理 的 な方 法 論 で あ る こ とが最 も理 想 的 で あ る。 と くに本 論 文 で は,プ ロ グ ラ ミン グ教 育 に 関 わ る い くつ か の 間 題 に つ い て考 察 を行 う。 一 つ は初 心 者 教 育 に 関 して,日 頃 の 教 育 経 験 か ら,変 数 や 配 列 の教 え 方 につ いて 述 べ る。 も う一 つ は,プ ロ グ ラ ミン グ の初 心 者 教 育 の た め に どの よ う な言 語 が望 ま し いか につ い て 考 察 す る。最 後 に,機 械 語 や ア セ ン ブ ラ 言 語 につ い て何 を ど う教 え るべ きか につ い て筆 者 の 考 え を述 べ る。 2.初 心 者 教 育 に お け る デ ー タ 構 造 プ ロ グ ラム を捉 え る際 に,制 御 構 造 とデ ー タ構 造 に分 け て考 え る こ とは よ く行 わ れ る こ とで あ る。 こ こ で も それ に従 お う。最 初 に デ ー タ構 造 につ い て考 察 す る。 2.1.変 数 の概 念 初 心 者 教 育 に於 い て 最 初 に ぶ つ か るの が, 変 数 を ど うや っ て教 え る か とい う問題 で あ る。
(1)で述 べ た よ うに筆 者 は 箱 の 比 喩 を使 うこ と に して い る が,こ の こ とは 初 心 者 教 育 に携 わ る か な り多 くの 人 が行 って い る よ うで あ る 。 こ こで は箱 に よ る 比 喩 を使 う場 合 に教 え な け れ ば い け な い変 数 の性 質 を,い わ ば 公 理 と して整 理 して み よ う。 公理(1)変 数 は丁 度 一 つ の 値 が 入 る箱 で あ る 。 そ して,変 数 の値 とは,箱 の 中 身 の こ とで あ る。 公理(2)変 数 に値 を入 れ る と,そ れ ま で に 入 って い た値 は 消 え る。 公理(3)変 数 の値 を取 り出 して も,値 は 消 え た り変 わ っ た り しな い 。 以 上 の 公 理 か ら次 の よ うな 定 理 が 導 か れ る 。 定 理(1)一 度 変 数 に 入 れ た値 は,次 に別 の 値 を入 れ な い 限 り,何 度 で も 同 じ値 を 取 り出す こ とが で きる 。 これ に加 えて,代 入文 の 性 質 を公理 と して 記 述 す る と次 の よ うに な る。 公理(4)代 入 文 を実 行 す る と,左 辺 の 変 数 に,そ の と きの右 辺 の 式 の値 が 入 る。 公理(5)代 入 文 を実 行 す る と,右 辺 の 式 の 値 は,そ こ に 現 れ る変 数 の その と き ま で の 値 を(つ ま り箱 の 中 身)を 取 り出 して作 られ る。 特 別 の 場 合 の 注 意事 項 と して,次 の 定 理 が 導 か れ る。 定理(2)代 入 文 の左 辺 の 変 数 が右 辺 に も現 れ て い る場 合,右 辺 の 式 の値 は,こ の代 入 文 を実 行 す る直 前 の値 を使 っ て 作 ら れ る。 但 し,以 上 の 公 理 は 変 数 や 代 入 文 の 意 味 論 的 な 性 質 を規 定 す る もの で あ る。 構 文 論 は 前 も って 規 定 され て い る もの とす る。 認 知 科 学 的 に は,物 事 を理 解 す る こ とは 結 局 そ の 中 に 内 在 す る論 理 的 な構 造 を把 握 す る こ とで あ る と考 え られ て い る。 従 って 以 上 の よ う な公 理 で 述 べ られ て い る事 項 を,表 面 上 どの よ うな 形 で表 す に せ よ,十 分 に把 握 させ る こ とが,変 数 及 び代 入文 を学 ば せ る 上 で 必 要 で あ る こ と に な る。 2.2.配 列 の 概 念 基 本 的 な 単 純 変 数 の概 念 を把 握 した あ とで, 配 列 を教 え る こ とに な る。 プ ロ グ ラ ミン グ の 初 心 者 教 育 を担 当 した教 師 の ほ とん どが,配 列 を教 え る こ との 難 し さ を訴 え る よ うで あ る。 と くに理 科 系 の 教 師 はベ ク トル や マ ト リク ス との 類 推 で教 え る こ とが 多 い よ うで あ る。 とこ ろ が,数 学 的 な 思考 法 に慣 れ て い な い 文 科 系 の学 生 に とっ て は,こ の教 え 方 は適 切 で は な い 。 この 点 につ いて は,前 述 し た よ う に,現 実 の世 界 に存 在 して 誰 で もが よ く把 握 し て い る概 念 との 類 推 で教 え るべ きで あ る。 そ の最 も よ い例 は,ア パ ー トや マ ン シ ョ ン の 構 造 で あ る。 こ れ ら は次 の よ うな い くつ か の 点 で,配 列 と共 通 して い る。 1)各 部 屋 に通 常 自然 数 の 番 号 が つ い て い る こ と。 2)各 部 屋 は何 か を入 れ る入 れ物 で あ る こ と。 3)1次 元 の もの か ら始 ま っ て,実 際 上 何 次 元 の もの で も考 え られ る こ と。 人 間 は,ま っ た く同 一 の 論 理 構 造 を持 つ 問 題 で も,日 常 慣 れ て い る形 式 で あ れ ば 柔 軟 に 対 応 で き るが,慣 れ て い な い形 式 で あ る と問 題 を解 決 で きな い場 合 が 多 い こ とが,認 知 科 学 的 に知 られ て い る。 従 っ て,以 上 の よ う な 類 推 を使 うこ とは,単 に論 理 的 な 構 造 を把 握 させ る の に役 立 つ だ け で な く,日 常 的 に慣 れ て い る 形 式 で 問題 を考 え させ る こ とに よ り, 問題 を解 き易 くす る こ とに もな る。 筆 者 は 以 上 の よ う な 観 点 か ら,実 際 の BASICを 使 っ た初 心 者 教 育 の 場 に 於 て,単 に アパ ー トや マ ン シ ョン との 類推 で,配 列 と は こ ん な もの で あ る,と 説 明 す るだ け で な く, アパ ー トを題 材 と した 以 下 の よ うな一 連 の 問 題 を学 生 に解 かせ て み た。 a.1∼7号 室 の あ る アパ ー ト(コ ー ポ 文 教)に 入 居 者 を入 れ る。
プ ロ グ ラ ム と し て は,文 字 列 型 の 配 列 BUNKYOU$を 宣 言 し てDATA文 に 書 い た名 前 を格 納 し,そ の 内容 を 印刷 させ る。 b.コ ー ポ文 教 が2階 建 て の ア パ ー トで あ り,各 階 に1∼8号 室 が あ る とす る。a.と 同様 に して 各 部 屋 の 住 人 の名 前 を入 れ た後, 階数 と番 号 を キ ー ボ ー ドか ら入 力 して そ の 部 屋 の住 人 の 名 前 を印刷 させ る 。 これ を,0が 入 力 され る ま で繰 り返 す 。 c .コ ー ポ文教 はb.と 同様 と し,名 前 を 同様 に 入 れ て お く。 そ して キ ー ボ ー ドか ら名 前 を入 力 して,そ の 名 前 の住 人 を捜 す 。 見 つ か れ ば そ の 部 屋 の 階 数 と番 号 を印刷 す る。 見 つ か らな けれ ば そ の こ とを報 告 す る。 d.同 じコー ポ文 教 の各 部 屋 に,手 紙 が 届 くこ と を考 え る。DATA文 また は キー ボ ー ド か らの 入 力 で,何 階 の 何 号 室 に 手 紙 が 届 い た か を,数 十 回繰 り返 し指 定 す る。0が 入 力 さ れ る と,そ れ まで に各 部 屋 の 住 人 に そ れ ぞ れ 何 通 の 手 紙 が 届 い た か を,印 刷 す る。 プ ログ ラム で は,別 の 配 列TEGAMIを 用 意 して,手 紙 が 届 く度 に対 応 す る配 列 要 素 に 1を 加 えて い く。 e.今 度 は,コ ー ポ文 教 の 各 部 屋 の 住 人 の 貯 金 額 を考 え る。 配 列CHOKINを 宣 言 し て, DATA文 で 与 え た貯 金 額 を格 納 して お く。そ して,最 も大 き い貯 金 額 の 住 人 とそ の部 屋 の 位 置 を印 刷 させ る。 f.e.と 同 様 の 状 況 で,こ の アパ ー トの 大 家 が貯 金 を奨 励 して い るの で,貯 金 額 の 大 きい順 に部 屋 を入 れ 換 え る こ とに した 。 入 れ 換 え る前 と後 の 状 況 をそ れ ぞれ 印 刷 す る。 ソー テ ィ ン グの 方 法 と して は,e.と の 関 連 で 最 大 値 法 を用 い る。 以 上 の よ う な一 連 の 問 題 は,配 列 の 初 歩 的 な使 い方 をほ ぼ 尽 くして い る(高 度 な使 い 方 は い く らで も あ る)。実 際 にや って み た 印象 と して は,問 題 そ の もの を理 解 す る と い う点 で は,よ く理 解 して い る よ うで あ った 。 そ して, この よ うに最 初 か ら2次 元 配 列 を使 用 す る こ との 困難 は生 じ なか っ た よ う で あ る。 この よ うな教 育 方 法 の効 果 を定 量 的 に 把 握 す る こ とは,な か なか 困難 な こ とで あ る。 最 終 的 に は試 験 の 点 数 が 出 るが,と くに 配 列 の 教 え方 に よ る効 果 だ け を他 の 要 素 か ら分 離 す るた め に は,他 の 教 え方 を し た対 照 群 との 比 較 が 必 要 とな るが,現 実 に 比 較 を行 うの は 難 しい 。 3.初 心 者 教 育 に お け る制 御 構 造 2.に 続 い て こ こ で は,プ ロ グ ラ ム が どの 様 な順 序 で実 行 され る か を教 え る方 法 に つ い て 考 察 す る 。 3.1.フ ロー チ ャ ー トにつ い て フ ロー チ ャ ー トが いつ 頃 か ら使 わ れ て い た か につ い て は知 ら な い が,昭 和45年 頃筆 者 が FORTRANを 教 え ら れ た と き は,フ ゜ロ グ ラ ミン グ の一 環 と して 教 え られ た記 憶 が あ る。 そ の 後,ソ フ トウ ェ ア危 機 が 叫 ばれ,そ れ を 救 う手 段 と して ソ フ トウ ェア 工 学 が 台頭 して くる とフ ロ ー チ ャー トの評 判 は落 ち る 一 方 で あ っ た。、現 在 で も そ の状 況 は 変 わ っ て い な い で あ ろ う。 しか しな が ら,他 方 で は 現 実 の世 の 中 で, フ ロー チ ャ ー トの 果 た して い る役 割 は決 して 小 さ くは な い 。 この 矛 盾 は何 処 か ら く る もの で あ ろ うか 。筆 者 な りに この 問題 を整 理 して み た い。 筆 者 の 経 験 か ら い う と,始 め て プ ロ グ ラ ミ ン グ を教 え られ た と きに は,フ ロー チ ャ ー ト を描 い て か ら コー デ ィ ン グ を しな さ い,と 言 われ,コ ー デ ィ ン グ シー トが 実 際 に用 意 され て い た の で あ る。 しか し な が ら,少 し慣 れ る とFORTRAN の プ ロ グ ラム とフ ロ ー チ ャー トが余 りに も一 対 一 に 対 応 して い るた め に,わ ざわ ざ フ ロー チ ャ ー トを書 い て か ら コー デ ィ ン グ す る こ と が面 倒 くさ くな っ て くる。 デバ ッグ をす るの に も直 接 プ ロ グ ラ ム を修 正 して し ま う。 従 っ
て レ ポー トな ど に プ ロ グ ラ ム を載 せ る と きは, プ ロ グ ラ ム か ら逆 に フ ロー チ ャ ー トを描 い て い た 。 また,そ の 頃 の コ ン ピュ ー タ 関係 の 本 に は, プ ロ グ ラ ム の 説 明 をす るた め に 必 ず フ ロー チ ャ ー トが 載 っ て い た もの で あ る 。 実 際,よ く 描 か れ た フ ロー チ ャ ー トは 確 か に プ ロ グ ラ ム を直 接 読 む よ り理 解 が し易 か っ た の で あ る が, そ の よ うに 描 か れ た フ ロー チ ャ ー トは大 変 少 な か っ た よ うで あ る。 平 面 図形 と して 描 き き れ ず に,矢 印 に番 号 をつ け て他 の 部 分 に飛 ん で い る た め,全 体 の構 造 が と うて い把 握 し切 れ ない もの とな っ て い た 。 最 近 の本 で 見 か け る フ ロー チ ャー トは そ の 頃 に比 べ て 大 変 見 や す い もの に な っ て きて い る。 大 きい 処 理 は 一 つ の フ ロー チ ャー トで 表 さず に,階 層 的 な 表 現 を して い る。 つ ま り あ る程 度 ま と ま っ た 高 度 な処 理 を一 つ の 箱 で 表 わ す こ とに よ っ て 一 つ の フ ロー チ ャー トを コ ンパ ク トな もの と し,そ の 部 分 は 別 の フ ロ ー チ ャー トで 詳 し く表 現 す る の で あ る。 こ うい っ た変 化 は,プ ロ グ ラム そ の もの の 構 造 を見 易 くす る と い う構 造 化 プ ロ グ ラ ミン グの 考 え方 に影 響 され て い るの で あ ろ う。 ま た一 方 で プ ロ グ ラム コー ドその もの の 構 造 が 大 変 読 み 易 い,い わ ゆ る構 造 的 な 言 語 が 普 及 して くる と,そ うい っ た 言 語 を使 う場 面 で は殆 どフ ロー チ ャー トを使 う必 要 が 無 くな って きた の で あ る。 逆 に言 えば,フ ロ ー チ ャ ー トを別 に 必 要 とす る よ うな プ ロ グ ラ ミン グ 言 語 は,少 な くと も計 算 機 科 学 者 の 間 で は 無 用 の もの と な っ て き た の で あ る。 構 造 的 な 言 語 の 大 部 分 はALGOL系 の 言 語 で あ り,中 で も 教 育 用 の 言 語 と し て は PASCALが 普 及 し て き た 。少 な く と も小 規 模 の プ ロ グ ラ ム を 記 述 す る に はPASCALは 大 変 よ い 言 語 で あ る。 ア ル ゴ リズ ム を 記 述 す る場 合 にPASCALを 用 い る こ とが 多 くな っ て きて い る。 実 際 に は他 の 言 語 で イ ン プ リメ ン トす る場 合 で も,そ の仕 様 を記 述 す るた め にPASCALを 用 い る こ と もあ る。 以 上 で述 べ た よ うに,最 近 の プ ロ グ ラ ミン グ言 語 を使 う場 合 に は フ ロー チ ャ ー トを使 う 必 要 性 が減 少 して きて い る こ とは事 実 で あ る。 とこ ろ が 反 面,現 実 の社 会 に於 て,フ ロー チ ャー トの 果 たす 役 割 は 必 ず し も減 少 して い な い よ うで あ る。 そ の理 由 と して次 の よ うな 事 が 考 え られ る。 1)現 実 の 社 会 に於 いて は,構 造 的 で な い 昔 か らの 言 語 の 使 わ れ る率 が 多 い こ と。 実 際, COBOLやFORTRANの 使 わ れ る割 合 が 非 常 に大 きい で あ ろ う。 ま た,初 心 者教 育 の場 に於 い て は,BASICの 使 わ れ る こ と が 未 だ 比 較 的 多 い 。 こ れ らの 言 語 に於 い て は,制 御 の 流 れ を プ ロ グ ラ ム か ら読 み取 る こ とが 容 易 で は な い の で,フ ロー チ ャー トを使 っ て制 御 の 流 れ を視 覚 的 に 表現 す る必 要 が あ る。 2)フ ロー チ ャー トその ものが 視覚 的 に理解 し易 い性 質 を持 っ て い る こ と。他 に何 の知 識 が 無 くて も,フ ロー を た どる こ と に よ っ て プ Rグ ラ ム が 実 行 され る こ とが 直観 的 に理 解 で きる 。従 っ て,プ ロ グ ラ ム の働 き を非 専 門 家 に 説 明 す る場 合 や,特 定 の言 語 に 依 存 しな い ア ル ゴ リズ ム を記 述 す る場 合 等 に 使 わ れ る こ とが 多 い 。ま た,初 心 者 教 育 に お い て は,PAS・ CAL等 の プ ロ グ ラ ミン グ 言 語 の 働 き を教 え る場 合 に も使 う こ とが あ る。 3.2.今 後 の フ ロ ー チ ャ ー トの 位 置 づ け 以 上 で 述 べ た よ うに,現 実 の 世 界 で フ ロー チ ャ ー トの 占め る位 置 は複 雑 で あ る。 で は, 教 育 の 場 で は,ど の よ うに位 置 付 け られ る だ ろ うか 。 教 育 の 場 とい っ て もい ろ い ろ あ る が,大 学 に於 け る理 工 系 の 情 報 専 門 の 学 科 等 で は,フ ロ ー チ ャー トをわ ざ わ ざ教 え る こ とは あ ま り な い よ うで あ る。 しか し教 え な くて も 自然 に 解 って くる,と い う と ころ で あ ろ う。 ま たプ ロ グ ラ ム の仕 様 を記 述 す るた め の 手 段 とし て は,自 然 言 語 を使 っ て ア ル ゴ リズ ム 的 な書 き
方 を させ る場 合 もあ るだ ろ う し,フ ロー チ ャ ー トの変 形 や,他 の 図 形 的 な記 述 法 を教 え る 場 合 もあ るだ ろ う。 専 門 学校 等 で は,教 育 の 目的 を即 戦 力 と し て使 え る人 員 の養 成 に 置 く場 合 が 多 い と考 え ら れ る。 プ ロ グ ラ ミ ン グ 言 語 と し て も COBOLやFORTRAN等 が 多 い こ とか ら, ど う して も普 通 の フ ロー チ ャー トを き ち ん と 教 え る必 要 が あ る。 実 は,プ ロ グ ラ ム の 性 質 を理 論 的 に追 求 す る場 合 で もオ ー ソ ドッ ク ス な フ ロー チ ャー ト が 用 い られ る の で あ る。 こ れ は,フ ロー チ ャ ー トが,特 定 の 言 語 に依 存 しな い 手 順 を視 覚 的 に解 りや す く表 現 で き るた め と考 え られ る。 また,ま っ た くプ ロ グ ラ ミン グ言 語 を知 ら な い初 心 者 に と って は,プ ロ グ ラム に お け る 制 御 の 流 れ とい う もの を直観 的 に把 握 させ る た め に大 変 便 利 な もの で あ る と言 え る 。 こ こで,プ ロ グ ラ ム を 自分 で 作 る訓 練 をす るた め に フ ロ ー チ ャー トが ふ さ わ しい か ど う か は 別 問 題 で あ る。 しか し,そ の 前 の段 階 と し て,プ ロ グ ラ ム が 具 体 的 に ど の よ うに 動 作 す る もの で あ るか を正 確 に理 解 させ る必 要 が あ る。 そ の ため の一 つ の 道 具 と して フ ロー チ ャー トを も っ と利 用 すべ きか も しれ な い 。 4.LOGOに つ い て 初 心 者 教 育 用 の言 語 と して,ま た 認 知 科 学 的 な考 察 か ら生 ま れ た 言 語 と してLOGOが 有 名 で あ る(3)。必 ず し も コ ン ピュ ー タ の 入 門 教 育 用 と して 設 計 され た わ け で は な い が,今 後 コ ン ピュ ー タ教 育 が低 学 年 に まで 普 及 す る こ とを考 え る と,プ ロ グ ラ ミング の 入 門教 育 用 言語 と して候 補 の 一 つ に挙 げ られ る こ と は ま ち が い な い 。 ま た,現 在 の 日本 の 大 学 教 育 に お い て も,高 校 ま で に ほ とん ど コ ン ピュ ー タ を知 らず に 来 た学 生 に教 え る ため の 言語 と して使 わ れ る可 能 性 が,全 く無 い とは 言 い き れ な い 。 本 章 で は,以 上 の よ う な 場 面 に お い て, LOGOが 真 に適 切 な 言 語 で あ る か 考 察 して み た い 。 4.1。LOGOの 特 性 LOGOは 本 来,子 供(幼 児)が,思 考 能 力 を発 達 させ る の に役 立 つ,手 が か りを与 え る 目的 で パ パ ー ト(S.Papert)に よ っ て考 え出 され た もの で あ る。 パ パ ー トは,ジ ャ ン ・ピ ア ジ ェ と一 緒 に研 究 を した こ と もあ り,パ パ ー トは,MITの 人 口知 能 研 究 所 でLOGOを 考 え た の で あ る。 LOGOは こ う した 背 景 に よ るの か,プ ロ グ ラ ミン グ 言語 と して よ りも,む しろ幼 児 の お 絵 描 きツ ー ル とい っ た イ メー ジが 強 い よ うで あ る。 実 際 そ の ター トル ・グ ラ フ ィ ッ クの 機 能 は,一 部 他 の 言 語 に も付 加 機 能 と して 取 り 入 れ られ るな ど,教 育 用 の 道 具 と して は あ る 程 度 の 市 民権 を得 て い る よ うで もあ る。 しか しな が ら,LOGOはLISPと 殆 ど同 じ言 語 で あ る こ とは あ ま り知 られ て い な い よ うで あ る。 パ パ ー トに よれ ば,LOGOは 子 供 が 自由 に 遊 び の 道具 と して使 う こ とに よっ て,自 然 に 思 考 を発 達 させ る こ とが で き るの で,教 師 は 不 要 とい うこ とに な って い る 。 この 点 につ い て は,と か く批 判 が 多 い よ うで あ る。 実 際 にLOGOを 使 っ て み れ ば す ぐ に解 る こ とだ が,タ ー トル ・グ ラ フ ィ ッ ク を使 っ て 繰 り返 しや 再 帰 を含 む 図 形 を描 い て い る分 に は,さ ほ どの 困難 を感 じな い が,こ れ が 変 数 を使 っ た本 格 的 な プ ロ グ ラ ミン グ に入 ろ う と す る と極 端 に難 し くな る の で あ る。 これ が 教 師 無 しで,し か も忍 耐 で きる 妥 当 な時 間 内 で 子供 に習 得 で き る な ど とは とて も思 え な い。 また,タ ー トル ・グ ラ フ ィ ッ ク につ い て も, デ ィス プ レイ 画 面 上 の抽 象 的 な ター トル に 子 供 が 感 情 移 入 で き る と も思 え な いの で あ る。 少 な く と も,機 械 で 作 っ て あ る,3次 元 世 界 の ター トル で な い限 り子供 が 興 味 を示 す とは 思 わ れ な い し,プ ロ グ ラム を キー ボー ドか ら 入 力 す る こ と も幼 児 に は 不 自然 と思 わ れ る。 こ の点 につ い て は い ろ い ろ と工 夫 が な され て
い る よ うで あ る。 以 下 にお いて は,プ ロ グ ラ ミン グの 入 門教 育 用 と して,LOGOが 適 切 で あ るか ど うか に つ い て 考 察 し た い。 LOGOが 初 心 者 用 言 語 と し てLISPよ り 優 れ て い る 点 は,少 な く と も表 面 上 は プ ロ グ ラ ム が 読 み 易 い とい う こ とで あ る。 つ ま りカ ッ コの お 化 け と言 う印 象 を与 え な いの で あ る。 そ して 制 御 構 造 が逐 次 実 行 の 他 は,場 合 分 け と繰 り返 し,そ して 手 続 きの 再 帰 呼 び 出 しが あ るだ け で あ る 。繰 り返 しは,最 も単 純 な繰 り返 しで あ り,何 回 繰 り返 す か を定 数 ま た は 変 数 で 与 え る だ け で あ る。 以 上 の よ うに 大 変 簡 単 な制 御 機 能 を持 ち, タ ー トル ・グ ラ フ ィ ッ ク は再 帰 の 概 念 を つ か ませ る に は 面 白 い 道 具 で あ る と言 え る。 た だ, プ ロ グ ラ ミン グ教 育 の 入 門用 と し て は,次 の 二 つ の 点 が 問題 と な る だ ろ う。 一 つ は ,基 本 とな るデ ー タ構 造 が リス トで あ る こ と。 も う一 つ は,手 続 き を呼 び 出 す と きの 引 き数 と して 変 数 を書 く と き,変 数 その もの とそ の 中 身 を区 別 して書 か な け れ ば な ら な い こ とで あ る。 これ らは,言 っ て み れ ば 母 体 がLISPで あ る こ とか ら くる宿 命 の よ うな もの か も知 れ な い。 現 実 に使 われ て い る言 語 の 大 部 分 に お い て,基 本 と な る デ ー タ構 造 が 配 列 で あ り,代 入 文 の左 辺 以 外 に変 数 を書 け ば そ の 中身 を意 味 す る と い う意 味 論 を採 用 し て い る こ とか らす れ ば,プ ロ グ ラ ミン グ教 育 の 入 門 用 と してLOGOを 用 い る こ と は 適 切 で は な い こ とに な るの で あ る。 しか しな が ら,LOGOの 発 想 の 原 点 に は, 自分 が ター トル に感 情移 入 す る こ と に よ っ て, 絵 を描 く手 続 き を考 え る こ と を容 易 に し よ う とい う考 え が あ る 。 実 際 に大 学 生 に入 門教 育 を行 っ て い て,教 え られ た こ と をや る だ け で な く自分 で プ ロ グ ラム を考 え させ る こ との 困 難 さ を知 っ て い る筆 者 に とっ て は,大 変 重要 な ヒ ン トで あ る よ う に思 わ れ る。 4.2.LOGOを 超 え て それ で は,LOGOの 発 想 を活 か して,現 代 の プ ロ グ ラ ミン グ教 育 の 入 門用 と して 使 え る 言 語 の イ メー ジ を構 成 して み よ う。 1)デ ー タ を操 作 す る基 本 的 な文 は 代 入 文 で あ る こ と。 2)基 本 とな る デ ー タ構 造 は配 列 で あ り, 代 入 文 の 左 辺 以 外 に変 数 を書 い た と き は,そ の 中 身 を意 味 す る こ と。 3)現 代 の グ ラ フ ィ ッ ク の技 術 を活 用 して, もっ と感 情 移 入 しや す い環 境 を用 意 す る こ と。 例 えば,配 列 をア パ ー トや マ ン シ ョン の 形 で表 す事 等 が 考 え られ る。 4)制 御 の流 れ その もの を視 覚 に訴 えて理 解 し易 い もの とす る こ と。LOGOに お い て は 子 供 が ター トル に感 情 移 入 す る こ とを期 待 し て い るが,そ れ な らば タ ー トル は 制 御 の 流 れ を追 うべ きで あ る。 テ レ ビ ・ゲ ー ム に子 供(大 学 生 を含 む)が 熱 中す る の を見 て い る と ター トル を オー トバ イや 自動 車 に 置 き換 え るの も ひ とつ の 方 法 で あ ろ う と思 う。 5)制 御 構 造 の 世 界 とデ ー タ構 造 の世 界 と が どの よ う に し て相 互 作 用 す るか が 直 観 的 に 理 解 で き る よ うにす る こ と。 現 実 に使 われ て い るプ ロ グ ラ ミン グ 言語 の 大 部 分 で は,こ の よ うに制 御 構 造 とデ ー タ構 造 とい う,半 ば独 立 した二 つ の世 界 が 存在 し,そ れ らが イ ン タ ラ ク シ ョ ンす る こ とに よ っ て処 理 が行 わ れ て い る わ け で あ る。 初 心 者 教 育 に於 て は こ の構 造 を体 得 させ る こ とが 大 事 で あ る。 そ の た め に,制 御 を追 うター トル とは別 に デ ー タ を移 動 させ る ター トル を用 意 す る事 な どが考 え ら れ る 。 い ず れ に して も,LOGOが 最 初 に考 え られ て(1967)か ら20年 の 歳 月 が 流 れ て い るの で あ る。 その 間 に コ ン ピ ュー タは 急 速 な発 展 を 遂 げ,個 人 の所 有 す るパ ー ソナ ル ・コ ン ピ ュ ー タは20年 前 の 大 型 計 算 機 をは か る に 凌 ぐ性 能 と容 量 を持 つ に到 っ て い る。 こ の こ と を考 え れ ば,LOGOの 考 え 方 を 継 承 し つ つ も
LOGOを 超 え る,現 代 にふ さ わ し い入 門教 育 用 の 言 語 が 生 ま れ る こ とが 期 待 され る の で あ る。 5.ア セ ン ブ ラ 教 育 現 代 に於 て は,シ ス テ ム記 述 に使 え る言 語 が種 々 開発 され,機 械 語 をプ ロ グ ラム す る 機 会 は,比 較 的 減 少 して い る。 しか し,今 後 如 何 な る 言 語 が 開 発 され よ う と も,フ ォ ン ・ノ イ マ ン 方 式 の 計 算 機 ア ー キ テ クチ ャ が 支 配 的 で あ り続 け る限 り,機 械 語 や ア セ ンブ ラ に よ るプ ロ グ ラ ミン グ の機 会 は無 くな る こ とは 有 り得 な い と言 っ て よい 。 本 章 で は,機 械 語 や, ア セ ン ブ ラ に関 す る教 育 を ど の よ うに して い くべ きか に つ い て筆 者 の 考 え を述 べ る。 5.1.ア セ ン ブ ラ教 育 の 位 置 づ け 学 校 教 育 の 中 で ア セ ン ブ ラ また は 機 械 語 教 育 を考 え る な らば,少 な く と もこ こ当 分 の 間 は大 学 等 の 高 等 教 育 機 関 に 限定 して よ いで あ ろ う。 で は,大 学 の しか も情 報 教 育 に重 点 を 置 く学 部 また は 学 科 にお い て どの程 度 まで 教 え る必 要 が あ る の だ ろ うか 。 結 論 か ら言 う と,全 く触 れ な い で 済 ます こ とはで きな い とい う こ とで あ る。 そ の 必 要 性 は二 つ の事 項 か ら くる。 一 つ は,現 実 の 社 会 にお い て,プ ロ グ ラ ミン グ に携 わ る以 上 は, ど う して も これ らの 言 語 に接 触 す る機 会 が あ るだ け で な く,実 際 にプ ロ グ ラ ミン グす る 場 合 が あ る こ とで あ る。 も う一 つ は,コ ン ピ ュ ー タの 動 作 原 理 を理 解 す る た め に は ,ど う し て も計 算 機 が 機 械 語 の プ ロ グ ラ ム を ど の よ う に実 行 す る か を知 っ て お く必 要 が あ る こ とで あ る。 前 者 につ い て は,最 近 い ろ い ろ な シ ス テ ム 記 述 言 語 が 発 達 して き た た め,ほ とん どの こ とが そ の 言 語 の 範 囲 内 で 記 述 で き る よ うに な って は きた が,そ れ か ら外 れ る機 能 を要 求 さ れ る場 合 に は機 械 語 な い しは ア セ ンブ ラで サ ブ ル ー チ ン を書 い て リン クす る必 要 が 生 じ る の で あ る 。 ま た,別 の 高 級 言 語 を使 っ てサ ブ ル ー チ ン を書 く場合 で も,リ ン ク の た め に は 主 記 憶 や レジ ス タ等 の概 念 を理 解 して お く必 要 が あ る。 また,後 者 に つ い て は,現 代 の 大 部 分 の 言 語 は,ソ マ ス ・プ ロ グ ラ ム を コ ンパ イ ル して オ ブ ジ ェ ク ト ・プ ロ グ ラ ム を生 成 し,そ れ を リン カ ま た は リンケ ー ジ ・ロー ダ が 実 行 形 式 プ ロ グ ラ ム に変 換 す る方 式 を と っ て い る が, 何 故 この よ うな 方 式 が 採 られ るの か と言 う理 由 は,ア セ ン ブ ラや 機 械 語 の知 識 が 無 け れ ば 理 解 で きな い事 柄 で あ る。 この 他 に もこ れ ら に 関 す る知 識 が な け れ ば 理 解 で きな い事 柄 は た く さん あ るの で あ る 。 特 に オ ペ レー テ ィ ン グ ・シ ス テ ム に関 す る事 柄 を理 解 す る た め に は,ど う して も これ らの 知 識 が 必 要 で あ る。 例 え ば,割 り込 み を理 解 しな けれ ば1/0の 処 理 が で きず,タ イ ム ・シ ェ ア リン グや マ ル チ ・プ ロ グ ラ ミン グ の 原理 が全 く理 解 で きな い の で あ る。 そ れ で は次 に,ア セ ン ブ ラや 機 械 語 に 関 す る教 育 を どの よ うに し て行 うべ きか につ い て 考 察 す る。 まず,第 一 に考 え る必 要 の あ る こ とは どの よ うな 計 算 機 の ア セ ン ブ ラ を教 え るか で あ る 。 い わ ゆ る ホス トマ シ ンか ら,ミ ニ コ ン ピ ュ ー タ そ して パ ー ソ ナ ル ・コ ン ピ ュ ー タ まで 考 え られ る し,1ワ ー ドの 語 長 が32ビ ッ トの もの か ら16ビ ッ ト,8ビ ッ トそ して4ビ ッ トの も の まで あ る。 筆 者 の 経 験 で は,語 長 は少 な くと も16ビ ッ ト以上 の もの で な け れ ば な らな い 。8ビ ッ ト で は 直 接 にア ク セ ス で き る ア ドレス 空 間 が 狭 い た め に,プ ロ グ ラ ミン グ上 の本 質 的 で な い 事 柄 の た め に,多 くの 注 意 を払 う必要 が あ る。 また,ホ ス ト ・マ シ ンの ア セ ン ブ ラは,余 り に も機 能 が 多す ぎて,基 本 的 な事 柄 だ け を教 え るの に は不 向 きで あ る。 と くに 割 り込 み 等 を教 え る こ とは,オ ペ レー テ ィ ング ・シ ス テ ム の 管 理 下 でTSSを 使 っ て い る限 り不 可 能 とな る。
筆 者 は,10年 ほ ど前 に富 士 通 のFACOMU -200と い う ミニ コ ン を使 っ て ア セ ン ブ ラ の 教 育 を行 っ た 経 験 が あ る。 こ の機 械 は16ビ ッ ト ・マ シ ン で あ り,命 令 の 数 が余 り多 くな く て教 え易 い機 械 で あ った 。 そ して 高 沢 助 教 授 の 開発 した 常 駐 型 の ア セ ン ブ ラ を使 う こ とが で き た が,こ の シ ス テ ム は オ ペ レ ー テ ィ ン グ ・シ ス テ ム を一 切 使 わず,紙 テ ー プ か ら直 接IPLで コア に ロ ー ドさ れ る もの で あ っ た 。 OSを 使 っ て い な い た め,と くに 割 り込 み の 実 習 教 育 を行 うの に適 して い たの で あ る。 筆 者 は,タ イマ の 割 り込 み を利 用 して タ イ ム シ ェ ア リン グ ・シ ス テ ム の 実 験 を学 生 に 行 わせ た の で あ る 。 と こ ろ で,最 近 急 速 に普 及 して い るパ ー ソ ナ ル ・コ ン ピ ュ ー タ は,基 本 的 に16ビ ッ トの もの が 多 い 。 しか し,ア ドレス 空 間 が 拡 張 し て あ り,命 令 の数 も 多 い の で,少 な く と もア セ ン ブ ラ の 入 門 に向 い て い る とは言 え な い だ ろ う。 ま た,MS-DOS等 の オ ペ レー テ ィ ン グ ・シス テ ム の も とで使 う こ とに な る の で, 割 り込 み の 本 格 的 な実 験 を行 うこ とは 難 しい。 や は り,初 心 者 教 育 に は命 令 数 を限 定 して, 基 本 的 な事 項 だ け を学べ る よ うな機 械 を設 定 す るべ きで あ る。 そ の 点 で,通 産 省 の 実 施 す る情 報 処 理 技 術 者 試 験 で 使 用 され る仮 想 コ ン ピュ ー タ が,従 来 の8ビ ッ ト ・マ シ ン で あ る COMP-XとCAP-Xか ら,昭 和62年 度 よ り 16ビ ッ ト のCOMETとCASLに 変 更 さ れ た(4)一(6)のは歓 迎 す るべ きで あ る 。 こ の機 械 は,2ワ ー ド命令 を基 本 と して お り,2ワ ー ド目 で ア ドレス を指 定 す る た め に 全 て の ア ドレス 空 間 が 直 接 ア クセ ス で きる 。 そ して レ ジス タ ま わ りの 命 令 と,オ ー ソ ドッ クス な ロー ド命 令 及 び ス トア命 令 が 用 意 され て い る。汎 用 レ ジ ズ タはGROか らGR4ま で が あ り,GR4は ス タ ッ ク ・ポ イ ン タ を 兼 ね て い る。 この ス タ ッ クの お か げ で サ ブ ル ー チ ン が 容 易 に 組 め る よ うに な って い る。 ア セ ン ブ ラ教 育 も初 歩 的 な教 育 は この 程 度 か ら始 め る の が 適 当 と考 え られ る。 しか し教 育 上 の 立 場 か ら言 えば,割 り込 み の概 念 の無 い こ とが 惜 し まれ る。 5.2.CASLア セ ン ブ ラ と COMETシ ミュ レ ー タ 筆 者 は,ア セ ン ブ ラ及 び機 械 語 の教 育 に使 い得 るだ けで な く,そ の ソー ス ・プ ロ グ ラム を シス テ ム ・プ ロ グ ラ ム論 の教 材 と して も使 う こ と を意 図 して,MS-DOS上 で 動 作 す る CASLア セ ン ブ ラ とCOMETシ ミュ レー タ を作 成 した の で,こ れ に つ い て 述 べ る。 作 成 に 当 た って と くに 留 意 した点 は 次 の 二 点 で あ る 。 1)オ ブ ジ ェ ク ト ・プ ロ グ ラ ムつ ま り相 対 形 式 プ ロ グ ラ ム の構 造 が 理 解 し易 い よ うに, バ イ ナ リー ・フ ァイ ル で は な くア ス キー ・フ ァイ ル とす る。 2)割 り込 み の 実 習 が で きる よ うに,CASL とCOMETを 拡 張 す る。 割 り込 み の 実 習 を行 うに は,こ の よ うな シ ミュ レー タ を用 い る こ とが最 もよ い 方 法 で あ る と考 え られ る。 COMETの 拡 張 し た 仕 様 は 次 の とお りで あ る。 主 記 憶 は,0番 地 か ら3FFF番 地 ま で の16 Kワ ー ドだ け実 装 され て い る もの とす る。 従 っ て,COMETシ ミュ レ ー タ が オ ブ ジ ェ ク ト ・プ ロ グ ラム を実 行 形 式 プ ロ グ ラ ム に変 換 しな が らロ ー ドし た あ と,ス タ ッ ク ・ポ イ ン タ を兼 ね るGR4の 内 容 は シ ス テ ム に よ っ て 十 六 進 の4000に 設 定 され て い る。 CPUの 実 行 状 態 を 表 す レ ジ ス タ と し て ス テー タ ス ・レ ジス タSTRを 用 意 した 。 これ は 16ビ ッ トの 長 さ を も ち,そ の14,15ビ ッ トが フ ラ グ ・レ ジ ス タFRの 役 割 を果 た す 。 この STRと プ ロ グ ラム ・カ ウ ン タ を合 わせ て プ ロ グ ラ ム ・ス テ ー タ ス ・ワ ー ド,PSWと 呼 ぶ 。 STRの ビ ッ ト0はWAITビ ッ トで あ り,こ れ が1の と きCPUは 待 ち状 態 とな る。STR の ビ ッ ト7が1の と きは 割 り込 み 可 能 で あ り,
0の と きは禁 止 状 態 で あ る 。 CPUは プ ロ グ ラ ム 実 行 中 に エ ラー を発 見 す る と,STRの ビ ッ ト1を 立 て て 待 状 態 に 入 る。 ま たエ ラー の種 類 を表 す た め に,メ モ リ の実 装 され て い な い ア ドレ ス に ア ク セ ス し た と きは ビ ッ ト2を,レ ジ ス タ番 号 が4を 超 え た と きは ビ ッ ト3を,イ ン デ クス ・レ ジス タ の番 号 が4を 超 えた と き は ビ ッ ト4を そ れ ぞ れ 立 て る。 STRはFFFOと い うア ドレ ス で ア クセ ス で き る。 また,タ イマ の た め に,TIMEOとTIME 1と い う二 つ の ポ ー トを用 意 す る。TIMEO の ビ ッ ト0が1の と きは タ イ マ が 割 り込 み 可 の 状 態 で あ り,0の と き は割 り込 み 禁 止 の 状 態 で あ る。TIME1は カ ウ ン タ で あ り,プ ロ グ ラ ム に よ っ て数 を書 き込 む と,1命 令 実 行 す る毎 に1ず つ 減 少 して い く。 そ して1か ら 0に な っ た と きに割 り込 み 要 求 を出 す の で あ る。TIMEOとTIME1は そ れ ぞれFOOO, FOO1番 地 に 割 り付 け られ て い る。 拡 張 し た COMETの メモ リ ・マ ップ を表1に 示 す 。 CASLとCOMETで は,具 体 的 な 命 令 コ ー ドを定 め て い な い の で,こ れ らの シ ス テ ム の 作 成 者 は 自分 で適 当 に コ冖 ドを定 め な け れ ば な らな い 。 本 シ ス テ ム で 使 用 した 命 令 コ ー ドを表2に 示 す 。 こ の コー ドを決 定 す る に 当 た っ て,文 献(5)を参 考 と した 。 VECT以 下 の 命 令 は,割 り込 み の 実 習 が で き る よ うに す る ため に,CASLに 拡 張 命 令 と して 付 加 し た もの で あ る。 VECTは,オ ペ ラ ン ドで 示 し た ア ド レ ス を,割 り込 み 時 に使 用 す る新 しいPSWの 内 容 を用 意 して お くア ドレス と してCPUに 対 して 宣 言 す る命 令 で あ る。 SVECTは 割 り込 み 時 に,旧 いPSWの 内 容 を退 避 す る ア ドレ ス をCPUに 対 して 宣 言 す る命 令 で あ る。 INTOは,CPUを 割 り込 み 禁 止 の状 態 に す る もの で あ り,INT1は 割 り込 み の可 の 状 表1,拡 張COMETの メ モ リ ・マ ッ プ 0000-3FFF メ イ ン ・メ モ リ FFFO STR FOOO FOO1 TIMEOタ イマ TIME1 表2命 令 コ ー ド MNEMONIC コ ー ド 長 さ MNEMONIC コー ド 長 さ EXIT FFOO 1 JPZ 60 2 IN FFO1 3 JMI 61 2 OUT FFO2 3 JNZ 62 2 JzE 63 2 LD 10 2 JMP 64 2 ST 11 2 PUSH 70 2 LEA 12 2 POP 71 2 ADD 20 2 CALL 80 2 SUB 21 2 RET 81 2 AND 30 2 OR 31 2 VECT FC 2 FOR 32 2 SVECT FD 2 CPA 40 2 LPSW FE 2 CPL 41 2 INTO :ei 1
SLA 50 2 INT1 FBOl 1
SRA 51 2 SLL 52 2 SRL 53 2 態 に す る も の で あ る 。 LPSWは,オ ペ ラ ン ドで 示 さ れ た 番 地 か ら PSWの 内 容 を ロ ー ドす る 命 令 で あ る 。 例 と し て,図5.1にDCで 定 義 し た16進 数 を,サ ブ ル ー チ ン で 文 字 列 に 変 換 して 出 力 す る プ ロ グ ラ ム を 示 す 。 ま た,そ れ をCASLア セ ン ブ ラ に か け て 出 て く る ソ ー ス ・ リ ス ト と オ ブ ジ ェ ク ト ・プ ロ グ ラ ム を そ れ ぞ れ 図5. 2,図5.3に 示 す 。 こ の オ ブ ジ ェ ク ト ・プ ロ グ ラ ム をCOMET シ ミュ レ ー タ で ロ ー ド し て,そ の メ モ リ ・ダ ン プ を と り,実 行 させ た 様 子 を 図5.4に 示 す 。 こ れ ら の シ ス テ ム は,MS-Cコ ン パ イ ラ を 用 い て 開 発 し た 。 そ の ソ ー ス リ ス ト を付 録 と し て 掲 載 し て お く。
I: main routine 2: MAIN START 3: LD GRO,C 4: LEA GR2,BUF 5: CALL HEXAP 6: OUT BUF,NUM 7: EXIT 8: BUF DS 4 9: NUM DC 4 10: C DC #FE02 11: END
12: ;GRO out by hexadecimal 13: HEXAP START 14: PUSH 0,GR1 15: PUSH 0,GR3 16: LD GR3,C4 17: LOOP ST GRO,W 18: LD GRI,MASK 19: AND GR1,W 20: SRL GR1,12 21: CPL GR1,C10 22: JPZ ALl 23: ADD GR1,AD1 24: JMP Ni
25: ALl ADD GR1,AD2 26: Ni ST GRI,0,GR2 27: ADD GR2,C1 28: SLL GRO,4 29: SUB GR3,C1 30: JNZ LOOP 31: POP GR3 32: POP GR1 33: RET 34: MASK DC #F000 35: W OS 1 36: Cl DC 1 37: C10 DC 10 38: C4 DC 4 39: ADI DC #0030 40: AD2 DC #0037 41: END 図 5.1
CASL-E Assembler System written by Y.Matsubara (27 Sep. 1987). 1: ; main routine 0000 1: MAIN START 0000 2: LD GRO,C 0002 3: LEA GR2,BUF 0004 4: CALL HEXAP 0006 5: OUT BUF,NUM 0009 6: EXIT 000A 7: BUF DS 4 000E 8: NUM DC 4 000F 9: C DC #FE02 0010 10: END
11: ;GRO out by hexadecimal
0000 1: HEXAP START 0000 2: PUSH 0,GR1 0002 3: PUSH 0,GR3 0004 4: LD GR3,C4 0006 5: LOOP ST GRO,W 0008 6: LD GR1,MASK
000A 7: AND GRI,W
000C 8: SRL GR1,12
000E 9: CPL GR1,C10
0010 10: JPZ ALl
0012 11: ADD GRI,AD1
0014 12: JMP N1
0016 13: ALl ADD GR1,AD2 0018 14: NI ST GRI,0,GR2 001A 15: ADD GR2,C1 001C 16: SLL GRO,4 001E 17: SUB GR3,C1 0020 18: JNZ LOOP 0022 19: POP GR3 0024 20: POP GR1 0026 21: RET 0028 22: MASK DC #F000 0029 23: W DS 002A 24: CI DC I 002B 25: C10 DC 10 002C 26: C4 DC 4 002D 27: AD1 DC #0030 002E 28: AD2 DC #0037 002F 29: END 図 5.2
SMAIN :V0000:A1000:R000F:A1220:R000A:A8000:EHEXAP :AFF02:R000A R000E:AFFOO:T0004:A0004:AFE02:SHEXAP :V0000:A7001:A0000:A7003 A0000:A1030:R002C:A1100:R0029:A1010:R0028:A3010:R0029:A5310 A000C:A4110:R0028:A6000:R0016:A2010:R002D:A6400:R0018:A2010 R002E:A1112:A0000:A2020:R002A:A5200:A0004:A2130:R002A:A6200 R0006:A7130:A0000:A7110:A0000:A8100:A0000:AF000:T0001:A0001 A000A:A0004:A0030:A0037: 図5.3
Comet Simulator written by Y.Matsubara( 25 Nov. 1987).
Loading Object Programs. ac=0000 svalue=0000 ac=0010 svalue=0000
--ofset=0000 --ofset=0010
Object program loading finished. ac==003F PC==0000 COM>M:0-3F 0/8 1/9 2/A 3/B 4/C 5/0 6/E 7/F M[0000] 1000 000F 1220 000A 8000 0010 FF02 000A M[0008] 000E FF00 0000 0000 0000 0000 0004 FE02 M[0010] 7001 0000 7003 0000 1030 003C 1100 0039 M[0018] 1010 0038 3010 0039 5310 000C 4110 003B M[0020] 6000 0026 2010 003D 6400 0028 2010 003E 1110028] 1112 0000 2020 003A 5200 0004 2130 003A M[0030] 6200 0016 7130 0000 7110 0000 8100 0000 M[0038] F000 0000 0001 000A 0004 0030 0037 COM>G0 :FE02
The waite bit was set. STR==8001 PC=000A COM> 図5.4 6.む す び 実 際 にプ ロ グ ラ ミン グ を教 え る立 場 に あ っ て,如 何 な る方 法 を使 え ば 学 生 が 理 解 で き る か は,常 に脳 裏 に あ る 問題 で あ る。 そ の た め の方 法 論 を考 え る に 当 た っ て,認 知 科 学 は, 重 要 な ヒ ン トを与 え る源 泉 で あ る。 プ ロ グ ラ ミン グ の 入 門教 育 に お い て,配 列 を如 何 に し て教 え るか は,こ れ に 携 わ る教 師 に共 通 の悩 み で あ る。 この 際,学 生 が す で に 頭 の 中 に構 築 して 日常 生 活 の 中 で何 気 な く使 って い る思 考 の 枠 組 み を利 用 す る こ とが,認 知 科 学 的 に 言 っ て最 も容 易 な教 え 方 で あ る。 筆 者 は実 際 の 入 門教 育 の 場 で,こ の 考 え方 に立 っ て一 つ の 方 法 を実 施 して み て,そ の 有 効 性 を確 認 した 。 こ の こ とは 逆 に言 え ば,人 間 が 新 し い概 念 を修 得 す る と き に は,そ れ ま で に修 得 した概 念 を利 用 して い る の だ とい う こ と を裏 書 きす る もの で もあ る。 プ ロ グ ラ ミン グ を教 え る に 当 た っ て経 験 す る,多 分 これ も共 通 の 悩 み は,い か に して 学 生 に 自発 的 に,も の を考 え させ るか と言 う こ とで あ る。 そ の た め に は,学 生 の興 味 を 引 く よ う な問 題 を用 意 す る こ とが 重 要 と考 え られ る。 そ こで 簡 単 な グ ラ フ ィ ッ クの 機 能 を使 っ て絵 を描 か せ た りす る こ とに な るの で あ る。 しか し,こ れ を単 な る表 面 的 な興 味 に終 わ ら せ ず に,プ ロ グ ラム を 自分 で考 え る こ と に繋 い で ゆ く事 は 困 難 な 問 題 で あ る。 絵 を描 く機 能 を利 用 して,感 情移 入 させ る こ とに よ って プ ロ グ ラ ミン グ を 自然 に修 得 さ せ よ う と し た の がLOGOと い う言 語 で あ る。 これ は,認 知 科 学 的 な 発 想 を も とに し て考 察 され た もの で は あ るが,現 在 の と こ ろ額 面 ど う りの成 功 を納 め て い る とは い い難 い 。 そ の 失 敗 の 原 因 を探 る こ とに よ っ て,本 論 文 で は 現 代 の コ ン ピ ュー タ 技術 に見 合 っ た,今 後 の 入 門 教 育 用 の プ ロ グ ラ ミン グ言 語 の あ るべ き 姿 を提 案 した 。 コ ン ピ ュ ー タ教 育 の 中 で,ア セ ン ブ ラ及 び 機 械 語 の教 育 を どの よ うに位 置づ け,ど の よ うに行 うか は避 けて 通 る こ との で きな い 問 題 で あ る。 本 論 文 で は,こ の 問題 につ い て の 筆 者 の考 え を述 べ る と と もに,そ の具 体 的 な 答 え の 一 つ と して,筆 者 が 開発 したCASLア セ ン ブ ラ とCOMETシ ミュ レー タ に つ い て 報
告 した。 こ れ らは,オ ブ ジ ェ ク ト ・プ ロ グ ラ ム の 役 割 が 理 解 し易 い こ とに 留 意 し,ま た と くに割 り込 み の 実 験 が で きる よ う に拡 張 した も の で あ る 。 割 り込 み を 含 むCPUの 動 作 を 初 心 者 に理 解 させ るた め に,視 覚 的 な モ デ ル を構 成 す る こ とは今 後 に残 さ れ た 課 題 とす る 。 今 回 は実 際 の 教 育 の場 に於 て,如 何 に して 理 解 させ る か とい う方 法 論 を 中 心 と し て議 論 を行 っ た。 今 後,課 題 を与 え られ た 人 間 が 如 何 な る過 程 で プ ロ グ ラ ミン グ を行 って い る の か につ い て 考 察 を深 め て い きた い 。 そ の 際, 課 題 を記 述 す る 自然 言語 の 果 た す役 割 は非 常 に 重要 で あ るの で,自 然 言 語 に 関 す る研 究 も 併 せ て行 う予 定 で あ る。 末 筆 なが ら,本 研 究 が 昭 和61年 度文 教 大 学 情 報 学 部 共 同研 究 費 の補 助 を受 け た こ とに謝 意 を表 す る 。 そ して,ご 支 援 い た だ い た 広 内 哲 夫先 生 に感 謝 い た し ます 。 参 考 文 献 (1)松 原 康 夫:"プ ロ グ ラ ミ ン グ に 関 す る 認 知 科 学 的 研 究(1)",情 報 研 究 第7号,PP.96-104,(1986). (2)佐 伯 胖 編:"理 解 と は何 か",認 知 科 学 選 書4,東 京 大 学 出 版 会(Nov.1985). (3)祐 安 重 夫:"LOGO人 工 知 能 へ の ア プ ロ ー チ",ラ ジ オ 技 術 社(1984). (4)昭 和62年 度 情 報 処 理 技 術 試 験 案 内 書,情 報 処 理 技 術 者 試 験 セ ン タ ー (5)M.M.L."は じめ て のCASL",工 学 社(1986). (6>原 野 秀 永 監 修:"わ か る ア セ ン ブ ラCOMET& CASL",学 習 研 究 社(1987)
付録 1.CASL ア セ ン ブ ラ 。 ソ ー ス リ ス ト
1: #include <stdio.h> 2: #define MAXT 1000 3: FILE tfpl,tfp2;
4: struct lab{char• label[7]; unsigned value,def;} Itable[MAXT]; 5: struct mt{char mcode[6];unsigned ocode,typ.e;} mtable[21] = 6: {{"ADD ",0X2000,1},1"AND. ",0X3000,11,{"CALL ",0X8000,2}, 7: {"CPA ",0X4000,1},{"CPL ",0X4100,1}.{"EOR ",0X3200,1}, 8: ",0X6100,21,riMP ",0X6400,2},{"JNZ ",0X6200,2}, 9: - {"jP7. ",0X6000,2},{"M ",0X6300,2},{"LD ",0X1000,1}, 10: {"LEA ",0X1200,11,{"OR ",0X3100,1},{"PUSH ",0X7000,2}, 11: {"SLA ",0X5000,1},{"SLL ",0X5200,1},{"SRA ",0X5100,1}, 12: {"SRL ",0X5300,1},{"ST ",0X11004},{"SUB ",0X2100,1} 13:
14: int freearea=0,lstart=0,lend=0,pass,startf,ocnt=0;
15: it freearea : indicates the top of the free area. */ 16: It !start: indic-ates the beginning of local area. */ 17: /* lend : indicates the tail of local area. t/ 18: /* ocnt count the numnber of character in object file */ 19: /****************MAIN*******MAIN*******MAIN*******************/ 20: main(argc,argv) 22: int argc; 23: char targv[]; 24: { char ccc[13]; 25: FILE *fopen(); 26: /t file name F.1311 */ 27: {int
28: if (argc 1= 2) Iprintf("t421 1 hr h WI"): goto owari:1 29: for(i=0:argvE1ilii 1= 0 && argv[i][i] !=,.,;i");
30: if(i==0){printf("file name error");goto owari;}
31: if(argv[1][i]==0) Iprintf("bad extension"); goto owari: 1 32: i++; li=i;for(j=0;a•gv[1][i]!=0;j++)ccc[j]=Argv[1][1++];
33: ccc[j]=0;
34: if(!issame(ccc,"cas") && !issame(ccc,"CAS"))
35: Iprintf("bad extension"); goto owari:1
36: leteq(ccc,argv[1J); leteq(&ccc[k],"013,1"): 37:
38: It */
39: {char gyo[73]: • 40:
41: printf(" CASL-E Assembler System written by"); 42: printf(" Y.Matsubara (27 Sep. 1987).Yn");
43: 44:
45: for(pass=1;pass<=2;pass++)
46: { int gline=1,11-ine=1,1evel=0; unsigned ac=0; 47: int locsw=0; unsigned locsave;
48: fpl=fopen(argv[1],"r"); 49: if(pass==2){int i-;fp2=fopen(ccc,"w");lend=0; 50: It for(i=0;i<freearea;i++) 51: printf("Cts#2:0x#Yn",ltable[i].label,Itable[i].valu0; 52: */ } 53: while (getgyo(gyo)!=0) 54: It 1 4-3/ J 93,1 */ 55: {int i=0,j,inc=0,err=0,dflag=0,cflag=0,iop,loc; 56: It cflag==I on coment line */ 57: It dflag==I on double definit)on */ 58: char label[7],olab[7],mnemonic[6],b[5]; 59: It LABEL 5:i J :131) t/
60: startf=0;
61: leteq(label," "); 62: if (isupper(gyo[0]))
63: { for(i=0;i<=5 && (isuPper(gYo[i]) II isdigit(gyo[i]));i++)
64: labelfil=gyo[i];
68:
69: else
70: { while (gyo[i]==' ')i++;
71: if(gyo[i]==';'){cflag=1;goto linend;}
72:
73: If mnemonic - operand 939 */ 74:
75: leteq(mnemonic," ");
76: for (j=0;j<=4 && isupper(gyo[i]);j++) mnemonic[j]=gyo[i++]; 77: iop=i; If mnemonic code ) 199 lif 3 **"Ii 4, */
78: if(gyo[i]1=' ' && gyo[i]l=';' && gyo[i]!="10'){err=3;goto linend;} 79: while(gyo[i]==")i++;
80: if ( issame(mnemonic,"DC "))
81: lint n;
82: if(isdigit(gyo[i]) II gyo[i] == II gyo[i] == '+') 83: { if(!isdigit(gyo[i]) && 1isdigit(gyo[i+1]))
84: terr=4;printf("loc2"); goto linend;)
85: n=todeci(gyo,&i);
86: if(pass==2) object(phexa(b,n),'A'); inc=1;
87:
88: else if(gvo[i]=='#')
89: {inc = 1 ; i++;
90: if(hexop(b,gyo,&i,pass)1=4){err=4 ; goto linend;}
91: if(pass==2)object(b,'A');
92: }
93: else if(gyo[i]=='Y")
94: {char C[73]; unsigned n; i++;
95: for(i=0;gYo[i]1='1" && gYo[i]1=10';j++)c[A=gVo[i++]; 96: c[j]='YO';/* printf("flj==%d#i==%d#%s#Yn",j,i,c); */
97: if(gyo[i]=='Y0'){err=5;goto linend;}
98: if(j==0){err=6; goto linend;}
99: i++; inc=j;
100: if(pass==2)
101: for(j=0;c[j]!=10',j++)
102: {n=c[A] & OXOOFF; object(phexa(b,n),'A'); 103:
104: else if(isupper(gyo[i])) If WWA•- LABEL J 939 */
105: inc=1; 106: loc=labop(olab,gyo,&i); 107: if(pass==2) 108: {if(Itable[loc].def) 109: object(phexa(b,Itable[loc].value),.'R'); 110: else 111: object(olab,'E')., 112: } 113: } 114: else
115: { err=4; goto linend; }
116:
117: If DC J *99 */
118: else if(issame(mnemonic,"DS "))
119: tif(1(gyo[i]=='+' && isdigit(gvoCi+1])) && !isdigit(gyo[i]))
120: {err=4; goto linend;}
121: inc=todeci(gyo,U);
122: if(pass==2)object(phexa(b,inc),'T');
123: }
124: else if(issame(mnemonic,"START")) 125: {/* START */ unsigned svalue=0;
126: startf=1;
127: ' if(level==1){err=8; goto linend;}
128: level=1; 129: if(pass==1) 130: {leteq(ltable[freearea].label,label); 131: Itable[freearea].value=0;Itable[freearea++].def=10; 132: Istart=freearea; lend=freearea; 133:
135: if(pass==2)
136: {Istart=++Iend;
137: while(Itable[lend].def!=10 && lend!=freearea) lend++; 138:
139: Ieteq(olab," ");
140: if(isupper(gyo[1]))
141: {loc=labop(olab,gyo,&i);
142: if(pass==2 && Itable[loc].def!=1)ferr=9; goto linend;}
143: svalue=ltable[loc].value;
144: }
145: if(pass==2)
146: {/* start label & it's value output V
147: object(label,'S'); 148: object(phexa(b,svalue),'V'); 149: Trintf("Yn"); 150: } 151: Iline=1; ac=0; 152: 1/* START J fl) t/ 153: else if(issame(mnemonic,"END 7)) 154: fif(level!=l){err=8;goto linend;} 155:. leve1=0;
156: if(!issame(label," ")){err=1;goto linend;} 157:
158: else if(issame(mnemonic,"lNT "))
159: {char c; inc=1;
160: c=gyo[i++];
161: if(c!='0' && c!='1'){err=4; goto linend;}
162: if(pass==2)
163: {if(c=='0')object("FB00",'A'); 164: else object("FB01",'A');
165: }
166:
167: else if( issame(mnemonic,"LPSW ") 168: II issame(mnemonic,"VECT ") 169: II issame(mnemonic,"SVECT") 170: 171: inc=2; 172: if(pass==2) 173: f if(issame(mnemonic,"LPSW "))object("FE007,'A');
174: else if(issame(mnemonic,"VECT "))object("FC00",'A') .; 175: else bject("FD00",'A');
176:
177: if(gyo[i]=='#')
178: ti++:
179: if(hexop(b,gyo,&i,pass)!=4)ferr=4; goto linend;}
180: if(pass==2)object(b,'A'); 181: } 182: else if(isupper(gyo[i])) 183: floc=labop(olab,gyo,&i); 184: if(pass==2) 185: fif(Itable[loc].def) 186: object(phexa(b,ltable[loc].value),'R'); 187: else 188: object(olab,'E'); 189: 190: } 191: else
192: { err=4; goto linend;}
193: /* LPSW , VECT , SVECT J *911 f/
194: else if(issame(mnemonic,"IN ") II issame(mnemonic,"OUT "))
195: inc=3;
196: if(pass==2)
197: fif(issame(mnemonic,"1N "))object("FF01",'A');
198: else object("FF02",'A');
199: }
202: if(pass==2)
203.: {if(Itable[loc].def) object(phexa(b,ltable[loc].value),'R');
204: else object(olab,'E');
205: }
206: if(gyo[i++]!=',' II !isupper(gyo[i])) {err=4; goto linend;) 207: loc=labop(olab,gyo,&i); 208: if(pass==2) 209: {if(Itable[loc].def) object(phexa(b,Itable[loc].value),'R'); 210: else object(olab;'E'); 211: 1 212: 213: 214: else if(issame(mnemonic,"EXIT ")) 215: inc=1; 216: if(pass==2) object("FF00",'A'); 217: } 218: else if(issame(mnemonic,"POP "))
219: {int grnum=0; inc=2;
220: if(gyo[i++]!='G' II gyo[i++]!='R' II !isdigit(gyo[i]))
221: ferr=4; goto linend;}
222: grnum=gyo[i++]-'0'; if(grnum > 4){err=4; goto linend;}
223: if(pass==2)
224: { unsigned opc; opc=0X7100 I (grnum << 4); 225: object(phexa(b,opc),'A'); object(phexa(b,0),'A'); 226: } 227: } 228: else if(issame(mnemonic,"RET ")) 229: inc=2; 230: if(pass==2) 231: lobject("8100",'A'); 232: object(phexa(b,0),'A'); 233: } 234: }
235: else /* Executive Operations other than
236: IN , OUT , EXIT , POP , RET, LPSW ,VECT , SVECT ,INT */
237: {int type,opc,grnum,xrnum,loc,ladr=1,n; inc=2;
238: type=mtsearch(&opc,mnemonic,mtable);
239: if(type==-1){err=3;goto linend;}
240: /* operand h4t1- */
241: if(type==1) If CR,adr[,GR] */
242: {if(gyo[i++]!='G' 11 gyo[i++]!='R' II !isdigit(gyo[i]))
243: {err=94;goto linend;}
244: grnum=8Y0[i++]-'0'; if(grnum>4){err=94 ; goto linend;}
245: if(gyo[i++]!=','){err=94; goto linend;}
246:
247: else /* type==2 */ grnum=0;
248: If type == 1 or 2 */
249: if(isupper(gyo[i]))loc=labop(olab,gyo,U);
250: else{ ladr=0; n=todeci(gYot&i); }
251: if(gYo[i]==',')
252: li++;
253: if(gyo[i++]!='G' II gyo[i++]!='R' II !isdigit(gyo[i]))
254: {err=14;goto linend;}
255: xrnum=gyo[i++]-'0';
256: if(xrnum >4 II xrnum==0){err=24; goto linend;}
257: }
258: else /* adr only */ xrnum=0;
259: if(pass==2)
260: { 'opc=opc I (grnum << 4) I xrnum ;
261: object(phexa(b,opc),'A'); 262: if(ladr==1) 263: fif(Itable[loc].def) 264: object(phexa(b,ltable[loc].value),'R'); 265: else 266: object(olab,'E'); 267: }
269: }
270: } /4 Executive operations other than POP , RET I 49V 4/ 271: /4 mnemonic - operand PP) 4/
272: /4 r3/ 71 J Fi39 4/
273: if(level==0 && !issame(mnemonic,"END ")) 274: {err=9;goto linend;}
275: while(gyo[i]==")i++,
276: if(gyo[i]1=10' && gyo[i]1=';'){ err=34;goto linend;} 277: /4 label / 139 4/
278: if(!issame(label," ") && startf==0) 279: { int loc; 280: loc=ltsearch(label); 281: if(pass==1) 282: {if(loc==-1) 283: Ileteq(ltable[freearea].label,label); 284: Itable[freearea].value=ac; Itable[freearea++].def=1; 285: lend=freearea; 286: } 287: else if(Itablefloci.def==0) 288: Itable[loc].value=ac;Itable[loc].def=1,1 289: } 290: else /t pass==2 4/ 291: { if(ltable[loc].value!=ac) dflag=1; 292: } It double definition t/ 293: } 294: /4 source printing 4/ 295: linend: if(pass==2) 296: { 297: if(err==0){if(cflag==1)printf(" "); 298: else if(dflag==1)orintf(" d.def."), 299: else printf(" %s ",phexa(b,ac));} 300: else printf(" err%2d ",err);
301: printf("%5d: "Wine); 302: if(err==0 && cflag==0)
303: printf("%s %s %s",label,mnemonic,&gyo[iop]); 304: else printf("%s",gyo);
305: printf("Yn"); /4 h41"31 4/
306: }
307: /4 address counter increment 4/
308: ac+=inc;
309: /4 line number increment 4/
310: gline++; !line++;
311: Pic— while (getgyo(gyo)!=0) J VP) ----t/ 312: fclose(fP1);
313: if(pass==2){cclose(fp2); if(level==1) printf(" Y"ENDY" expectedYn");) 314: 315: 1/*---- for(pass=1;pass<=2;pass++) J 49V 4/ 316: 1/*---- !table l mtable 499 4/ 317: owari:; 318: }/t main 147') 4/ 319: getgyo(gyo) 320: char gyo[]; 321: lint i;char c;
322: for (i=0;i<72 && (c=getc(fP1))1=EOF && c1='Yn';++1) gyo[i]=c; 323: while(c1=EOF && c!='Yn')c=getc(fP1);
324: gyo[i]='YO' :return(i); 325: }/t getgyo l 479 41 326; Itsearch(label) 327: char label[]; 328: {int i; /444:11h5f4 Fl -1 3 hJ/ttt/ 329: /tprintf("#%s#3 Walstart4d#Iend=%d#Yn",label,Istart,lend);14 330: for(i=lstart;j < lend && (1issame(ltable[i].label,label));i++) 331: /4 printf("#%d#%sit",i,Itable[i].label);printf("i=%d",i)*/;
332: if(i == lend) return(-1); else return(i); 333: }
336: {if(c>='0' && c<='9')return(1); 337: else return(0);
338:
339: isupper(c) 340: char-c;
341:'{if (c >= 'A' && c <= 'Z')return(l); 342: else return(0);
343: 1
344: issame(sl,s2) 345: char sl[],s2[]; 346: {int i;
347: for(j=0;s1[i]!=0 && sail==s2[i];i++); 348: if(slIi1==s2[1]) return 1 ; 349: else return 0 .; 350: } 351: leteq(sl,s2) 352: char sl[],s2[]; 353: {int i; 354: for(i=0;(s1[0=s2[1])!=0;i++), 355: return(i); 356: } 357: phexa(b,n) 358: char b[];unsigned n; 359: { int i,j; unsigned m; 360: for(i=3;i>=0;i--) 361: { m=n/16;j=n-m*16; 362:- b[i]=((j<10)? j+'0': j-l0+'A'); 363: n=m; 364: } 365: b[4]='Y0'; 366: return &b[0]; 367: } 368: todeci(gyo,pi)
369: char gyo[]; int *pi; 370: {unsigned n=0; int i,j; 371: i=*pi; j=1;
372: if(gyo[i]=='+')i++; else if(gyo[i]=='7'){j=-1,i++;} 373: . while(isdigit(2Yo[i]))11=n1:10+8Y0[i++]-'0';
374: *pi=i; if(j==-1)n=-n; 375: return n;
376: }
377: labop(olab,gyo,pi)
378: char gyo[],olab[]; int *pi; 379: {int i,j,loc;
380: •i=*pi;
381: leteq(olab," "); 382: for(j=0;
383: • j<6 && i<=72 && (isdigit(gyo[i]) II isupper(gYo[i]))-; 384: j++) olab[j]=gYo[i++]:
385: *pi=i;
386: loc=ltsearch(olab);
327: if(pass==1 && loc==-1)
388: {leteq(ltableffreeareaLlabel,olab); 389: Itable[freearea++].def=0; • 390: 1end=freearea; 391: -392:. return IOC, 393: } 394: object(b,c) 395: char b[],c; 396: {int j; 397: putc(c,fp2); 398: for(j=0;b[j]1='W;j++) 399: .putc(b[j],02);
400: ocnt++; if(ocnt>=10){ocnt=0; putc('lin',fP2);} 401: else putc(':',fp2);
403: hexop(b,gyo,pi) 404: char b[],gYo[];int 405: {int i,j;
406: for(j=0;j<4;j++)b[j]=' '; 407: i=fpi;
408: for(j7,0;isdigit(gyo[i]) 11 (gYo[i]>='A' && gYo[i]<='F');j44)
409: if(j<4) b[j]=gyo[i++]; 410: b[4]='YO'; 411: tpi=i; 412: return j; 413: } 414: mtsearch(popc,mnemonic,mtable) 415: struct mt mtable[]; 416: unsigned *pope; 417: char mnemonic[]; 418: {int low,high,mid;char c; 419: for(high=20,low=0 ; high>=low; ) 420: { mid=(high+low)/2; 421:. c=scomp(mnemonic,mtable[mid].mcode); 422: if(c=='<') high=mid-1; 423: else if(c=='>') tow=mid+1; 424: else {high=mid-1; low=mid;}
425: }
426: if(c=='=') lfpopc=mtable[midLocode;returo mtable[mid].type ;}
427: else return -1;
428:
429: scomp(ml,m2) 430: char ml[],m2[]; 431: {int
432: for(i=0;m1[i]!=0 && maii==m2Ci];i++)
433: ;
434: if(ml[iJ>m2[i]) return '>'; 435: else if(ml[i]==m2[0) return "=';
436: else return '<';
437: } 438: htohexa(b) 439: char bp;
440: {unsigned i,n; char c; 441: n=0; 442: for(i=0;i<=3;i++) 443: {c=b[i];n=nf16+((c<=t9')? c-'0': c-'1Y+10); 444: } 445: return n; 446: 1
1寸録2.COMET シ ミ ュ レ ー タ 。 ソ ー ス リ ス ト
1: #include <stdio.h>
2: #define LEND 200 It the end of label table */ 3: #define MEND 16384 It the end of main memory */ 4: FILE *fpl;
5: /*---- for loading */ 6: unsigned m[MEND],ac;
7: struct lab{char label[7]; unsigned value;} Itable[LEND]; 8: int freearea=0; /*--freearea of Itanle--*/
9: It for chat */
10: unsigned vect=0,svect=0,intreq=0,time0=0,time1=0; 11: unsigned pc=0,gr[5],h[5],str=0,1istsw=0;
12: It h[0]--11[4] indicate halting points. */ 13: char s[81]:
14:
15: /* main function */
16:
17: main(argc,argv)
18: i.nt argc; char targv[];
19: { char termt[10],term2[10],slabel[7]; 20: FILE *fopen();
21: int ofile,j,k,pass;
22: It title printing */
23: shome();
24: printf("Comet Simulator written by Y.Matsubara( 27 Sep. 1987).Yn"); 25: printf("Yn Loading Object Programs.Yn"):
26: It title printing end */
27: if(argc<2){printf("Ml h" ti.Yn"); goto owari:} 28: for(pass=1;pass<=2;pass++)
29: fac=0:
30: for(ofile=t;ofile<argc;ofile++)
31: (char c; int i; unsigned ofset; 32: fpl=fopen(argv[ofile],"r"):
33: while(getterm(term1)1=0) 34:
35: switch(terml[0])
36: (case 'A':m[ac++]=hexa(&terml[1]); break; 37: case 'R':m[ac++]=hexa(&terml[1])+ofset; break; 38: case 'S':{if(getterm(term2)==0 II term2[0]1='V')
39: {printf("S J V h" f4.Yn"); goto owari;} 40: leteq(slabel,&terml[1]);
41: if(pass==1)
42: fstoroku(literml[1],ac+hexa(&term2[1])):
43: printf("ac=%04X svalue=%04X Yn",ac,hexa(&term2[1])):
44: }
45: /* Whether the interpretation is correct or not
46: should be made sure.
47: */
48: ofset=ac;
49: if(pass==2)printf("--ofset=%04XYn",ofset):
50: break;
} 52: case 'T':{int i,t;
53: t=hexa(&terml[1]): 54: for(i=l;i<=t;i++)m[ac++]=0; 55: break; 56: } 57: case 'E':{int 1; 58: if(pass==2) 59: {1=Itsearch(&terml[1]): 60: if(1==-1)
61: {printf("external label undefined Y"%sY" in %sYn4
62: ,Itterml[1],slabel 63: ); 64: m[ac]=OXFFFF; 65: 66: else m[ac]=Itable[1].value; 67: }
68: ac++
69: break;
70: }
71: case '1.':{ac=hexa(&terml[1]); break;
72: }
73: default: printf("Error in object file Y"%sY" .Yn",argv[ofile]);
74: lreak; 75: 76: } 77: fclose(fpl) 78: } 79: } 80: It ' */
81: printf("Object program loading finished. ac=404)an",ac);
82: It t/
83: It pc should be set to the value of first label---'-*/ 84: pc=ltable[0].value;
85: printf("PC==%04Vin",pc);
86: /* SP should be give an initial value *1 87: gr[4]=MENO; 88: It t/ 89: chat(); 90: owari:; 91: } .92: getterm(term) 93: char term[]; 94: lint i;char c;
95: for(i=0;i<10 && (c=getc(fpl))!=EOF && c1='Yn' && c!=':',1++)
96: term[i]=c
97: term[i]='YO': return(i); 98: }
99: hexa(term) 100: char term[];
101: {int char c; unsigned n=0; 102: for(i=0;term[i]!=10';i++) 103: fc=term[i];n=n*16+((c<='9')? c-'0':c-'A'+10); 104: } 105: return n; 106: } 107: storoku(terml,value)
108: char tenni[]; int value; 109: { int loc;
110: if((loc=ltsearch(terml))1=-1)
111: { printf("label conflict %s .Yn",terml); return -1;}
112: else 113: { if(freearea==LEND) 114: {printf("ltable overflow.Yn");return -1;} 115: leteq(ltable[freearea].label,terml); 116: Itable[freearea].value=value; 117: freearea++; 118: return 1; 119: } 120: } 121: leteq(sl,s2) 122: char sl[],s2[]; 123: {int i; 124: for(i=0;(sl[i]=s2[i])!=0;i++); 125: return i; 126: } 127: Itsearch(label) 128: char label[]; 129: {int i;
130: for(i=0; i<freearea && Oissame(ltable[i].label ,label));i++) 131:
132: if(i==freearea) return -1 ; else return i; 133: }
135: char sl[],s2[]; 136: {int i; 137: for(i=0;s1[i]!=0 Msl[i]==s2[i];i++); 138: if(sl[i]==s2[i]) return 1; 139: else return 0; 140: I 141: shome() 142: fprintf("%c[2,1",0x1b); 143: } 144: chat()
145: {int char b[11]; unsigned n,n1; 146: for(j=0;j<=4;j++)h[j]=0;
147: /* */
148: PROMPT:
149: printf("COM>"); simin(80,$); 150: for(i=0;s[i]!="10';i++)
151: if(s[i]>='a' && s[i]<='z') 152:.s[i].--s[i]-0x20;
153: for(i=0;isupper(s[i]) && i<10;i++) b[i]=s[i]; 154: b[i]='YO';
155: if(issame(b,"PC"))
156: fif(sCi]=='Y0')printf("PC==104XYn",pc); 157: else if(s[i++]=='=,)
158: {if(rhexa(&n,&i)>4 II s[i]!='YO') goto COMERR;
159: pc=n;
160: }
161; else goto COMERR; 162: } 163: else if(issame(b,"GR")) 164: {char c; c=s[i++]; • • . 165: if(c==-'YO') 166: in j; 167: for(j=0;j<=4;j++)printf("GR%d==t04X ",j,gr[j]); 168: printf("Yn"); 169: }
170:. else if(c>='0' && c<='4') 171: 172: if(s[i]=='YO') 173: {printf(" GR%c==%04Xlin",c,gr[c-'0']); 174: } -175: else if(s[i]=='=') 176: fi++;
177: if(rhexa(&n,&i)>4 II s[i]1='Y0') goto COMERR; 178: gr[c-'0']=n;
179: }
180: else goto COMERR;
181: }
182: else goto COMERR; 183: }
184: else if(issame(b,"STR"))
185: tif(s[i]=='Y0')printf("STR=.104XYn",str); 186: else if(s[i]=='=')
187: li++;
188: if(rhexa(&n,&i)>4 II s[i]!='YO')goto• COMERR; 189: str=n;
190: }
191: else goto COMERR; 192: } 193: else if(issame(b,"PSW")) 194: lif(s[i]WY0')goto COMERR; 195: printf("STR==%04X; PC==%04XYn",str,pc); 196: 197: else if(issame(b,"M")) 198: {if(sfi+-111=':')goto COMERR; 199: if(rhexa(&n,U)>4)goto COMERR: 200: if(s[i]=='Y0')printf("M[1;04X]==%04XYn",n,m[n]);