Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
赤間仁志さんのプラレールによる半加算器
Search
Hidemi KAWAI
November 02, 2016
0
700
赤間仁志さんのプラレールによる半加算器
Hidemi KAWAI
November 02, 2016
Tweet
Share
More Decks by Hidemi KAWAI
See All by Hidemi KAWAI
C言語でメモリ管理を考えた話
hkawai
0
580
超軽量型プログラミング言語 ES-BASIC
hkawai
0
1.5k
OSASK計画が考える新しいプログラミング言語の構想
hkawai
1
1.2k
OSECPU-VMの資料
hkawai
0
590
20130806a
hkawai
0
300
20120823a
hkawai
0
870
20120326a
hkawai
1
990
Featured
See All Featured
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
Done Done
chrislema
181
16k
Product Roadmaps are Hard
iamctodd
PRO
49
11k
The Cult of Friendly URLs
andyhume
78
6.1k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
127
18k
A Tale of Four Properties
chriscoyier
157
23k
Keith and Marios Guide to Fast Websites
keithpitt
410
22k
Git: the NoSQL Database
bkeepers
PRO
427
64k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
2
290
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.5k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8.3k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
Transcript
赤間仁志さんの プラレールによる半加算器 サイボウズ・ラボ株式会社 川合秀実
おことわり • このスライド資料は主に川合が社内での説明の ために作ったもので、完成度がほどほどになって おります。すみません。 – 時間をかけていいものを作るよりも、早く概要をお知ら せすることを優先したためです。 • 資料内に出てくるプラレールの写真は、ver.1.0の
もので、最新のver.1.1とは一部違っております。 • どうしても写真では分かりにくい部分があります。 それは是非実物で確認してください。 – [サイボウズ以外の方へ] 社外で展示することもありま すので、検索などで調べてみてください!
赤間仁志さんについて • 2015年度 サイボウズ・ラボユース生 – プログラミング言語を開発 – 川合が指導担当 • なぜプラレールをサイボウズ社内で?
– ラボユース生の卒業プレゼントで、「広い社内で のびのびとプラレールする権利+レール購入費」 をプレゼントしたからです!
半加算器とは? • 2進数における足し算(2つの入力) 0 + 0 = 00 0 +
1 = 01 1 + 0 = 01 1 + 1 = 10 ↑ こういう計算ができる仕組みが 「半加算器」と呼ばれる 入力A 入力B → 出力C 出力S 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0 ちなみに、3つの1ビットの入力から計算して、2ビットの和を算出する仕組みは 「全加算器」と呼ばれる
プラレールとは? • タカラトミー製のおもちゃ • よくできている • 価格も手ごろ • とてもたのしい
0や1の表現方法 • どうやって0や1をプラレールで表現するか? – ターンアウトレール(ポイントレール)を使います 直進設定 → 0 を表す 曲がり設定
→ 1を表す
その他の主要なレール部品(1) • 直線レール、曲線レール、坂レール
その他の主要なレール部品(2) • 自動ターンアウトレール – 電池がなくても自動で交互に切り替わる優れモノ – 今回利用したレール部品としては、もっとも高価 – 2つのモードがある •
自動: 電車が通るたびに切り替わる(曲→直→曲→直・・・) • 固定: あらかじめ設定した分岐方向をずっと維持する
その他の主要なレール部品(3) • 改造ターンアウトレール – これは標準のレールとは違うものに見えるかもし れませんが、自動ターンアウトレールで固定モー ドにすれば同じ機能が得られます。今回はコスト 削減のために改造レールを利用しています。 左から入った場合は 必ず直進する
右や右上から入る場合 は問題なく左へ抜ける
0や1を読み取る方法 • ターンアウトレールの上を電車が通って、進 行方向が変わることで、電車の挙動を変える 左から電車が入ると、0か1かによって どちらに進むかが変わる
0や1を書き込む方法 • 先ほどとは逆の方向からターンアウトレール に進入すると、ターンアウトレールの状態を 変えることができる 右から電車が入ると、0に設定される 右上から電車が入ると、1に設定される
今回の半加算器の仕様 • (1) AとBに、0か1をセット(人間が手でやる) • (2) スタート地点から電車を走らせる • (3) 電車があれこれと走る
• (4) やがて電車はスタート地点に戻ってくる • (5) SやCが正しく計算されている! 入力A 入力B → 出力C 出力S 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0
半加算器の全景(ver.1.0)
半加算器の説明 下: A 上: B 下: C 上:S 下: スタート位置
自動ターン アウトレール 3階建て-1 自動ターン アウトレール 3階建て-2 2階: X Y 2階: Z ここはお金が かかっていて かっこいい 自動ターンアウ トレールが6個も 並んでいる! XYZについて は後述
右上を拡大(ちなみに演算後) • 重要な部分が 集まっている場所 です 入力A(1階) 入力B(2階) 入A 入B →
出C 出S 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0 出力C(1階) 出力S(2階) スタート位置 (1階)
記号の説明 • ターンアウトレールA, B, C, S – 入力・出力用のレール • ターンアウトレールX,
Y, Z – 説明の便宜のための特別に名前を付けたレール
A = 0 の場合(1) • (1) まず、電車 は図の経路を 通り、X=0にした あと、Aの場所
に戻ってきます A(1階) X 自動ターンアウト レール-1 (2階) 電車の進行方向 スタート位置 ここから出発
A = 0 の場合(2) • (2) 次に、電車 は図の経路を 通り、Y=0にした あと、Aの場所に
戻ってきます A Y 自動-1(2階) 自動-2(2階) ここから出発
A = 0 の場合(2) 補足 • なぜ(1)とは違う経路に行ったのですか? – 自動ターンアウトレールの向きが変わったからです
A = 0 の場合(3) • (3) 次に、電車は 図の経路を通り、 再びX=0にした あと、Aの場所に
戻ってきます A X 自動-1(2階) ここから出発
A = 0 の場合(3) 補足 • なぜ X=0 を二度やるのですか? –
本当は二度やる必要はないです – 自動ターンアウトレールが交互に切り替わるので、 やむを得ないのです
A = 0 の場合(4) • (4) 次に、電車は 図の経路を通り、 Z=0にしたあと、 Bの場所へ行きま
す(後半へ続く) A(1階) Z 自動-1(2階) 自動-2(2階) 2階 2階 3階 3階 2階 ここから出発 B(2階) 複雑なので実物を指で 追う方が分かりやすいです
A = 1 の場合 • A=0の場合と同様に、X, Y, Zをそれぞれ1にして いきます –
自動ターンアウトレールの1階を使うところが違い ます(A=0の場合は2階を使っていました) – A=0の場合と同様に、X=1は二度実行してしまいま す – 図を作るのが面倒なので、図は省略します(すみ ません!)
ここまでのまとめ • A=0 の場合は、2階の2つの自動ターンアウト レールを通って、X=Y=Z=0になる • A=1 の場合は、1階の2つの自動ターンアウト レールを通って、X=Y=Z=1になる •
つまり、X, Y, ZにはAの値がコピーされる • そして電車はBへ向かう
B = 0 で A = 0 の場合 • (1)電車は図の
経路を通り、Xの 値に応じて分岐 します ゆえにS=0になる そしてBの位置に 戻ります B(2階) S(2階) X 自動-1(3階) ここから出発 これも複雑
B = 0 で A = 1 の場合 • (1')電車は図の
経路を通り、Xの 値に応じて分岐 します ゆえにS=1になり そしてBの位置に 戻ってきます B(2階) S(2階) X 自動-1(3階) ここから出発 これも複雑
B = 0 の場合 • (2)電車は図の 経路を通り、C=0 になります そしてスタート 位置に戻ってき
ます[終了] B(2階) C(1階) 自動-1(3階) ここから出発
ここまでのまとめ • B=0の場合、Bの位置から出発して、2周します – 1周目はXを参照してSを計算 – 2周目は無条件にC=0にしに行く – Cに値を設定し終わると、 スタート位置へ帰って
終了 • つまりB=0の場合は、Xしか見てません – YやZにもAの値をコピーしましたが使っていません • 自動-1(3階)だけを使います 入A 入B → 出C 出S 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0
B = 1 の場合 • B = 1 の場合も同様に計算していきます –
図は省略 – 1周目でSを計算(Yを参照) – 2周目でCを計算(Zを参照) – Cに値を設定し終わると、スタート位置へ帰って終了 • B=1の場合はXを参照しません – XにもAの値をコピーしましたが使っていません • 自動-2(3階)だけを使います 入A 入B → 出C 出S 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0
考察(1) • ターンアウトレールの状態が0や1を表現します • 電車が通過する・しないは数を表現しません – 電車は「今はここの計算をしています」という「プロ グラム・カウンタ」を意味しています
考察(2) • SやCの計算に当たっては、全く別の4つの経路 が用意されています – (1) B=0の時のS計算用の経路 – (2) B=0の時のC計算用の経路(C=0に固定)
– (3) B=1の時のS計算用の経路 – (4) B=1の時のC計算用の経路 • B入力のターンアウトレールによって(1)&(2)か、 (3)&(4)に行くかを最初に振り分けています • その後、3階の自動ターンアウトレールによって 1周目に(1)か(3)、2周目に(2)か(4)に行きます
考察(3) • A入力を読み取るループでは、X,Y,Zに値を コピー するだけで、SやCの計算はしていません • コピーのための6つの経路があります – (1) X=0にするための経路
– (2) Y=0にするための経路 – (3) Z=0にするための経路(&終わったらB入力へ) – (4) X=1にするための経路 – (5) Y=1にするための経路 – (6) Z=1にするための経路(&終わったらB入力へ)
考察(4) • 自動ターンアウトレールを使ったループ構造 自動 自動 スタート位置 1回目と3回目 2回目 4回目 ①
② ③ 自動ターンアウトレールは、あらかじめすべて直進状態で初期化しておく 自動ターンアウトレールは、「切り替わってから分岐する」ので、最初は曲がる 上図だと、①→②→①→③の順に電車が走る ③を抜けた時点で、自動ターンアウトレールはすべて直進状態に戻っている (Xの設定) (Yの設定) (Zの設定)
考察(5) • 合計すると4+6=10もの経路があり、しかもそ れらをうまく接続するために引き回しています • だから「たかが半加算器」なのに、こんなに複 雑で大規模なのです
考察(6) • X, Y, Zの原理(混線をさける仕組み) Xなど 改造レール 改造レール 改造レール ①から入るとXに0を書き込んで③へ抜けます
②から入るとXに1を書き込んで③へ抜けます ④から入るとXの値によって⑤か⑥へ分岐します (混線=読むときと書くときとで、経路が混ざってしまうこと)
考察(7) • 演算が終了するとスタート地点に戻ってくる • A, B, C, Sのすべてがスタート地点のそばにあ り、操作・確認しやすい •
これらは赤間さんが意識して工夫したそうで す。さすがです。職人芸です。
None
補足 • 考察(6)で「混線」を避ける必要があるのはな ぜか? – たとえば、Aの値がXにコピーされる – Sの値を計算するために、Xの値を逆走することで 参照するとき、もし混線をさける仕組みがなけれ ば、結局電車は単にA地点に戻る
• Xの値が0か1であるかに関わりなく – 何もしないまま同じ場所に戻ってしまっては、Xの 値によって結果を変えることができない – それではSの計算なんてできない