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
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
650
もうちょっといいRubyプロファイラを作りたい (2025)
osyoyu
1
910
Profile and benchmark every change - RubyKaigi 2025
osyoyu
0
200
Regional.rb and the Tokyo Metropolis
osyoyu
0
290
都市伝説バスターズ「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.6k
Other Decks in Programming
See All in Programming
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
250
thread_parallel_with_free-threaded_Python_and_NumPy.pdf
riku_sakamoto
0
370
SREの越境 / SRE Collaboration
y0hgi
2
290
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
4.4k
すこし踏み込む CancellationToken
htkym
2
1.4k
Heart of Swift Concurrency
koher
0
1.1k
ソニーのクラウド共通基盤の変遷とAI時代の開発スタイルに合わせた進化 / The Journey of Sony’s Common Cloud Platform and Its Evolution for AI-Native Development
kenjiyoneyama
0
180
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
4.8k
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
590
Security issues being discussed on Web Platforms
petamoriken
0
1.3k
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
260
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
190
Featured
See All Featured
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
430
GitHub's CSS Performance
jonrohan
1033
470k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1k
AI: The stuff that nobody shows you
jnunemaker
PRO
10
1.1k
Un-Boring Meetings
codingconduct
0
430
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
250
Ethics towards AI in product and experience design
skipperchong
2
400
How Software Deployment tools have changed in the past 20 years
geshan
2
34k
Facilitating Awesome Meetings
lara
57
7.2k
For a Future-Friendly Web
brad_frost
183
10k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
570
Designing for Performance
lara
611
70k
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͏͔ɺతͳੈք؍
͜Ε͚֮ͩ͑ͯؼ͍ͬͯͩ͘͞
͜Ε͚֮ͩ͑ͯؼ͍ͬͯͩ͘͞