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
580
もうちょっといいRubyプロファイラを作りたい (2025)
osyoyu
1
860
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.2k
RubyKaigi Decks
osyoyu
0
250
The depths of profiling Ruby - RubyKaigi 2024
osyoyu
3
8.3k
Other Decks in Programming
See All in Programming
Claude Team Plan導入・ガイド
tk3fftk
0
210
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
950
act2-costs.pdf
sumedhbala
0
110
Terraform標準の組織で AWS CDKをどう使うか
mu7889yoon
0
280
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
230
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
170
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
6.3k
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
12
4.8k
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
1.5k
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
150
Apache Hive: そしてCloud Native Lakehouseへ
okumin
1
130
Performance Engineering for Everyone
elenatanasoiu
0
270
Featured
See All Featured
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
770
Test your architecture with Archunit
thirion
1
2.3k
Mind Mapping
helmedeiros
PRO
1
280
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
Marketing to machines
jonoalderson
1
5.6k
The browser strikes back
jonoalderson
0
1.4k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
880
Rails Girls Zürich Keynote
gr2m
96
14k
Believing is Seeing
oripsolob
1
170
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
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͏͔ɺతͳੈք؍
͜Ε͚֮ͩ͑ͯؼ͍ͬͯͩ͘͞
͜Ε͚֮ͩ͑ͯؼ͍ͬͯͩ͘͞