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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Koji NAKAMURA
May 27, 2025
Technology
0
110
Rubyで作る論理回路シミュレータ - Shinjuku.rb #99
Koji NAKAMURA
May 27, 2025
Tweet
Share
More Decks by Koji NAKAMURA
See All by Koji NAKAMURA
龍昌餃子で理解するWebサーバーの並行処理モデル - 東葛.dev #9
kozy4324
1
280
Rubyで作る論理回路シミュレータの設計の話 - Kashiwa.rb #12
kozy4324
1
550
Steep導入したいRTA - Kashiwa.rb #11
kozy4324
0
190
これまで細々と作成したGemの紹介をします - Kashiwa.rb #9
kozy4324
0
260
東京Ruby会議12のお手伝いしてきた話
kozy4324
0
120
個人開発発表 LT - Shinjuku.rb #97
kozy4324
0
480
Ruby界隈を中心に2024をふりかえる - Kashiwa.rb #6
kozy4324
0
210
「今までで一番学びになった瞬間」発表 LT - Shinjuku.rb #96
kozy4324
0
400
脆弱性から学ぶシリーズ CVE-2024-34341 - Kashiwa.rb #5 LT
kozy4324
0
340
Other Decks in Technology
See All in Technology
VLAモデル構築のための AIロボット向け模倣学習キット
kmatsuiugo
0
300
It’s “Time” to use Temporal
sajikix
3
230
20260311 技術SWG活動報告(デジタルアイデンティティ人材育成推進WG Ph2 活動報告会)
oidfj
0
380
エンジニアリングマネージャーの仕事
yuheinakasaka
0
120
PMとしての意思決定とAI活用状況について
lycorptech_jp
PRO
0
150
ReactのdangerouslySetInnerHTMLは“dangerously”だから危険 / Security.any #09 卒業したいセキュリティLT
flatt_security
0
360
大規模ECサイトのあるバッチのパフォーマンスを改善するために僕たちのチームがしてきたこと
panda_program
1
290
ガバメントクラウドにおけるAWSの長期継続割引について
takeda_h
2
5.4k
[2] Power BI Deep Dive [2026-03]
ohata_bi
0
100
Google系サービスで文字起こしから勝手にカレンダーを埋めるエージェントを作った話
risatube
0
200
身体を持ったパーソナルAIエージェントの 可能性を探る開発
yokomachi
1
130
OpenClaw を Amazon Lightsail で動かす理由
uechishingo
0
240
Featured
See All Featured
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.4k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
150
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.6k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
3.7k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
80
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
280
Leading Effective Engineering Teams in the AI Era
addyosmani
9
1.7k
SEO for Brand Visibility & Recognition
aleyda
0
4.4k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
130
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
310
Designing for Timeless Needs
cassininazir
0
170
Prompt Engineering for Job Search
mfonobong
0
200
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 !!!