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
Rubyで作る論理回路シミュレータ - Shinjuku.rb #99
Search
Koji NAKAMURA
May 27, 2025
Technology
0
83
Rubyで作る論理回路シミュレータ - Shinjuku.rb #99
Koji NAKAMURA
May 27, 2025
Tweet
Share
More Decks by Koji NAKAMURA
See All by Koji NAKAMURA
Rubyで作る論理回路シミュレータの設計の話 - Kashiwa.rb #12
kozy4324
1
370
Steep導入したいRTA - Kashiwa.rb #11
kozy4324
0
120
これまで細々と作成したGemの紹介をします - Kashiwa.rb #9
kozy4324
0
180
東京Ruby会議12のお手伝いしてきた話
kozy4324
0
89
個人開発発表 LT - Shinjuku.rb #97
kozy4324
0
220
Ruby界隈を中心に2024をふりかえる - Kashiwa.rb #6
kozy4324
0
160
「今までで一番学びになった瞬間」発表 LT - Shinjuku.rb #96
kozy4324
0
340
脆弱性から学ぶシリーズ CVE-2024-34341 - Kashiwa.rb #5 LT
kozy4324
0
260
ActiveRecord SQLインジェクションクイズ (Rails 7.1.3.4)
kozy4324
9
4.6k
Other Decks in Technology
See All in Technology
【あのMCPって、どんな処理してるの?】 AWS CDKでの開発で便利なAWS MCP Servers特集
yoshimi0227
6
790
Four Keysから始める信頼性の改善 - SRE NEXT 2025
ozakikota
0
230
安定した基盤システムのためのライブラリ選定
kakehashi
PRO
3
100
OpenTelemetryセマンティック規約の恩恵とMackerel APMにおける活用例 / SRE NEXT 2025
mackerelio
3
1.7k
United™️ Airlines®️ Customer®️ USA Contact Numbers: Complete 2025 Support Guide
flyunitedguide
0
790
How to Quickly Call American Airlines®️ U.S. Customer Care : Full Guide
flyaahelpguide
0
240
Contributing to Rails? Start with the Gems You Already Use
yahonda
2
120
freeeのアクセシビリティの現在地 / freee's Current Position on Accessibility
ymrl
2
280
ゼロからはじめる採用広報
yutadayo
4
1k
TLSから見るSREの未来
atpons
2
260
20250708オープンエンドな探索と知識発見
sakana_ai
PRO
4
910
CDK Vibe Coding Fes
tomoki10
1
590
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
53
7.7k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
48
2.9k
What's in a price? How to price your products and services
michaelherold
246
12k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.5k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
22k
Become a Pro
speakerdeck
PRO
29
5.4k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.9k
Fireside Chat
paigeccino
37
3.5k
Gamification - CAS2011
davidbonilla
81
5.4k
Code Review Best Practice
trishagee
69
19k
Done Done
chrislema
184
16k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
Transcript
Rubyで作る論理回路シミュレータ CPUを理解したくて内部DSLを創った話 2025.5.28 Shinjuku.rb #99 KaigiEffect成果発表LT! Koji NAKAMURA (@kozy4324)
RubyKaigi 2025 行けてません! (お詫び)
None
None
None
None
東京Ruby会議12 から Effect してる枠として 本日は発表します!!
Koji NAKAMURA • 𝕏: @kozy4324 • GitHub:@kozy4324 • Classi株式会社所属 •
Kashiwa.rb主催 自己紹介
成果物デモ
None
KaigiEffect により作ったもの: logicuit • logi(c cir)cuit -> logicuit • 電気回路シミュレータ
• 書籍「CPUの創りかた」を理解したくて作った • https://www.amazon.co.jp/dp/4839909865/
どういうモチベーションで作った? • 「CPUという、プログラミングと現実世界をつなぐ装置の仕組 みを理解したい」というモチベーションがあった • 論理回路から作った演算装置と記憶を担当するフリップ・フ ロップを組み合わせて、クロック信号のたびに転送命令を繰り 返すことで CPU が実現できるらしい
どういうモチベーションで作った? • 「CPUという、プログラミングと現実世界をつなぐ装置の仕組 みを理解したい」というモチベーションがあった • 論理回路から作った演算装置と記憶を担当するフリップ・フ ロップを組み合わせて、クロック信号のたびに転送命令を繰り 返すことで CPU が実現できるらしい
CPUは転送命令
ホンマか?🤔
Rubyでやってみよう💡
その前にまず論理回路とは? A B Y AND A Y NOT and more…
演算装置: 半加算器
演算装置: データセレクタ
Dフリップフロップとクロック • 入力 D の値をクロック立ち上がり時に Q 出 力に保持する • 1ビットの状態を記憶可能
• つまり CPU の「レジスタ」になる CK
1-bit CPU CK D Q • A レジスタの内容を反転して A レジスタに転送
• NOT A を繰り返すだけ • ↑ アセンブリ言語
転送命令と アセンブリ言語
MOV A, Im : A レジスタに Im を転送 イミディエイトデータ 0000
入力ポート 出力ポート データセレクタ Aレジスタ Bレジスタ 出力ポート プログラムカウンタ SELECT A SELECT B A B C3 C2 C1 C0 ALU LD0 LD1 LD2 LD3
MOV A, B : A レジスタに B レジスタを転送 イミディエイトデータ 0000
入力ポート 出力ポート データセレクタ Aレジスタ Bレジスタ 出力ポート プログラムカウンタ SELECT A SELECT B A B C3 C2 C1 C0 ALU LD0 LD1 LD2 LD3
ADD B, Im : B レジスタに Im を加算 イミディエイトデータ 0000
入力ポート 出力ポート データセレクタ Aレジスタ Bレジスタ 出力ポート プログラムカウンタ SELECT A SELECT B A B C3 C2 C1 C0 ALU LD0 LD1 LD2 LD3
IN A : 入力ポートから A レジスタへ転送 イミディエイトデータ 0000 入力ポート 出力ポート
データセレクタ Aレジスタ Bレジスタ 出力ポート プログラムカウンタ SELECT A SELECT B A B C3 C2 C1 C0 ALU LD0 LD1 LD2 LD3
OUT Im : 出力ポートへ Im を転送 イミディエイトデータ 0000 入力ポート 出力ポート
データセレクタ Aレジスタ Bレジスタ 出力ポート プログラムカウンタ SELECT A SELECT B A B C3 C2 C1 C0 ALU LD0 LD1 LD2 LD3
JMP Im : Im 番地へジャンプ イミディエイトデータ 0000 入力ポート 出力ポート データセレクタ
Aレジスタ Bレジスタ 出力ポート プログラムカウンタ SELECT A SELECT B A B C3 C2 C1 C0 ALU LD0 LD1 LD2 LD3
JNC Im : C フラグが1ではないときにジャンプ イミディエイトデータ 0000 入力ポート 出力ポート データセレクタ
Aレジスタ Bレジスタ 出力ポート プログラムカウンタ SELECT A SELECT B A B C3 C2 C1 C0 ALU LD0 LD1 LD2 LD3 ※CフラグはALUで桁上がりが発生したら 1 がセットされる
転送命令 = アセンブリ言語 • 少なくとも書籍で説明される範囲内ではそう解釈できる • 条件付きジャンプ命令 (JNC: Junp If
Not Carry) があるので 分岐と繰り返しができる!
CPU完全に理解した
サンプルプログラム: ラーメンタイマー
Rubyで書いていく✏
内部DSLの機運 • いい感じに部品を宣言的に定義したい • 部品を繋ぎ合わせてより複雑な部品を作りたい
内部DSL作りました!
内部DSLで論理回路
内部DSLでデータセレクタ
内部DSLで半加算器
内部DSLでDフリップフロップ
内部DSLで 1-bit CPU
こう!
こう!こう!
こう!こう!こう!
None
まとめ • 本当に CPU が動きました! • CPUと内部DSLに興味がわいたら logicuit を試してね •
内部 DSL を設計して実装するの勉強になる&楽しい • 何かを理解したくて Ruby でイチから実装はオススメ • Let’s KaigiEffect !!!