Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Golang と Erlang
Search
鹿
October 20, 2024
Programming
8
2.2k
Golang と Erlang
2024-10-20 (日) に Kyoto.go remote #54 リモートLT会 で発表したスライドです。
鹿
October 20, 2024
Tweet
Share
More Decks by 鹿
See All by 鹿
なぜselectはselectではないのか
taiyow
1
400
Go の GC の不得意な部分を克服したい
taiyow
4
1.4k
Other Decks in Programming
See All in Programming
STYLE
koic
0
150
宅宅自以為的浪漫:跟 AI 一起為自己辦的研討會寫一個售票系統
eddie
0
490
251126 TestState APIってなんだっけ?Step Functionsテストどう変わる?
east_takumi
0
310
Microservices rules: What good looks like
cer
PRO
0
1.1k
AIコードレビューがチームの"文脈"を 読めるようになるまで
marutaku
0
350
CSC305 Lecture 17
javiergs
PRO
0
340
ゲームの物理 剛体編
fadis
0
320
AIコーディングエージェント(Manus)
kondai24
0
160
堅牢なフロントエンドテスト基盤を構築するために行った取り組み
shogo4131
8
2.3k
組み合わせ爆発にのまれない - 責務分割 x テスト
halhorn
1
140
30分でDoctrineの仕組みと使い方を完全にマスターする / phpconkagawa 2025 Doctrine
ttskch
3
790
LLMで複雑な検索条件アセットから脱却する!! 生成的検索インタフェースの設計論
po3rin
2
650
Featured
See All Featured
Docker and Python
trallard
47
3.7k
Reflections from 52 weeks, 52 projects
jeffersonlam
355
21k
Into the Great Unknown - MozCon
thekraken
40
2.2k
Designing for humans not robots
tammielis
254
26k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.8k
The Pragmatic Product Professional
lauravandoore
37
7.1k
Optimising Largest Contentful Paint
csswizardry
37
3.5k
Code Review Best Practice
trishagee
74
19k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Fireside Chat
paigeccino
41
3.7k
GitHub's CSS Performance
jonrohan
1032
470k
How to train your dragon (web standard)
notwaldorf
97
6.4k
Transcript
Golang(*)と Erlang 鹿 @mizushika1 (*)正式名称は「Go」ですが、並べたときの響きの良さのために、 このスライドでは Golang と表記しています
名前は似てるけど、全然似てない Golang Erlang プログラミングモデル 手続き型 関数型 代入 何回でも 単一代入 コンパイル結果
バイナリ 中間言語 コンパイル結果 1ファイル moduleごとに別ファイル panic プロセス全体が死ぬ 軽量プロセスだけが死ぬ
スレッドを起動して Hello World の例 -module(hello). -export([start/0, printer/0]). start() -> Pid
= spawn(fun printer/0), Pid ! "Hello World~n". printer() -> receive msg -> io:fwrite(msg) end. package main import "fmt" func main() { ch := make(chan string) go printer(ch) ch <- "Hello World" <-ch } func printer(ch chan string) { msg := <-ch fmt.Println(msg) close(ch) }
runtime では似ている部分もある • スレッドモデルはどちらも M:N • Golang で言う goroutine •
Erlang で言う軽量プロセス • GC • ある • Golang は Mark and Sweep 方式 • Erlang は 世代別 GC も採用 • スレッド間の共有方法 • 変数をキュー(チャンネル)にコピーして通信 • Share memory by communication
runtime で似ているけど違う部分を紹介 • スレッドモデル • GC • スレッド間の共有方法
スレッドモデル • M:N = OSスレッド:ランタイムのスレッド • スケジューラスレッドがOSスレッドとして存在 • ランタイムのスレッドを順番に実行していく •
スケジューラが空いたら他のスケジューラから奪ったりもする • Go で言う G, P, M の話 • 優先度設定は限定的 • Linuxカーネルだと、SCHED_** とか nice 値とかが指定できるが、 • Golang は優先度設定一切無し • Erlang は実質2レベルあり、ランキューが2本だけある • Golang は goroutine に名前を付けられない • 名前が無いので、外から状態を把握したり止めたりできない • Erlang は VM で動くのでリモートから接続してトレースができる
GC • Garbage Collector • プログラマがヒープメモリの開放を気にしなくて良い仕組み • 通常の人類には必須の機能 • Golang
はプロセス全体で GC をかける • Mark and Sweep という昔ながらの方式 • Mark のときに STW (Stop-the-World) が発生して、全goroutineが止まる • Erlangは軽量プロセス(runtimeスレッド)ごとにGCをかける • 他の軽量プロセスは影響を受けない • グローバル変数やポインタが無いからできる技 • 実行タイミングは「関数呼び出しの回数」
スレッド間の共有方法 • チャンネル or メッセージキューを推奨している • データがコピーして格納されるので shared nothing にできる
• Golang • チャンネルは自分で作る • 段数があり、それを超える write はブロックされる • close 済みのチャンネルに write すると panic になる • Erlang • 軽量プロセスを作ると自動でそれ用のメッセージキューも作られる • 段数は無限で、メモリの許す限り write できる • 存在しない相手に write してもエラーにならない • 1プロセス1キューなので、fan-out 構造は工夫が必要
まとめ • Golang と Erlang の、 似てないようで似てるようでやっぱり違う点の紹介をした • どちらも M:N
スレッドモデルを採用しており、 設計思想が共有できる点が多い(かも) • M:N スレッドモデルは今後広まっていきそう • Ruby の Ractor とか • Java の VirtualThread とか • 個人的感想 • Golang の GC も大量の goroutine 利用に適したものになってほしい • 世代別 GC を熱望している