初学者がコンピュータの動作原理を学ぶための今のところベストな方法

# はじめに

みなさんは，プログラミングが得意ですか，苦手ですか？ 苦手だという人は，もしかしたら，コンピュータがどのように動作するのかを具体的にイメージできていないのかもしれませんね。

本記事は，コンピュータの動作原理について，初学者がどのように習得したらいいかのヒントを提示します。

# 前提知識

[「コンピュータの基本構成と動作原理〜知識編」](https://qiita.com/zacky1972/items/ef4486e8a6d95edb68fd)のうち，コンピュータの基本構成に登場する言葉をすでに知っているという前提でお話しします。

# コンピュータの動作原理を習得する方法

コンピュータの動作原理を習得する方法は，少なくとも次の4通りあることを確認しています

関連文献

* 山崎 進ほか: "直観的な理解を促進するワークショップ「コンピュータの動作原理」の授業設計", パーソナル利用技術学会論文誌, Vol.9 合併号, 2015年3月

1. 先行オーガナイザ方式
2. ロールプレイング・ワークショップ方式
3. 仮想機械シミュレーション方式
4. 実機方式

以下，順番に簡単に説明していきましょう。

## 先行オーガナイザ方式 (Advance Organizer approach)

みなさんは，何か新しいことを学ぼうとするときに，覚えやすいように，すでに知っている情報の中からこれから学ぼうとする情報に似ていることと関連づけて，学習することはありませんか？

例えば，みなさんは既に日本の文化について知っています(もし他の国や地域の出身である場合には，「日本」という言葉を，各自の出身の国や地域に置き換えてください)。これから未知の場所に旅行するとして，その国や地域の文化を習得するときに，自分の知っている日本の文化を手掛かりにして，「この国や地域の○○は，日本の△△にあたる」という具合に比較しながら習得したりすることと思います。

これから学びたい知識(＝未知の場所の文化)に対して，学びの手がかりにした知識(＝日本の文化)の枠組みのことを，認知心理学や教育工学では**先行オーガナイザ**(Advance Organizer)と呼びます。

コンピュータの動作原理を習得するときに，先行オーガナイザを用いた学習方法があります。例えば，1995年当時に普及していた日本語ワードプロセッサ専用機が高校生にとって身近な存在であると考えたことにより，先行オーガナイザとしてワードプロセッサの機能，構造，振る舞いになぞらえて，コンピュータの動作原理を説明する方法が1995年に提案されています。

関連研究:

* [鈴木克明, 渡邊あや: "基盤的教育論(公開授業)", 熊本大学 教授システム学専攻, 2007](http://www.gsis.kumamoto-u.ac.jp/opencourses/pf/3Block/08/08-1_text.html)
* D. Ausubel: The Psychology of Meaningful Verbal Learning. New York: Grune & Stratton (1963).
* 河村一樹: 日本語ワープロを教材にしたコンピュータサイエンス入門講座, 全国大会講演論文集, 第51回平成7年後期(1), 277-278, 1995-09-20, 一般社団法人情報処理学会(1995)
* 河村一樹: 高校における教科「情報」としてのコンピュータサイエンス入門教育, 情報処理学会研究報告, コンピュータと教育研究会報告 96(52), 45-51, 1996-05-24, 一般社団法人情報処理学会(1996)

## ロールプレイング・ワークショップ方式 (Role Playing Workshop approach)

私たちが考案した方法です。学習者がコンピュータのCPUになりきって，与えられたプログラムに沿ってメモリやI/Oを操作することを通して，コンピュータの動作原理を理解することを狙っています。具体的なやり方については後述します。

私たちが参考にした先行事例としては MIT の Maeda の事例があります。

関連研究:

* 山崎 進ほか: "直観的な理解を促進するワークショップ「コンピュータの動作原理」の授業設計", パーソナル利用技術学会論文誌, Vol.9 合併号, 2015年3月
* [J. Maeda: "Human Powered Computer Experiment", 1993](https://youtu.be/KaIxBIclGUQ)

## 仮想機械シミュレーション方式 (Simulated Virtual Machine approach)

仮想機械シミュレーション方式は，PC上で動作するソフトウェアで実現された，単純化したコンピュータを操作することを通じて学習者が動作原理を習得します。

事例としては，土山の事例，木室らの事例，兼宗らの Dolittle，Li and Li の事例などがあります。

関連研究:

* 土山牧夫: 教育用シミュレータの開発，電子情報通信学会論文誌 A 基礎・境界 73(6), p1150-1158, 1990-06, 電子情報通信学会基礎・境界ソサイエティ(1990)
* 土山牧夫: 教育用計算機シミュレータ(CP-803)の開発: 解答の解析について，電子情報通信学会秋季大会講演論文集1994年，情報・システム, 415, 1994-09-26, 一般社団法人電子情報通信学会(1994)
* M. Tsuchiyama: Development of an educational computer simulator, Electronics and Communications in Japan (Part III: Fundamental Electronic Science), Volume 74, Issue 3, pages 25-35, DOI:10.1002/ecjc.4430740304 (1991)
* 甲斐康司，木室義彦，坂口良文，安浦寛人: 情報社会に生きる小中学生のための計算機の動作原理の教育，情報処理学会論文誌, 43(4), 1121-1131 (2002)
* 木室義彦，松本三千人，安浦寛人: 小中学生のための計算機の動作原理教育: CPUシミュレータとラジコンカー制御 (<特集>認知と学習・教育インタフェース/一般), 電子情報通信学会技術研究報告, ET, 教育工学, 103(536), 1-6 (2003)
* 木室義彦，松本三千人，安浦寛人: 4-1 ロボットで学ぶコンピュータの仕組み: 情報社会に生きる小中学生のための計算機の動作原理の教育 (4. 初等中等教育) (<特集> グローバル化時代の教育と研究), 電子情報通信学会誌, 86(11), 868-873 (2003)
* 兼宗進，中谷多哉子，御手洗理英，福井眞吾，久野靖: 初中等教育におけるオブジェクト指向プログラミングの実践と評価，情報処理学会論文誌，プログラミング，44(SIG_13(PRO_18)), 58-71 (2003)
* S. Kanemune, T. Nakatani, R. Mitarai, S. Fukui and Y. Kuno: Dolittle-Experiences in Teaching Programming at K12 Schools, In C5 (pp. 177-184) (2004)
* S. Kanemune and Y. Kuno: Dolittle: an object-oriented language for K12 education, In EuroLogo (pp. 144-153) (2005)
* J. Li and S. Li: Exploration of computer-principle virtual laboratory, Proceedings of 2011 International Conference on Electronics and Optoelectronics. Vol. 4 (2011)

## 実機方式 (Real Machine approach)

実機方式は，マイコンボード等で実現された，単純化したコンピュータを操作することを通じて学習者が動作原理を習得します。PCそのものを動作原理の習得に用いない理由は，PCは高度化しているので初学者にとって理解するのが難しいためです。

実機方式の事例は，KITE, 中西の事例，GAINER, 澤田らのKERNEL, 八代高専の小島らの事例，徳山高専の重村らの事例などがあります。

関連研究:

* 末吉敏則，田中康一郎，柴村英智: KITE: 書変え可能なLSIを用いた教育用マイクロプロセッサ，全国大会公園論文集 45.6 (1992): 67-68, 一般社団法人情報処理学会 (1992)
* 中西正和: 機械語プログラミング教育の必要性と実習用コンピュータの製作 (1), bit, Vol.25, No.8, pp.24-31 (1993)
* 中西正和: 機械語プログラミング教育の必要性と実習用コンピュータの製作 (2), bit, Vol.25, No.9, pp.58-63 (1993)
* 原田克彦，小林茂: GAINER: メディア・アーティストのための再構成可能なI/Oモジュール，情報処理学会研究報告 [音楽情報科学] 2005(129), 7-11. 2005-12-23, 情報処理学会 (2005)
* 花野井歳弘，有田五次郎，澤田直，牛島和夫，吉元健次，牧薗幸司: 双方向型産学連携実践教育 (実践教育，<特集> 産学連携論文)，情報処理学会論文誌, 48(2), 832-845, 一般社団法人情報処理学会 (2007)
* 的野恵太，澤田直: IM-8モデル計算機 KERNEL I/O システムの開発 (モデリング・上流設計，学生セッション，アーキテクチャ，情報処理学会創立50周年記念)，全国大会公園論文集 72.1, 一般社団法人情報処理学会 (2010)
* 小島俊輔，白井雄二，湯治準一郎，井上勲，森内勉，磯貝政志，藤本洋一: マイコンシステム開発技術習得のための短期PBL教育，工学教育 55(3), 105-110, 2007-05-20 (2007)
* 重村哲志，古川達也，相知政司，林敏浩: コンソールパネルを持つ機械語教育用マイコンの開発と授業への応用 (教育)，情報処理学会論文誌，48(9), 3318-3327 (2007)

# コンピュータの動作原理を習得する方法の比較

学習者がコンピュータの動作原理を深く正しく理解できる潜在的可能性がある順番は次の通りです。

1. 実機方式
2. 仮想機械シミュレーション方式
3. ロールプレイング・ワークショップ方式
4. 先行オーガナイザ方式

一方，習得の容易さの順番に並べると，下記のように逆の順番になります。

1. 先行オーガナイザ方式
2. ロールプレイング・ワークショップ方式
3. 仮想機械シミュレーション方式
4. 実機方式

したがって，これらの方法を併用することで，段階的にコンピュータの動作原理を習得しやすくなる可能性があります。習得の容易さの順番を守った上で学習するのがポイントです。通常は学習時間等の制約から，これらのうち，いくつかを省略して学習することになります。

学習時間が1時間程度と，仮想機械や実機の操作方法に習熟するための学習時間が確保できない中で，最大限，動作原理を正確に理解しようとしたならば，ロールプレイング・ワークショップ方式が有力となります。

1点，ロールプレイング・ワークショップが，実機方式や仮想機械シミュレーション方式と比べて優位な点があって，それは「自分の頭でCPUの動作を一生懸命考えないと，正しい結果が得られない」という点です。実機方式や仮想機械シミュレーション方式だと，漫然と学習を進めると，ただ実機や仮想機械でプログラムを実行させて結果を見るだけで，動作について何も考察しないという状況になりかねません。

というわけで，短時間で最大の効果を得るためには，ロールプレイング・ワークショップ方式で学習しましょう！

# ロールプレイング・ワークショップ方式の進め方

## 準備

1. 手頃なインストラクション・セット・アーキテクチャ(ISA)のCPUを選びます。お勧めとしては，Z80のようなレトロで単純なCPUや，RISC-V(リスク・ファイブ)のような単純なインストラクション・セットを持つCPUを選びます。逆にとっても大変なのが，x86アーキテクチャです。
2. 1 のインストラクション・セットのマニュアルを用意します。実際のリファレンスマニュアルだと，英文だったり分量が多かったりして，読むのがとても大変なので，学習用の簡便なマニュアルを用意するのが良いでしょう。[RISC-V用の簡便なマニュアルはこちらをご利用ください。](https://qiita.com/zacky1972/items/48bf61bfe3ef2b8ce557)
3. レジスタマップとメモリマップを用意します。レジスタマップは，レジスタの名称と値を記録する表です。メモリマップは，メモリのアドレスとデータを記録する表です。
4. 1 のアセンブリ言語で書かれた簡単なプログラムコードを用意します。最初は簡単な繰返しから始めるといいでしょう。たとえばC言語で表すと次のようなコードです。

```c
int calc(int n) {
	int sum = 0;
	for(int i = 1; i <= n; i++) {
		sum += i;
	}
	return sum;
}
```

RISC-V であれば，riscv-tools をインストールした上で，次のようにコンパイルすると，いい感じのアセンブリコードを得られます。

```bash
$ riscv64-unknown-elf-gcc -S -Og -march=rv32i -mabi=ilp32 sample.c
```

```
	.file	“sample.c”
	.option nopic
	.text
	.align	2
	.globl	calc
	.type	calc, @function
calc:
	li	a5,1
	li	a4,0
.L2:
	bgt	a5,a0,.L4
	add	a4,a4,a5
	addi	a5,a5,1
	j	.L2
.L4:
	mv	a0,a4
	ret
	.size	calc, .-calc
	.ident	"GCC: (GNU) 8.2.0"
```

## 実施

1. 数名でグループを作り，準備したインストラクション・セット・マニュアル，レジスタマップ，メモリマップ，アセンブリコードを各グループに配布します。
2. 教師がレジスタマップとメモリマップの初期値を指示します。
3. 各グループで，インストラクション・セット・マニュアルを読みながら，アセンブリコードを，実行の流れに沿って読み解きます。先ほどのアセンブリコードの例では，`calc:`の次の行からスタートします。インストラクション・セット・マニュアルの指示に従って，途中経過をレジスタマップとメモリマップに記録していきます。
4. `ret`にたどり着き，メモリマップ上のスタックが空になっているのであれば，実行終了です。
5. 結果から，与えられたアセンブリコードがどのような計算をするプログラムだったのかを推測します。

では，実際に教師の指示にしたがって，いろいろなプログラムがどのように動作するのか，グループでワイワイガヤガヤ言いながら習得していきましょう！