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
380
Steep導入したいRTA - Kashiwa.rb #11
kozy4324
0
130
これまで細々と作成したGemの紹介をします - Kashiwa.rb #9
kozy4324
0
190
東京Ruby会議12のお手伝いしてきた話
kozy4324
0
90
個人開発発表 LT - Shinjuku.rb #97
kozy4324
0
230
Ruby界隈を中心に2024をふりかえる - Kashiwa.rb #6
kozy4324
0
160
「今までで一番学びになった瞬間」発表 LT - Shinjuku.rb #96
kozy4324
0
340
脆弱性から学ぶシリーズ CVE-2024-34341 - Kashiwa.rb #5 LT
kozy4324
0
270
ActiveRecord SQLインジェクションクイズ (Rails 7.1.3.4)
kozy4324
9
4.7k
Other Decks in Technology
See All in Technology
サービスを止めるな! DDoS攻撃へのスマートな備えと最前線の事例
coconala_engineer
1
210
Step Functions First - サーバーレスアーキテクチャの新しいパラダイム
taikis
1
220
今日からあなたもGeminiを好きになる
subaruhello
0
300
本当にわかりやすいAIエージェント入門
segavvy
9
4.8k
Microsoft Fabric ガバナンス設計の一歩目を考える
ryomaru0825
1
160
AIでテストプロセス自動化に挑戦する
sakatakazunori
1
630
ClaudeCodeにキレない技術
gtnao
1
940
機械学習を「社会実装」するということ 2025年夏版 / Social Implementation of Machine Learning July 2025 Version
moepy_stats
1
210
How do i Get in Touch With QuickBooks Payroll Support®️ USA Contact Numbers: Complete 2025 Support Guide
connectquickbooks
0
100
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
820
M365アカウント侵害時の初動対応
lhazy
4
3.1k
Deep Security Conference 2025:生成AI時代のセキュリティ監視 /dsc2025-genai-secmon
mizutani
5
3.7k
Featured
See All Featured
Building an army of robots
kneath
306
45k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
It's Worth the Effort
3n
185
28k
Faster Mobile Websites
deanohume
308
31k
Raft: Consensus for Rubyists
vanstee
140
7k
A designer walks into a library…
pauljervisheath
207
24k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
750
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
2.9k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.6k
The Cult of Friendly URLs
andyhume
79
6.5k
Agile that works and the tools we love
rasmusluckow
329
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 !!!