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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Koji NAKAMURA
June 16, 2025
Technology
610
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Rubyで作る論理回路シミュレータの設計の話 - Kashiwa.rb #12
Koji NAKAMURA
June 16, 2025
More Decks by Koji NAKAMURA
See All by Koji NAKAMURA
Lightning近況報告
kozy4324
0
270
龍昌餃子で理解するWebサーバーの並行処理モデル - 東葛.dev #9
kozy4324
1
320
Rubyで作る論理回路シミュレータ - Shinjuku.rb #99
kozy4324
0
120
Steep導入したいRTA - Kashiwa.rb #11
kozy4324
0
230
これまで細々と作成したGemの紹介をします - Kashiwa.rb #9
kozy4324
0
310
東京Ruby会議12のお手伝いしてきた話
kozy4324
0
140
個人開発発表 LT - Shinjuku.rb #97
kozy4324
0
620
Ruby界隈を中心に2024をふりかえる - Kashiwa.rb #6
kozy4324
0
250
「今までで一番学びになった瞬間」発表 LT - Shinjuku.rb #96
kozy4324
0
450
Other Decks in Technology
See All in Technology
AWS ネットワーク構築でハマった(ハマりかけた) 5選とそこから得た教訓
nagisa53
3
120
オートロックマンションなのに、各部屋は施錠なし!? 攻撃者が組織内ネットワークで大暴れする理由 / The Front Door Is Locked, but the Rooms Are Wide Open: Why Attackers Move Freely Inside Enterprise Networks
nttcom
0
1.3k
20260722_品質と開発生産性の相互作用
magicpod
0
110
運用を犠牲にせずコストを制御し事業成長を支える B2B SaaS ID管理基盤におけるS3 Tableのログストレージ活用
kaminashi
1
140
Claude Mythos、Fable...フロンティアAIの最新動向と企業のセキュリティ対策
flatt_security
0
190
現場で使える AWS DevOps Agent 活用ノウハウ - Release Management 機能の検証結果を添えて / AWS DevOps Agent Release Management and Know-How
kinunori
5
880
Redmine 7.0 新機能・機能強化解説(OSC2026京都ダイジェスト版)
vividtone
1
140
認知負荷をGemini で溶かす — GKE 基盤「Orbit」における AI エージェントの実践
sansantech
PRO
1
160
初めてのGitHub Actions / GitHub Actions at First
tooppoo
0
120
実践が先生だった— 新卒サーバーエンジニア1年目のリアル
mixi_engineers
PRO
0
230
13年運用タイトルのサーバーサイドが辿り着いた現在地 ― モンスターストライクにおける技術・組織・AI活用から得た知見
mixi_engineers
PRO
1
400
それでも、技術なブログを書く理由 #kichijojipm / Why I Still Write Tech Blogs Even Now
shinkufencer
0
1.6k
Featured
See All Featured
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.4k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.3k
WCS-LA-2024
lcolladotor
0
780
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
480
HDC tutorial
michielstock
2
770
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
Tell your own story through comics
letsgokoyo
1
1k
Faster Mobile Websites
deanohume
310
32k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.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