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
120
0
Share
Rubyで作る論理回路シミュレータ - Shinjuku.rb #99
Koji NAKAMURA
May 27, 2025
More Decks by Koji NAKAMURA
See All by Koji NAKAMURA
龍昌餃子で理解するWebサーバーの並行処理モデル - 東葛.dev #9
kozy4324
1
290
Rubyで作る論理回路シミュレータの設計の話 - Kashiwa.rb #12
kozy4324
1
580
Steep導入したいRTA - Kashiwa.rb #11
kozy4324
0
200
これまで細々と作成したGemの紹介をします - Kashiwa.rb #9
kozy4324
0
280
東京Ruby会議12のお手伝いしてきた話
kozy4324
0
130
個人開発発表 LT - Shinjuku.rb #97
kozy4324
0
520
Ruby界隈を中心に2024をふりかえる - Kashiwa.rb #6
kozy4324
0
220
「今までで一番学びになった瞬間」発表 LT - Shinjuku.rb #96
kozy4324
0
420
脆弱性から学ぶシリーズ CVE-2024-34341 - Kashiwa.rb #5 LT
kozy4324
0
350
Other Decks in Technology
See All in Technology
10サービス以上のメール到達率改善を地道に継続的に進めている話 / Continue to improve email delivery rates across multiple services
yamaguchitk333
6
2.3k
続 運用改善、不都合な真実 〜 物理制約のない運用改善はほとんど無価値 / 20260518-ssmjp-kaizen-no-value-without-physical-constraints
opelab
2
290
Gaussian Splattingの実用化 - 映像制作への展開
gpuunite_official
0
210
いつの間にかデータエンジニア以外の業務も増えていたけど、意外と経験が役に立ってる
zozotech
PRO
0
730
AI Agent に“攻略本”を渡したら、150フォームの移行が回り始めた話/登壇資料(高橋 悟生)
hacobu
PRO
1
240
ECSのTerraformモジュールにコントリビュートした話
harukasakihara
0
260
O'Reilly Infrastructure & Ops Superstream: Platform Engineering for Developers, Architects & the Rest of Us
syntasso
0
320
AI全盛の今だからこそ、あえてもう一度振り返るAPIの基礎
smt7174
3
140
LookerとADKで作る社内AIエージェント
chanyou0311
0
280
論文紹介:Pixal3D (SIGGRAPH 2026)
tenten0727
0
640
ルール・ロール・ツールを創る / Creating Rules, Roles and Tools
ks91
PRO
0
140
エムスリーテクノロジーズ株式会社 エンジニア向け紹介資料 / M3 Technologies Company Deck
m3_engineering
0
200
Featured
See All Featured
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
700
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
A Tale of Four Properties
chriscoyier
163
24k
Side Projects
sachag
455
43k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
200
Code Reviewing Like a Champion
maltzj
528
40k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.6k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
350
Designing for Timeless Needs
cassininazir
1
220
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
290
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 !!!