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
470
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
91
Steep導入したいRTA - Kashiwa.rb #11
kozy4324
0
140
これまで細々と作成したGemの紹介をします - Kashiwa.rb #9
kozy4324
0
220
東京Ruby会議12のお手伝いしてきた話
kozy4324
0
100
個人開発発表 LT - Shinjuku.rb #97
kozy4324
0
300
Ruby界隈を中心に2024をふりかえる - Kashiwa.rb #6
kozy4324
0
180
「今までで一番学びになった瞬間」発表 LT - Shinjuku.rb #96
kozy4324
0
360
脆弱性から学ぶシリーズ CVE-2024-34341 - Kashiwa.rb #5 LT
kozy4324
0
290
ActiveRecord SQLインジェクションクイズ (Rails 7.1.3.4)
kozy4324
9
5k
Other Decks in Technology
See All in Technology
pprof vs runtime/trace (FlightRecorder)
task4233
0
150
Windows で省エネ
murachiakira
0
150
stupid jj tricks
indirect
0
7.8k
DataOpsNight#8_Terragruntを用いたスケーラブルなSnowflakeインフラ管理
roki18d
1
320
AI時代だからこそ考える、僕らが本当につくりたいスクラムチーム / A Scrum Team we really want to create in this AI era
takaking22
6
2.8k
「技術負債にならない・間違えない」 権限管理の設計と実装
naro143
35
10k
extension 現場で使えるXcodeショートカット一覧
ktombow
0
190
Pythonによる契約プログラミング入門 / PyCon JP 2025
7pairs
5
2.4k
後進育成のしくじり〜任せるスキルとリーダーシップの両立〜
matsu0228
4
1.3k
ユニットテストに対する考え方の変遷 / Everyone should watch his live coding
mdstoy
0
120
SOC2取得の全体像
shonansurvivors
1
350
"複雑なデータ処理 × 静的サイト" を両立させる、楽をするRails運用 / A low-effort Rails workflow that combines “Complex Data Processing × Static Sites”
hogelog
3
1.7k
Featured
See All Featured
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
657
61k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.2k
Docker and Python
trallard
46
3.6k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
2.6k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.1k
How GitHub (no longer) Works
holman
315
140k
YesSQL, Process and Tooling at Scale
rocio
173
14k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
6.1k
A better future with KSS
kneath
239
17k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
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