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
GoのASTを用いて フィルター機能を作ろうとした話
Search
Suzu Ito
April 24, 2025
Programming
190
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
GoのASTを用いて フィルター機能を作ろうとした話
Suzu Ito
April 24, 2025
More Decks by Suzu Ito
See All by Suzu Ito
monorepo.pdf
suzuito
1
480
Python on Google Cloud Functions で作るバッチ処理
suzuito
0
3.8k
Other Decks in Programming
See All in Programming
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
170
Performance Engineering for Everyone
elenatanasoiu
0
260
SLOをサービス品質の共通言語にするために 取り組んできたこと
wakana0222
0
370
関数型プログラミングのメリットって何だろう?
wanko_it
0
140
act1-costs.pdf
sumedhbala
0
170
AI がコードを書く時代における新卒エンジニアの仕事風景 (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
200
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
360
フィードバックで育てるAI開発
kotaminato
1
100
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
14
2.7k
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
190
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
140
SREの積み重ねがAI駆動開発のガードレールになった ― 7つの実践/SRE Guardrails The 7
tomoyakitaura
7
2.4k
Featured
See All Featured
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
A Tale of Four Properties
chriscoyier
163
24k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
55k
Designing for Timeless Needs
cassininazir
1
270
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
340
From π to Pie charts
rasagy
0
230
Google's AI Overviews - The New Search
badams
0
1.1k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
How to make the Groovebox
asonas
2
2.3k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Transcript
ླ ହే GoͷASTΛ༻͍ͯ ϑΟϧλʔػೳΛ࡞Ζ͏ͱͨ͠ Go Connect #6 2025.04.24
ླ ହే / Suzuki Taito / @ts__0625 • WebΤϯδχΞ (6
• όοΫΤϯυ • GoྺGo • ݩʑσʔλΤϯδχΞͬΆ͍ (7 • ݱࡏ • WebΤϯδχΞ @גࣜձࣾHRBrain ࣗݾհ
ࣄͰϘπʹͳ͚ͬͨͲ ASTͷԠ༻ࣄྫͱͯ͠໘ന͍ (…ͱࢥ͏) ͳͥ͜ͷΛ͢Δʁ
ΞδΣϯμ GoͷASTΛ༻͍ͯϑΟϧλʔػೳΛ࡞Ζ͏ͱͨ͠ എܠ ϑΟϧλʔػೳͱ ASTΛ༻͍Δ͜ͱʹͳͬͨܦҢ ຊ ϑΟϧλʔػೳͷ࡞Γํ ৼΓฦΓ ࣗݾհ
എܠ
Γ͍ͨ͜ͱ λ ϑΟϧλ ϝοηʔδ mailૹ৴ DB λ Ϣʔβʔຖͷ ϑΟϧλઃఆ ΤϯυϢʔβʔ
ϝοηʔδ͕ྲྀΕͯ͘Δ
Γ͍ͨ͜ͱ λ DB ΤϯυϢʔβʔ ౦ژ৽॓۠ɺ͔ͭɺ౪ࣄ݅ ·ͨ ࡛ۄݝॴࢢɺ͔ͭɺߑਫɺ͔ͭɺʮচ্ਁਫʯؚ͕·ΕΔ
࣮ͷ՝() λ DB ΤϯυϢʔβʔ ౦ژ৽॓۠ɺ͔ͭɺ౪ࣄ݅ ·ͨ ࡛ۄݝॴࢢɺ͔ͭɺߑਫɺ͔ͭɺʮচ্ਁਫʯؚ͕·ΕΔ ςΩετͷϑΟϧλʔઃఆͷύʔε Ͳ͏Δʁ ςΩετͷϑΟϧλʔઃఆͷจ๏ɻͲ͏͢Δʁ
ύʔεͨ݁͠ՌͷASTͷධՁ Ͳ͏Δʁ
;ͱʮGoͷASTʯΛࢥ͍ग़ͨ͠ ඪ४ϥΠϒϥϦ go/ast, go/parser GoݴޠͷιʔείʔυΛ੩తղੳ͢Δͱ͖ʹΘΕΔ go/ast … AST ද͢ߏମͳͲ go/parser
… ιʔείʔυ͔ࣜΒASTΛߏங͢Δύʔαʔ go/parser.ParseExpr ؔ … Goݴޠͷࣜ(Expression)͚ͩͷASTΛฦ͢ ( a + fn(1) ) * d
GoͷASTΛ͑… λ DB ΤϯυϢʔβʔ ςΩετͷϑΟϧλઃఆΛ GoͷࣜͰهड़͢Δ ςΩετͷϑΟϧλʔઃఆͷจ๏ Goݴޠͷࣜ ΦϨASTͷධՁॲཧΛ࣮͢Δ͚ͩʂ ςΩετͷϑΟϧλʔઃఆͷύʔε
ParseExprؔΛ༻͍Δ
࣮ݮΒͤͯ ໘നͦ͏😀😀
ຊ
λ DB ΤϯυϢʔβʔ ςΩετͷϑΟϧλઃఆΛ GoͷࣜͰهड़͢Δ ຊʂ
ຊ ίϨΛ Ͳ͏࡞͔ͬͨʁ ϑΟϧλʔઃఆ(Goͷࣜ) ↑࣍εϥΠυͰৄ͘͠
ϑΟϧλʔઃఆ(Goͷࣜ) ࣜͷධՁ݁Ռඞͣϒʔϧ 3ͭͷ͕ؔఆٛͯ͋͠Δ contains(a string) bool : Πϕϯτͷ༰͕ a ΛؚΉʁ
equalType(a string) bool : Πϕϯτͷछྨ͕ a Ͱ͋Δʁ equalLoc(a string) bool : Πϕϯτͷൃੜॴ͕ a Ͱ͋Δʁ &&ͱ||ͷԋࢉࢠͷΈ͕༻Մೳ ྫ equalLoc(“౦ژ৽॓۠”) && equalType(“౪ࣄ݅”) || equalLoc(“࡛ۄݝॴࢢ”) && equalType(“ߑਫ”) && contains(“চ্ਁਫ”) ౦ژ৽॓۠ɺ͔ͭɺ౪ࣄ݅ ·ͨ ࡛ۄݝॴࢢɺ͔ͭɺߑਫɺ͔ͭɺʮচ্ਁਫʯؚ͕·ΕΔ
Filter(ev Event, setting string) bool ॲཧͷྲྀΕ (1) setting(ϑΟϧλʔઃఆ)ͷASTΛ࡞Δ (2) ASTʹؚ·ΕΔશͯͷؔΛධՁ͢Δ
(3) AST(ࣜશମ)ΛධՁ͢Δ
Filter(ev Event, setting string) bool (1) setting(ϑΟϧλʔઃఆ)ͷASTΛ࡞Δ ast/parser.ParseExpr ؔΛݺͿ͚ͩ equalLoc(“౦ژ৽॓۠”)
&& equalType(“౪ࣄ݅”) || equalLoc(“࡛ۄݝॴࢢ”) && equalType(“ߑਫ”) && contains(“চ্ਁਫ”) ্هͷࣜΛASTʹม͢Δͱ…ͬͯΈΔ https://go.dev/play/p/7llFDi3gdeI
Filter(ev Event, setting string) bool (1) setting(ϑΟϧλʔઃఆ)ͷASTΛ࡞Δ || && equalLoc
“౦ژ৽॓۠” equalType “౪ࣄ݅” && && equalLoc “࡛ۄݝॴࢢ” equalType “ߑਫ” contains “চ্ਁਫ”
Filter(ev Event, setting string) bool (2) ASTʹؚ·ΕΔશͯͷؔΛධՁ͢Δ ͚ؔͩධՁ (ਂ͞༏ઌ୳ࡧ͠ɺਂ͍ͱ͜Ζʹ͋Δ͔ؔΒ) ||
&& equalLoc “౦ژ৽॓۠” equalType “౪ࣄ݅” && && equalLoc “࡛ۄݝॴࢢ” equalType “ߑਫ” contains “চ্ਁਫ”
Filter(ev Event, setting string) bool (2) ASTʹؚ·ΕΔશͯͷؔΛධՁ͢Δ ͚ؔͩධՁ (ਂ͞༏ઌ୳ࡧ͠ɺਂ͍ͱ͜Ζʹ͋Δ͔ؔΒ) ||
&& True False && && False True False
Filter(ev Event, setting string) bool (3) AST(ࣜશମ)ΛධՁ͢Δ ͜ͷྫͰFalse || &&
True False && && False True False
Filter(ev Event, setting string) bool ASTͷਂ͞༏ઌ୳ࡧ walk.go Walkؔ Inspectؔ
😄Θʔ͍ Πέͦ͏
ࣾͷϨϏϡʔձͰ͓൸࿐ͯ͠Έͨ݁Ռ ςοΫϦʔυͳਓA ͋Μ·Γมͳ͜ͱΒͳ͍ํ͕͍͍ͱࢥ͏ͳʂ ςοΫϦʔυͳਓB ύϑΥʔϚϯεѱͦ͏ PdMͳਓ ඇΤϯδχΞʹͱͬͯɺGoݴޠͷࣜΉ͍ͣͬ͢ PdMͳਓ ͦͦෳࡶͳݕࡧ͍݅ΒΜ
😭ܸ 🪦ιʔείʔυຒ
ʹຒΊͨιʔείʔυͪ͜Β https://github.com/suzuito/ fi lter-by-ast-go ࠓճͷઆ໌ͷͨΊʹఏࣔͨ͠ʮྫʯͱ࣮͕एׯҧͬͯ·͕͢ɺ ϕʔεͱͯ͠Δߟ͑ํಉ͡Ͱ͢ɻ ࠓճͷઆ໌ͷͨΊʹɺ5ͿΓʹಈ͔ͯ͠ΈͨΒɺͪΌΜͱಈ͍ͨ(͢͞Go)
ৼΓฦΓ
͍·ࢥ͏ɺࣗͳΓͷධՁ 👌ϝϦοτ ґଘͳ͠ɿGoͷඪ४ϥΠϒϥϦͷΈͰ࣮ՄೳͳͨΊɻ ޓੑΛอͯΔɿGoͷࣜʹ͍ͭͯɺഁյతมߋͷϦεΫ͍ͨΊɻ ASTͷධՁͷΧελϚΠζੑྑ͠ɿධՁͷ࣮ΛࣗલͰॻ͘ʹͳΜͰͰ͖Δ 👎σϝϦοτ ASTͷධՁ෦ͷ࣮͕ෳࡶ πϦʔΛ୳ࡧͨ͠ΓɺελοΫPush/PopɺGoͷશASTϊʔυͷରԠ ΧελϜؔΛݺͿॲཧɺ…
͍·ࢥ͏ɺ͍·ΔͳΒ ඇΤϯδχΞͰѻ͑ΔϑΟϧλʔઃఆͱʁ ΛͪΌΜͱߟ͑Δ with PdMͱσβΠφʔ ධՁࣜ༻ͷϥΠϒϥϦΛ͏ CEL https://cel.dev/ Open Policy
Agent https://www.openpolicyagent.org/docs/latest/ Expr https://expr-lang.org/ ϥΠϒϥϦͷత͔Β֎Ε͍ͨํΛ͠ͳ͍
🙇 Goਗ਼ௌ͋Γ͕ͱ͏Go͍͟·ͨ͠