Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ZigでC拡張を作る 2024 Edition
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
osyoyu
September 29, 2024
Programming
170
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
680
もうちょっといいRubyプロファイラを作りたい (2025)
osyoyu
1
920
Profile and benchmark every change - RubyKaigi 2025
osyoyu
0
200
Regional.rb and the Tokyo Metropolis
osyoyu
0
300
都市伝説バスターズ「WebアプリのボトルネックはDBだから言語の性能は関係ない」 - Kaigi on Rails 2024
osyoyu
29
20k
プロファイラ開発者と見る「推測するな、計測せよ」 - YAPC::Hakodate 2024
osyoyu
7
1.1k
Rubyのパフォーマンスプロファイリングの改善 / Enhancing performance profiling for Ruby
osyoyu
2
1.2k
RubyKaigi Decks
osyoyu
0
260
The depths of profiling Ruby - RubyKaigi 2024
osyoyu
3
8.7k
Other Decks in Programming
See All in Programming
AI主導のプログラミング学習アプリを作ってみた
econanringo
0
180
SalesForceを内製化!? ~ HR事業を支える顧客管理基盤のインフラを大公開 ~
oku053
0
190
[ハンズオン]AIへの指示だけで「五目並べ」を作ってみよう
satoshi256kbyte
1
380
エージェントを使い続けるためのメタワーク / Meta-work for keeping using the agent
rkaga
1
240
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
270
ChromeでローカルLLM
ryu1013
0
140
[Dev Group Paris Octobre 26] Agentforce, SIforce, Claudeforce, Slackbot… on s'y retrouve ?
nabondance
0
110
Vue Fes Japan の “作る側”に関わってみて
naokihaba
0
160
AWSに止められる覚悟してますか?
morizo_1984
2
540
作れる、でも消せるか?──安全に「枯らして消す」機能削除術 / Drain, Then Delete
chobishiba
2
820
TechTown - Creating Composable Callables in Contemporary C++
rollbear
0
130
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
220
Featured
See All Featured
Building the Perfect Custom Keyboard
takai
2
910
Rebuilding a faster, lazier Slack
samanthasiow
85
9.7k
The browser strikes back
jonoalderson
0
1.8k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
Marketing to machines
jonoalderson
1
5.9k
Into the Great Unknown - MozCon
thekraken
41
2.8k
Making the Leap to Tech Lead
cromwellryan
135
10k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
440
Prompt Engineering for Job Search
mfonobong
0
520
Become a Pro
speakerdeck
PRO
31
6.3k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
500
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͏͔ɺతͳੈք؍
͜Ε͚֮ͩ͑ͯؼ͍ͬͯͩ͘͞
͜Ε͚֮ͩ͑ͯؼ͍ͬͯͩ͘͞