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で作る論理回路シミュレータの設計の話 - Kashiwa.rb #12
Search
Koji NAKAMURA
June 16, 2025
Technology
1
180
Rubyで作る論理回路シミュレータの設計の話 - Kashiwa.rb #12
Koji NAKAMURA
June 16, 2025
Tweet
Share
More Decks by Koji NAKAMURA
See All by Koji NAKAMURA
Rubyで作る論理回路シミュレータ - Shinjuku.rb #99
kozy4324
0
79
Steep導入したいRTA - Kashiwa.rb #11
kozy4324
0
83
これまで細々と作成したGemの紹介をします - Kashiwa.rb #9
kozy4324
0
160
東京Ruby会議12のお手伝いしてきた話
kozy4324
0
86
個人開発発表 LT - Shinjuku.rb #97
kozy4324
0
210
Ruby界隈を中心に2024をふりかえる - Kashiwa.rb #6
kozy4324
0
150
「今までで一番学びになった瞬間」発表 LT - Shinjuku.rb #96
kozy4324
0
320
脆弱性から学ぶシリーズ CVE-2024-34341 - Kashiwa.rb #5 LT
kozy4324
0
250
ActiveRecord SQLインジェクションクイズ (Rails 7.1.3.4)
kozy4324
9
4.6k
Other Decks in Technology
See All in Technology
工具人的一生: 開發很多 AI 工具讓我 慵懶過一生
line_developers_tw
PRO
0
140
本部長の代わりに提案書レビュー! KDDI営業が毎日使うAIエージェント「A-BOSS」開発秘話
minorun365
PRO
14
1.7k
今からでも間に合う! 生成AI「RAG」再入門 / Re-introduction to RAG in Generative AI
hideakiaoyagi
1
160
"SaaS is Dead" は本当か!? 生成AI時代の医療 Vertical SaaS のリアル
kakehashi
PRO
3
190
エンジニア採用から始まる技術広報と組織づくり/202506lt
nishiuma
8
1.6k
開発効率と信頼性を両立する Ubieのプラットフォームエンジニアリング
teru0x1
0
140
Copilot Agentを普段使いしてわかった、バックエンド開発で使えるTips
ykagano
1
690
Amazon Q Developer for GitHubとAmplify Hosting でサクッとデジタル名刺を作ってみた
kmiya84377
0
3.4k
Kotlinで学ぶ 代数的データ型
ysknsid25
5
1.1k
AI技術トレンド勉強会 #1MCPの基礎と実務での応用
nisei_k
1
180
産業機械をElixirで制御する
kikuyuta
0
170
Workflows から Agents へ ~ 生成 AI アプリの成長過程とアプローチ~
belongadmin
3
150
Featured
See All Featured
Documentation Writing (for coders)
carmenintech
71
4.9k
Building Adaptive Systems
keathley
43
2.6k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
Measuring & Analyzing Core Web Vitals
bluesmoon
7
480
Faster Mobile Websites
deanohume
307
31k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.8k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.3k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
14
1.5k
The Invisible Side of Design
smashingmag
299
51k
Embracing the Ebb and Flow
colly
86
4.7k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.8k
Transcript
Rubyで作る論理回路シミュレータ CPUを理解したくてDSLを創った話 の設計の話 2025.6.19 Kashiwa.rb #12 Koji NAKAMURA (@kozy4324)
Koji NAKAMURA • 𝕏: @kozy4324 • GitHub:@kozy4324 • Classi株式会社所属 •
Kashiwa.rb主催 自己紹介
デモ
None
作ったもの: logicuit • logi(c cir)cuit -> logicuit • 電気回路シミュレータ •
書籍「CPUの創りかた」を理解したくて作った • https://www.amazon.co.jp/dp/4839909865/
この発表でお話しすること • 「論理回路のモデリング」と「内部DSLの設計」をどういった道 筋でやったのかという話 • 作ったものは小さいのだけれどそれなりに試行錯誤したという 話
この発表の楽しみ方 • 「自分ならこうモデリングするだろう」「こう設計するだろう」とい うのを考えながら聞いてもらえるといいかもしれない ◦ モデリングや設計は唯一解があるものでもないと考えてい ます(要件や制約にもよるものではあるけど) ◦ 「自分ならこうする」というフィードバックがもらえるとむしろ 嬉しい
作り始め初期フェーズ
前提状態 • 書籍を1周ちょうど読み終えてRubyでコード書いてみるかと思 い立ったタイミング • 対象(コードで表現しようとしているもの)のイメージがぼんやり とあるだけ
最初に設計指針は決めた • 最優先事項は CPUの仕組みを理解すること ◦ 自分の認知に寄り添う形で論理回路を論理回路らしく設計 すること とも表現できる • 逆に優先しないこと
◦ CPUや論理回路の理解に寄与しない設計の追求 ◦ 処理速度や効率的な処理実行の最適化
まず 論理回路らしいとは? の解像度を上げる A B Y AND A Y NOT
and more…
ゴールはこれ
基本論理ゲートの一つを眺めてみる A B Y AND A B Y AND Bをon
Bをoff • どこに電流が流れているかを 状態 として表現する? • 出力Yは入力A,Bの射影とも言えそう → 関数型の機運?
電流は「流れる」もの • 左の入力Bをonにすると右の出力Yに伝播されてほしい • コレってストリーム?リアクティブプログラミング?? A B AND Y AND
こーゆーのもある: Dフリップフロップとクロック • 入力 D の値をクロック立ち上がり時に Q 出 力に保持する •
1ビットの状態を記憶可能 • つまり CPU の「レジスタ」になるやつ • \(状態)/ CK
さて、どうしよう? (ここでシンキングタイム)
私の選択「まずは素朴でええやろ」 • 悩んだら素朴な方法を選択する • 困るまで素朴な方法で頑張る
素朴なモデリング(1) • Ruby なので OOP を選択 • Signal クラス ◦
電流が流れる単位の信号 ◦ #current: true | false ◦ #on / #off • Gates::And クラス ◦ has many Signal(s) A B Y AND
素朴なモデリング(1) • 入力A/Bの状態(#current)が変化 するたびに出力Yを評価する (#evaluate) A B Y AND #evaluate
擬似コード(1)
素朴なモデリング(2) • AND(1)の出力YとAND(2)の入力Bは接続している • Yの@downstreamにBが入っている • Yの値が変わったらBに値を伝播するだけ A B AND(1)
Y AND(2) A Y B
擬似コード(2)
擬似コード(2)
素朴なモデリング(3) • フリップフロップはクロック立ち上がり時に入 力Dで出力Qを評価する • Clock クラス ◦ #connects_to(component) ◦
#tick ▪ #connects_toで接続したもの全てを 再評価する CK
擬似コード(3)
擬似コード(3)
擬似コード(3)
クロックはシングルトンにした • 同じタイミングで信号が送られる ◦ =同じタイミングで処理したい • 1回路に1クロックあれば良さそう ◦ 少なくとも書籍が説明する範囲の 回路においては
CK D Q CK D Q
ここまでで作ったクラス群 Signal #connects_to(other) #on #off Clock #connects_to(comp) #tick And Or
Not and more…
DSL設計フェーズ
ANDゲートの実装
ORゲートとの実装差分
部品と部品を繋げて組み合わせる実装
部品と部品を繋げて組み合わせる実装
DSLを創るモチベーション • 各部品をもっとシンプルに宣言的に定義したい • 部品と部品を組み合わせてより複雑な部品を作り上げること を実現したい ◦ その際のコード記述による認知負荷は極力下げたい • 直感的に理解できるコード記述であって欲しい
◦ 少なくとも自分にとっては
さて、どうしよう? (2回目のシンキングタイム)
部品を定義するDSL: ANDゲート
部品を定義するDSL: ORゲート
部品を定義するDSL: Dフリップフロップ
部品を定義するDSL: Dフリップフロップ inputsに clock: :ck を含めるとSequential な 部品となり、クロック信号を受け取るごとに outputsを評価するようになる
部品を組み立てるDSL: 半加算器
部品を組み立てるDSL: 半加算器 connects_to の alias で >> メソッドを導入 この部品とこの部品を繋げているよ〜を記号的に表現している
これを組み立てる
CPU実装の一部分: 読み解くには少しツラい...
1Signal=1bit、4bit でまとめて部品を繋げたい イミディエイトデータ 0000 入力ポート 出力ポート データセレクタ Aレジスタ Bレジスタ 出力ポート
プログラムカウンタ SELECT A SELECT B A B C3 C2 C1 C0 ALU LD0 LD1 LD2 LD3 書籍にある図を引用 概念的にも4bitでまとめて扱いたい
最終形: 多対多の接続を可能にした
None
まとめ
まとめ(1) • モデリングと実装において困るまでは素朴な方法で進もうとい う選択をしたが、大きな困りごとに遭遇することなくゴールまで 作り切ることができた ◦ 実は途中でシグナルの伝播で頭を悩ませる問題もあった が、うまい解決策を見つけられて事なきを得ている • 素朴なモデリング・素朴な実装でも割とうまくいくものですよ
ねっていうのが今回伝えたかった事の一つ
まとめ(2) • (自分の中では)なかなか論理回路を論理回路らしく表現する 実装が実現できたと思っている • Rubyで内部DSLを設計・実装して何かしらの問題領域に取り 組むのって楽しいですね! ◦ Ruby力が試されている気がする ◦
これがもう一つの伝えたかったこと
リポジトリ URL https://github.com/kozy4324/logicuit
EOF