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
ZigでC拡張を作る 2024 Edition
Search
osyoyu
September 29, 2024
Programming
150
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ZigでC拡張を作る 2024 Edition
TokyuRuby会議15
https://tokyurubykaigi.github.io/tokyu15/
osyoyu
September 29, 2024
More Decks by osyoyu
See All by osyoyu
Wi-Fiはどこから来たのか Wi-Fiは何者か Wi-Fiはどこへ行くのか
osyoyu
0
530
もうちょっといいRubyプロファイラを作りたい (2025)
osyoyu
1
850
Profile and benchmark every change - RubyKaigi 2025
osyoyu
0
170
Regional.rb and the Tokyo Metropolis
osyoyu
0
280
都市伝説バスターズ「WebアプリのボトルネックはDBだから言語の性能は関係ない」 - Kaigi on Rails 2024
osyoyu
29
19k
プロファイラ開発者と見る「推測するな、計測せよ」 - YAPC::Hakodate 2024
osyoyu
7
1k
Rubyのパフォーマンスプロファイリングの改善 / Enhancing performance profiling for Ruby
osyoyu
2
1.1k
RubyKaigi Decks
osyoyu
0
250
The depths of profiling Ruby - RubyKaigi 2024
osyoyu
3
8.3k
Other Decks in Programming
See All in Programming
Hatena Engineer Seminar #37「言語モデルの活用に関する研究」
slashnephy
0
430
The Bowling Game- From Imperative to Functional Programming - Part 1
philipschwarz
PRO
0
160
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
200
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
620
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
570
エージェンティックRAGにAWSで入門しよう!
har1101
9
1.8k
SREは、MCPとSRE Agentをこう使え!
kazumax55
0
130
1B+ /day規模のログを管理する技術
broadleaf
0
120
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
330
はてなアカウント基盤 State of the Union
cockscomb
1
1.2k
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.3k
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2.6k
Featured
See All Featured
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
450
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
370
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
280
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
240
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.5k
Darren the Foodie - Storyboard
khoart
PRO
3
3.4k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Code Reviewing Like a Champion
maltzj
528
40k
What's in a price? How to price your products and services
michaelherold
247
13k
Building Applications with DynamoDB
mza
96
7.1k
Transcript
c5PLZV3VCZձٞ!PTZPZV ;JHͰ$֦ுΛͭ͘Δ &EJUJPO
QQ!PTZPZV w ͜ΕࣗݾհͰ͢ w ϓϩϑΝΠϥ͍͖ͩ͢ w ͬͱΛޠΓ·͢
!
!ͱݴ͑ౙ<ཁग़య><ಠࣗݚڀ><த͓͍͍͠>
ౙʹ3VCZͨ͘͠ͳ͍͔ʂʁ 5PLZV3VCZձٞ দߐ3VCZձٞ ,BJHJPO3BJMT 3VCZ8PSME$POGFSFODF 3VCZ,BJHJ
ౙʹ3VCZͨ͘͠ͳ͍͔ʂʁ Λॵʹ͠Α͏ w 3VCZͷ͓͠ΖιϑτΣΞͷൃදΛฉ͖͍ͨʂʂ w ΈΜͳ࡞ͬͯΔͷͰʂʂʂʁʁʁ w ࠓ @tokyork15
ౙʹ3VCZͨ͘͠ͳ͍͔ʂʁ Λॵʹ͠Α͏ w 3VCZͷ͓͠ΖιϑτΣΞͷൃදΛฉ͖͍ͨʂʂ w ΈΜͳ࡞ͬͯΔͷͰʂʂʂʁʁʁ w ࠓ$G1Λ։͖·ͨ͠ʂʂʂʂˠˠˠˠˠˠˠˠˠˠˠˠˠˠˣˣˣ w Ԡื͓ͪͯ͠·͢ʂʂʂʂ
ࠓ @tokyork15
౦ژ3VCZձٞΛΓ·͢ 3VCZ͕ؔ͋Δ͓͠ΖιϑτΣΞͷൃදΛฉ͖͍ͨʂʂ @tokyork15
౦ژ3VCZձٞΛΓ·͢ 3VCZ͕ؔ͋Δ͓͠ΖιϑτΣΞͷൃදΛฉ͖͍ͨʂʂ ౦ژ ౦ژ ౦ژ ౦ژ ౦ژ ౦ژ @tokyork15
ຊ
͍3VCZ͕΄͍͠ ͍͍3BDUPSͶ w *46$0/ʹ3VCZͰউ͍ͪͨ w ͬͱ͘ͳͬͯ΄͍͠ w (7-֫ಘͪͱ͔ w ϝιουςʔϒϧҾ͖ͪͱ͔
w ͦ͏͍͏ͷ͕ʜʜ͜͏ʜʜͳ͘ͳͬͯ΄͍͠
͜͜ͰΞϯέʔτͰ͢
"""$ΛಡΉͷ͕͖ͳਓ
"""$Λॻ͘ͷ͕͖ͳਓ
$֦ுΛॻ͚͍͍ w 3VCZ͔Β$ͷίʔυΛݺͼग़ͤΔػೳ w ͍ίʔυΛݺͼग़͓ͤͯτΫ w දྫͱͯ͠NZTRM͕͋Δ $Ͱॻ͔ΕͨMJCNZTRMDMJFOUΛݺΜͰ͍Δ w
ෆͳ΄Ͳ͘ͳΔ VALUE rb_nanika() { VALUE ary = rb_ary_new(); rb_ary_push(ary, INT2NUM(1)); return ary; } require_relative "./ext.so" p nanika #=> [1]
$ͷ͕͍͍͜͜
$ͷ͕͍͍͜͜ #include <signal.h> static volatile sig_atomic_t flag = 0; int
main(int argc, char *argv[], char *envp[]) { int heap = (int *)malloc(100 * sizeof(int)); int *ptr = heap[0]; *(ptr + 1) *= ptr * ptr; signal(SIGINT, signal_handler); for(;;) {}; } εʔύʔϋΧʔͬΆ͍
$ͷ͕͜͜ྑ͘ͳ͍
$ͷ͕͜͜ྑ͘ͳ͍ εʔύʔϋΧʔ͗͢Δ #include <signal.h> static volatile sig_atomic_t flag = 0;
int main(int argc, char *argv[], char *envp[]) { int heap = (int *)malloc(100 * sizeof(int)); int *ptr = heap[0]; *(ptr + 1) *= ptr * ptr; signal(SIGINT, signal_handler); for(;;) {}; }
ͦ͜Ͱ;JH $͔ΒಟΛൈ͍ͯεʔύʔϋΧʔΈΛͨ͠ݴޠ
ͦ͜Ͱ;JH w ࠓճ$FYUFOTJPOΛ;JHͰॻ͘ͱͲ͏ͳΔ͔ʁͱ͍͏༰ VALUE rb_nanika() { VALUE ary = rb_ary_new();
rb_ary_push(ary, INT2NUM(1)); return ary; } fn rb_nanika() ruby.VALUE { const ary = ruby.rb_ary_new(); ruby.rb_ary_push( ary, ruby.INT2NUM(1) ); return ary; }
;JHͷ͍͍ͱ͜ΖΛհ
;JH͍͍ͱ͜Ζ ΩϟϥΫλʔ ͔Θ͍͍
;JH͍͍ͱ͜Ζ ΩϟϥΫλʔ ·͍ͩΔ
;JH͍͍ͱ͜Ζ ׂͱศརͳTUEMJC͕͋Δ ྫྷ੩ʹߟ͑Δͱࣙॻܕ͢Βͳ͍$ศརͰͳ͍ var dict = std.AutoHashMap( *const i8,
i32 ).init(...); defer dict.deinit(); try dict.put("ruby", 1); try dict.put("c", 2); try dict.put("zig", 3); w "SSBZ-JTU )BTI.BQ 4UBDL ͳͲɺΑ͘͏σʔλߏ ἧ͍ͬͯΔ w ศརʂ w ͳΜͰ$ʹͳ͍Μͩ
;JH͍͍ͱ͜Ζ $ؔϚΫϩݺΔ ϚδͰʂʁ const ruby = @cImport({ @cInclude("ruby.h"); });
fn fib(n: u32) ruby.VALUE { if (n<=1) { return n; } const res = fib(n-1) + fib(n-2); return ruby.INT2FIX(res) } w $''*ػೳ͕͋ͬͯɺ $ϚΫϩΛݺͼग़ͤΔݴޠ ͦ͏ͳ͍ w 3VCZ$"1*ͰϚΫϩ͕ͳ ͍ͱ݁ߏπϥ͍ͷͰɺॿ͔Δ w */5'*9 '*9*/5 35&45 w ͪΖΜ$͔Β;JHΛݺ Δ
;JH͍͍ͱ͜Ζ ΅ͪ΅ͪTBGF ΅ͪ΅͙ͪΒ͍ var dict = std.AutoHashMap( *const i8,
i32 ).init(...); defer dict.deinit(); try dict.put("ruby", 1); try dict.put("c", 2); try dict.put("zig", 3); w OVMMΛ౿Έൈ͖ʹ͍͘Α͏ͳ ػೳ͕΅ͪ΅ͪ w 0QUJPOܕ w GSFF࿙ΕΛ͙ػೳ΅ͪ΅ͪ w EFGFS w ·͊΅ͪ΅ͪʜʜ w VTFBGUFSGSFFͱ͔͛ͳ ͍
;JH͍͍ͱ͜Ζ $ίϯύΠϥʹͳΔ w طଘͷ$ HDD ࢿ࢈ʹ;JHίʔυΛॱ͍࣍ࠞͥͯ͘ͷ͕༰қ w 5ZQF4DSJQUͷBMMPX+TΈ͍ͨͳงғؾͰ$Λ͑ΔʢΘΔʁʣ w
$3VCZࣗମ[JHDDͰίϯύΠϧ͢Δ͜ͱʜʜͰ͖Δ ~/ruby/build % CC="zig cc" ../configure % make % make install
;JH͍͍ͱ͜Ζ ΩϟϥΫλʔ ·͍ͩΔ
࣮ફ;JHͰ(FNΛ࡞Δ w ฒྻͰߴʹ࠶ؼͰϑΟϘφονΛܭࢉ ͯ͘͠ΕΔͭΛ࡞ͬͨ w IUUQTHJUIVCDPNPTZPZV[JHSC pC w 3VCZͰ(7-͕͋ΔͷͰฒྻʹͳ Βͳ͍ʂ
fib(42) fib(41) fib(40) fib(40) fib(39) fib(39) fib(38
͜Μͳײ͡ ΅ͪ΅͍ͪ const std = @import("std"); const ruby = @cImport({
@cInclude("ruby.h"); }); export fn Init_mygem() void { ruby.rb_define_method( ruby.rb_mKernel, "fib", @ptrCast(&rb_fib), 1); } fn rb_fib() ruby.VALUE { ... } w ࣗ͘͝વʹJODMVEFSVCZI ૬͕Ͱ͖͍ͯΔ w SVCZSC@EFpOF@NFUIPE Έͨ ͍ͳײ͡Ͱ؆୯ʹݺͼग़ͤΔ w !QUS$BTUͱ͔͕ඞཁʹͳͬͯ Δͷ͝Ѫᇷ
$ʹίϯύΠϧ͢Δ ext.zig ext.c ext.so zig build-obj -ofmt=c gcc -fPIC -shared
w (FNͷҰ෦ͱͯ͠;JHίʔυΛ ͢Δ߹ɺϢʔβʔڥʹ ;JHίϯύΠϥ͕ඞཁʹͳΔ w ʜʜͱ͍͏͜ͱʹͳΒͳͯ͘ɺ ;JHΛࣄલʹ$ʹม͓ͯ͘͜͠ ͱ͕Ͱ͖Δ w ͜ΕͳΒHDD͑͋͞Ε͍͍ w ͪΖΜTPΛ࡞Δ͜ͱͰ͖ Δ
Ͱ͖ͨ λΠτϧճऩͰ͖ͨʁ w ͜ͷௐࢠͰ3VCZίʔυΛͲΜͲΜ;JHʹͨ͠ΒͲΜͲΜ͘ͳΓͦ͏ w ͜ΕͰ*46$0/༏উͩʂʂʂ
Զ͍3VCZ͕΄͔ͬͨ͠ͷʹ ͳΜͰ;JH͔ͬΓॻ͍ͯΔΜͩʜʜ w ଟͦ͏͍͏͜ͱ͡Όͳ͍
͜͏͍͏Λ͢Δͱग़ͯ͘Δͭ
3VTUͰΑ͘ͳ͍ʁ
3VTU࠷ڧ ·͊Θ͔Δ w ͳΜ͔3VTUͷ΄͏͕҆શͩ͠ w ͳΜ͔3VTUͷ΄͏͕։ൃମݧ͕͍͍Β͍͠͠ w ͳΜ͔3VTUͷ΄͏͕͍͠͠ w ͍͠ͱεʔύʔϋΧʔͬΆ͍͍ͯ͘
w ԶɺϘϩʔνΣοΧʔͷؾ͔͖࣋ͪͬͯ·ͨ͠Α͆
;JHWT3VTU w ҆શੑͰൺΒΕΔͱɺ 3VTUͷ΄͏͕ѹతʹ͙͢Ε͍ͯ Δ IUUQTYDPNTDIOFDLFSTUFJOTUBUVT
VOTBGF\ͦͷ3VTUTBGFͰ͔͢ ^ w 3VCZͷ"1*Λݺͼग़ͨ͠ॠؒʹVOTBGFͰ͢Α w VOTBGF\SC@IBTI@OFX ^ w ͦ͏ʜʜ w
Զͷॻ͘ίʔυ͕TBGF͡Όͳ͍Θ͚ͳ͍Μ͚ͩͲʜʜ w 4&(7͢Δ·Ͱಈ͍ͯΔ͚Ͳʜʜ
VOTBGF\ͦͷ3VTUTBGFͰ͔͢ ^ w 3VCZͷ"1*Λݺͼग़ͨ͠ॠؒʹVOTBGFͰ͢Α w VOTBGF\SC@IBTI@OFX ^ w ͦ͏ʜʜ w
Զͷॻ͘ίʔυ͕TBGF͡Όͳ͍Θ͚ͳ͍Μ͚ͩͲʜʜ w 4&(7͢Δ·Ͱಈ͍ͯΔ͚Ͳʜʜ ൱
None
;JHͷ΄͏͕ڧ͍ͧʂ
$Ͱ$֦ுΛ࡞Δ w ΄΅3VCZΛॻ͍ͯΔײ֮ w ($͕ͦͷ··͑ΔͷͰɺ7"-6&ʢ3VCZͷੈքͷ Λ࡞ͬͨޙʹ GSFF ͢Δͱߟ͑ͳ͍͍ͯ͘ w $Λॻ͍ͯΔͱ͖ʹTFHW͢Δཧ༝/PͷOVMMQPJOUFSEFSFGͳ͍
VALUE rb_nanika() { VALUE ary = rb_ary_new(); rb_ary_push(ary, INT2NUM(1)); return ary; } def nanika ary = [] ary.push(1) ary end
·͡Ίͳ w 3VTUͰ$֦ுΛॻ͘ͷ·ͩ·ͩʜʜຊʹʜʜ͔ͳΓ͠ΜͲ͍ w 3VTUͷμϧ͍ͱ͜Ζ͔ͬ͠Γ׆͖ΔҰํ w ͍͍ͱ͜ΖશવڗडͰ͖ͳ͍ w ·͡Ͱ4&(7͠·͘Δɻ4FHNFOUBUJPO'BVMU4FHNFOUBUJPO'BVMU 4FHNFOUBUJPO'BVMU
w Ͳ͏ͤͦΜͳײ͡ͳΒ;JHͰؾ࣋ͪΑ͘Δํ͕͍͍ͱࢥ͏ͷͰͨ͠ w ϚΫϩ͑Δ͠ w 3VTUͰͬͯΔͱຊʹແݶʹϚΫϩ࠶ఆٛ͢Δ͜ͱʹͳΔ
3VCZ(FNTʹ;JHͷ࣌͘Δͷ͔ʁ w ͳΜͱݴ͑ͳ͍ w ؆୯ʹ;JHͰॻ͚ΔΑ͏ʹͳͬͨΒɺ$֦ு͕͏ͪΐͬͱۙͳଘࡏʹ ͳΔ͔ w ΞϓϦέʔγϣϯͷҰ෦ͱͯ͠;JH͏͔ɺతͳੈք؍
͜Ε͚֮ͩ͑ͯؼ͍ͬͯͩ͘͞
͜Ε͚֮ͩ͑ͯؼ͍ͬͯͩ͘͞