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
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Koji NAKAMURA
May 27, 2025
Technology
120
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Rubyで作る論理回路シミュレータ - Shinjuku.rb #99
Koji NAKAMURA
May 27, 2025
More Decks by Koji NAKAMURA
See All by Koji NAKAMURA
Lightning近況報告
kozy4324
0
43
龍昌餃子で理解するWebサーバーの並行処理モデル - 東葛.dev #9
kozy4324
1
300
Rubyで作る論理回路シミュレータの設計の話 - Kashiwa.rb #12
kozy4324
1
590
Steep導入したいRTA - Kashiwa.rb #11
kozy4324
0
210
これまで細々と作成したGemの紹介をします - Kashiwa.rb #9
kozy4324
0
290
東京Ruby会議12のお手伝いしてきた話
kozy4324
0
130
個人開発発表 LT - Shinjuku.rb #97
kozy4324
0
530
Ruby界隈を中心に2024をふりかえる - Kashiwa.rb #6
kozy4324
0
240
「今までで一番学びになった瞬間」発表 LT - Shinjuku.rb #96
kozy4324
0
430
Other Decks in Technology
See All in Technology
白金鉱業Meetup_Vol.24_「AIエージェントは分けるほど良い」は本当か? / Is it true that “the more you divide AI agents, the better”?
brainpadpr
1
400
AAIFに入ってみた ~内から見えるコミュニティ動向~
sato4
0
240
マルチアカウント環境での コーディングエージェントを使った障害調査が大変なので AIエージェントにReadOnly権限を付与してみた / ReadOnly AI Agents for Multi-Account AWS Incident Response
yamaguchitk333
2
110
20260619 私の日常業務での生成 AI 活用
masaruogura
1
220
【2026年版】 ベクトル検索䛸 Embedding最前線
mocobeta
2
220
気づかぬうちにセキュリティ負債を生むAPIキー運用
sgwrmctk
0
160
エラーバジェットのアラートのタイミングを考える.pdf
kairim0
0
150
2026年6月23日 Syncable Tech + Start Python Club にて
hamukazu
0
120
中期計画、2回作ってみた ~業務委託と正社員、両方の視点から~
demaecan
1
900
AI駆動開発を通して感じた、 AI時代のデザイナーの役割変化
whisaiyo
3
2.2k
自律型AIエージェントは何を破壊するのか
kojira
0
160
いまさら聞けない「仕様駆動開発入門」 〜AI活用時代の開発プロセスを考える〜
findy_eventslides
2
140
Featured
See All Featured
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
530
Game over? The fight for quality and originality in the time of robots
wayneb77
1
200
Mobile First: as difficult as doing things right
swwweet
225
10k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
310
How to build a perfect <img>
jonoalderson
1
5.7k
The Limits of Empathy - UXLibs8
cassininazir
1
360
YesSQL, Process and Tooling at Scale
rocio
174
15k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
Heart Work Chapter 1 - Part 1
lfama
PRO
7
36k
Accessibility Awareness
sabderemane
1
140
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 !!!