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
490
Rubyで作る論理回路シミュレータの設計の話 - Kashiwa.rb #12
Koji NAKAMURA
June 16, 2025
Tweet
Share
More Decks by Koji NAKAMURA
See All by Koji NAKAMURA
龍昌餃子で理解するWebサーバーの並行処理モデル - 東葛.dev #9
kozy4324
1
150
Rubyで作る論理回路シミュレータ - Shinjuku.rb #99
kozy4324
0
92
Steep導入したいRTA - Kashiwa.rb #11
kozy4324
0
150
これまで細々と作成したGemの紹介をします - Kashiwa.rb #9
kozy4324
0
230
東京Ruby会議12のお手伝いしてきた話
kozy4324
0
110
個人開発発表 LT - Shinjuku.rb #97
kozy4324
0
340
Ruby界隈を中心に2024をふりかえる - Kashiwa.rb #6
kozy4324
0
180
「今までで一番学びになった瞬間」発表 LT - Shinjuku.rb #96
kozy4324
0
370
脆弱性から学ぶシリーズ CVE-2024-34341 - Kashiwa.rb #5 LT
kozy4324
0
300
Other Decks in Technology
See All in Technology
AWS オブザーバビリティサービスアップデート
o11yfes2023
0
120
"おまじない"はもう卒業! デバッガで探るSpring Bootの裏側と「学び方」の学び方
takeuchi_132917
0
170
Kubernetesと共にふりかえる! エンタープライズシステムのインフラ設計・テストの進め方大全
daitak
0
230
Service Monitoring Platformについて
lycorptech_jp
PRO
0
150
アジャイル社内普及ご近所さんマップを作ろう / Let's create an agile neighborhood map
psj59129
1
130
AIと自動化がもたらす業務効率化の実例: 反社チェック等の調査・業務プロセス自動化
enpipi
0
610
Flutterコントリビューションのススメ
d_r_1009
1
410
AIを前提に、業務を”再構築”せよ IVRyの9ヶ月にわたる挑戦と未来の働き方 (BTCONJP2025)
yueda256
1
740
生成AIではじめるテスト駆動開発
puku0x
0
120
マーケットプレイス版Oracle WebCenter Content For OCI
oracle4engineer
PRO
4
1.3k
身近なCSVを活用する!AWSのデータ分析基盤アーキテクチャ
koosun
0
1.3k
AIと共に開発する時代の組織、プロセス設計 freeeでの実践から見えてきたこと
freee
4
710
Featured
See All Featured
The Cult of Friendly URLs
andyhume
79
6.7k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.8k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
BBQ
matthewcrist
89
9.9k
Music & Morning Musume
bryan
46
6.9k
Git: the NoSQL Database
bkeepers
PRO
432
66k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
34
2.3k
Visualization
eitanlees
150
16k
Scaling GitHub
holman
463
140k
Unsuck your backbone
ammeep
671
58k
Statistics for Hackers
jakevdp
799
220k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
31
2.7k
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