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
140
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
440
もうちょっといいRubyプロファイラを作りたい (2025)
osyoyu
1
840
Profile and benchmark every change - RubyKaigi 2025
osyoyu
0
160
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
240
The depths of profiling Ruby - RubyKaigi 2024
osyoyu
3
8.2k
Other Decks in Programming
See All in Programming
oxlintはeslint/typescript-eslintを置き換えられるのか
shomafujita
2
320
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
500
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
190
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
310
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
3
1.2k
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
12k
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
120
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
550
A2UI という光を覗いてみる
satohjohn
1
110
ローカルLLMを使ってB2Bサービスを作っていての学び
yaotti
0
150
3Dシーンの圧縮
fadis
1
670
CSC307 Lecture 17
javiergs
PRO
0
320
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Done Done
chrislema
186
16k
Git: the NoSQL Database
bkeepers
PRO
432
67k
BBQ
matthewcrist
89
10k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
320
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
160
Are puppies a ranking factor?
jonoalderson
1
3.5k
We Are The Robots
honzajavorek
0
240
Music & Morning Musume
bryan
47
7.2k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
190
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͏͔ɺతͳੈք؍
͜Ε͚֮ͩ͑ͯؼ͍ͬͯͩ͘͞
͜Ε͚֮ͩ͑ͯؼ͍ͬͯͩ͘͞