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
SchemeのEphemeronとWeak Pairの説明
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Niyarin
June 25, 2020
Programming
0
1.1k
SchemeのEphemeronとWeak Pairの説明
Niyarin
June 25, 2020
Tweet
Share
More Decks by Niyarin
See All by Niyarin
Scheme用nREPLの開発(エラー出力の改善)
niyarin
0
170
bel lispの紹介
niyarin
0
770
nanopass-compiler-frameworkを使ってみました
niyarin
0
460
Gorgos-parser-combinator-written-in-scheme
niyarin
0
400
outputting-beautiful-s-expression
niyarin
0
410
Serialisp
niyarin
1
690
Mongo DBとS式検索
niyarin
0
350
goodbye-python-repl
niyarin
0
380
red-paren-scheme-rev-macro.pdf
niyarin
0
440
Other Decks in Programming
See All in Programming
izumin5210のプロポーザルのネタ探し #tskaigi_msup
izumin5210
1
130
OSSとなったswift-buildで Xcodeのビルドを差し替えられるため 自分でXcodeを直せる時代になっている ダイアモンド問題編
yimajo
3
620
AIと一緒にレガシーに向き合ってみた
nyafunta9858
0
250
Lambda のコードストレージ容量に気をつけましょう
tattwan718
0
140
CSC307 Lecture 03
javiergs
PRO
1
490
今こそ知るべき耐量子計算機暗号(PQC)入門 / PQC: What You Need to Know Now
mackey0225
3
380
Package Management Learnings from Homebrew
mikemcquaid
0
230
Grafana:建立系統全知視角的捷徑
blueswen
0
330
AIエージェント、”どう作るか”で差は出るか? / AI Agents: Does the "How" Make a Difference?
rkaga
4
2k
インターン生でもAuth0で認証基盤刷新が出来るのか
taku271
0
190
組織で育むオブザーバビリティ
ryota_hnk
0
180
副作用をどこに置くか問題:オブジェクト指向で整理する設計判断ツリー
koxya
1
610
Featured
See All Featured
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
2.1k
Designing Powerful Visuals for Engaging Learning
tmiket
0
240
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
180
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.2k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.3k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.4k
Facilitating Awesome Meetings
lara
57
6.8k
Git: the NoSQL Database
bkeepers
PRO
432
66k
A better future with KSS
kneath
240
18k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.3k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
160
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
220
Transcript
Schemeの Ephemeron (と weak pair) Niyarin
Ephemeronの概要 About Ephemeron ・ R7RS large red/(SRFI 124) ・Weak-pairsの亜種 ・オリジナルはSmalltalkに搭載された機能
Smalltalk/vの作者の1人(George Bosworth)の発明 ・ポータブルに実装できない
弱参照の雑な説明 ・オブジェクトの生存判定に含まれない参照 → 弱参照からのみ参照されているオブジェクトは回収できる (マークフェーズに辿らない/リファレンスカウントに含めない) ・例 ) Lispのsymbol intern table
string->symbol したシンボルが不要になったらテーブルからも消したい
Weakpair ・carが 弱参照でcdrが強参照なペア 通常のpairと違う点(Mit Schemeの例) ・回収済みかの述語の weak-pair/car? ・carが回収済みの場合、weak-car すると、#falseが帰る 青:弱参照
赤:強参照
Weakpairで作るデータ構造1 ・Weak list ・Weak vector car部を弱参照のboxとして使う
Weakpairで作るデータ構造2 ・weak alist(flat) ・weak-pairと普通のpairを交互に配置した ・keyもvalも弱参照/keyが強参照でvalが弱参照も配置を変えるだけ
Ephemeron 「連想コンテナで今後assqされないkey-val対は不要」 ・keyが弱参照でvalが強さが仕様しだいな参照を持つ (1) keyが回収できるなら、valへの参照はできなくなる(broken状態) (2) valからのみkeyが強参照できる場合でも回収できる Weak pairの問題 pairの外でkeyがない(assqされない)が、
valから強参照があれば、不要でもメモリに残り続ける
Ephemeronで苦手なこと weak-listはできない↓ (finalizeがあれば少し事情が変わる) → あるcellのcarが回収された時点でcdrにいけなくなる ・weak containerの部品としては、weak-boxとしての使い方になる (通常のlistのcarにEphemeronをいれる) ・key-val対としては優秀
Ephemeronの回収可能/不可能の例 ・回収可能(broken)な例 ・回収されない例
Ephemeron処理系ごとの実装 いくつかの実装は完全ではない ”valのみからの強参照の場合回収できる”ができない → Chibischeme、Sagittarius、Gauche etc. Racket や MIT/GNU Schemeはできている
RacketやMIT/GNU Schemeではvalは弱参照扱い
Ephemeron処理系ごとの実装 ・自前のトレース系GCを持つ処理系は割とやるだけ "Ephemerons: A New Finalization Mechanism"に疑似コードがある ・Boehm GCは難しい 弱参照:GC_GENERAL_REGISTER_DISAPPEARING_LINK
ファイナライズ:GC_REGISTER_FINALIZER で、”keyが回収可能ならbrokenする”までは実装できる valからのみはこれだけではできない
EphemeronとSchemeの回収の扱い R7RSのメモリの扱い “they are permitted to reclaim the storage occupied
by an object.” → 「再利用を許可する」 再利用は許可されているだけなので、普通のconsでも良い (define make-ephemeron cons) (define ephemeron-key car) (define ephemeron-datum cdr) (define (ephemeron-broken? _) #f)
Sagittarius Schemeの現在の実装 ・Boehm GCを採用している処理系 “keyが回収済みならvalを返さない”ことまではできる datumへのアクセスはkeyの生存判定を都度やって実現している (define (ephemeron-broken? e) (weak-box-empty?
(ephemeron-key e))) (define (ephemeron-datum e) (and (not (ephemeron-broken? e) (%ephemeron-datum e)))
よく知られているトレース系GCでの扱い value部で使われていても回収できる = value部以外で使われていなれば回収できる → Ephemeronの外側を最初にトレースすれば良い 1.マークフェーズを行う ただしEphemeronに当たると、Ephemeron用Queueに入れて、中は辿らない 2.Ephemeron用Queueでkeyが生きているものはvalue部について1を行う Ephemeron用Queueでkeyが回収可能なものはbrokenする
⇑はとても端折ったので、"Ephemerons: A New Finalization Mechanism"を見る ただし、疑似コードがSmalltalkだけど
実用例:手続きのキャッシュ ・引数2以降や結果が引数1を強参照していてもキャッシュから消せる ・引数のどれかが回収されたら、キャッシュは使えない → 途中のEphemeronがbrokenになっても問題ない ・(Improper listなのは、 引数が生存している場合、結果は常に生存していて欲しいから) (引数と結果の組を保存して、 毎回計算しなくてよくする)
おわり ・Ephemeronは、キャッシュやテーブルの実装に役立つ ・SRFIにFinalize的なものが来ないかな... ・参照カウントを採用したSchemeのEphemeron採用例があったら楽しめたが.. → そもそも参照カウントなScheme実装はあまり聞かない ・ポータブルでちゃんと実装するのは難しい(できない)ので、 他のLisp方言の人たちはEphemeronが使えなくて悲しいでしょうね → Schemeは良いぞ