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
360
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
83
Steep導入したいRTA - Kashiwa.rb #11
kozy4324
0
120
これまで細々と作成したGemの紹介をします - Kashiwa.rb #9
kozy4324
0
180
東京Ruby会議12のお手伝いしてきた話
kozy4324
0
89
個人開発発表 LT - Shinjuku.rb #97
kozy4324
0
220
Ruby界隈を中心に2024をふりかえる - Kashiwa.rb #6
kozy4324
0
160
「今までで一番学びになった瞬間」発表 LT - Shinjuku.rb #96
kozy4324
0
340
脆弱性から学ぶシリーズ CVE-2024-34341 - Kashiwa.rb #5 LT
kozy4324
0
260
ActiveRecord SQLインジェクションクイズ (Rails 7.1.3.4)
kozy4324
9
4.6k
Other Decks in Technology
See All in Technology
【Oracle Cloud ウェビナー】インフラのプロフェッショナル集団KELが考えるOCIでのソリューション実現
oracle4engineer
PRO
1
100
United Airlines Customer Service– Call 1-833-341-3142 Now!
airhelp
0
170
「クラウドコスト絶対削減」を支える技術—FinOpsを超えた徹底的なクラウドコスト削減の実践論
delta_tech
4
170
Delta airlines®️ USA Contact Numbers: Complete 2025 Support Guide
airtravelguide
0
340
AWS認定を取る中で感じたこと
siromi
1
200
Glacierだからってコストあきらめてない? / JAWS Meet Glacier Cost
taishin
1
170
united airlines ™®️ USA Contact Numbers: Complete 2025 Support Guide
flyunitedhelp
1
430
20250707-AI活用の個人差を埋めるチームづくり
shnjtk
6
4k
SRE不在の開発チームが障害対応と 向き合った100日間 / 100 days dealing with issues without SREs
shin1988
1
350
Sansanのデータプロダクトマネジメントのアプローチ
sansantech
PRO
0
190
FOSS4G 2025 KANSAI QGISで点群データをいろいろしてみた
kou_kita
0
410
React開発にStorybookとCopilotを導入して、爆速でUIを編集・確認する方法
yu_kod
1
300
Featured
See All Featured
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
6
310
Producing Creativity
orderedlist
PRO
346
40k
Music & Morning Musume
bryan
46
6.6k
Build your cross-platform service in a week with App Engine
jlugia
231
18k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
50
5.5k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.3k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.3k
Balancing Empowerment & Direction
lara
1
430
4 Signs Your Business is Dying
shpigford
184
22k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
Making Projects Easy
brettharned
116
6.3k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.9k
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