Slide 1

Slide 1 text

c5PLZV3VCZձٞ!PTZPZV ;JHͰ$֦ுΛͭ͘Δ &EJUJPO

Slide 2

Slide 2 text

QQ!PTZPZV w ͜Ε͸ࣗݾ঺հͰ͢ w ϓϩϑΝΠϥ͍͖ͩ͢ w ΋ͬͱ৘೤ΛޠΓ·͢

Slide 3

Slide 3 text

!

Slide 4

Slide 4 text

!ͱݴ͑͹ౙ<ཁग़య><ಠࣗݚڀ><೥த͓͍͍͠>

Slide 5

Slide 5 text

ౙʹ΋3VCZͨ͘͠ͳ͍͔ʂʁ 5PLZV3VCZձٞ দߐ3VCZձٞ  ,BJHJPO3BJMT  3VCZ8PSME$POGFSFODF 3VCZ,BJHJ

Slide 6

Slide 6 text

ౙʹ΋3VCZͨ͘͠ͳ͍͔ʂʁ Λ໠ॵ೔ʹ͠Α͏ w 3VCZͷ͓΋͠Ζιϑτ΢ΣΞͷൃදΛฉ͖͍ͨʂʂ w ΈΜͳ࡞ͬͯΔͷͰ͸ʂʂʂʁʁʁ w ࠓ೔  @tokyork15

Slide 7

Slide 7 text

ౙʹ΋3VCZͨ͘͠ͳ͍͔ʂʁ Λ໠ॵ೔ʹ͠Α͏ w 3VCZͷ͓΋͠Ζιϑτ΢ΣΞͷൃදΛฉ͖͍ͨʂʂ w ΈΜͳ࡞ͬͯΔͷͰ͸ʂʂʂʁʁʁ w ࠓ$G1Λ։͖·ͨ͠ʂʂʂʂˠˠˠˠˠˠˠˠˠˠˠˠˠˠˣˣˣ w Ԡื͓଴ͪͯ͠·͢ʂʂʂʂ ࠓ೔  @tokyork15

Slide 8

Slide 8 text

౦ژ3VCZձٞΛ΍Γ·͢ 3VCZ͕ؔ܎͋Δ͓΋͠Ζιϑτ΢ΣΞͷൃදΛฉ͖͍ͨʂʂ @tokyork15

Slide 9

Slide 9 text

౦ژ3VCZձٞΛ΍Γ·͢ 3VCZ͕ؔ܎͋Δ͓΋͠Ζιϑτ΢ΣΞͷൃදΛฉ͖͍ͨʂʂ ౦ژ ౦ژ ౦ژ ౦ژ ౦ژ ౦ژ @tokyork15

Slide 10

Slide 10 text

ຊ୊

Slide 11

Slide 11 text

଎͍3VCZ͕΄͍͠ ͸͍͸͍3BDUPSͶ w *46$0/ʹ3VCZͰউ͍ͪͨ w ΋ͬͱ଎͘ͳͬͯ΄͍͠ w (7-֫ಘ଴ͪͱ͔ w ϝιουςʔϒϧҾ͖଴ͪͱ͔ w ͦ͏͍͏ͷ͕ʜʜ͜͏ʜʜͳ͘ͳͬͯ΄͍͠

Slide 12

Slide 12 text

͜͜ͰΞϯέʔτͰ͢

Slide 13

Slide 13 text

"""$ΛಡΉͷ͕޷͖ͳਓ

Slide 14

Slide 14 text

"""$Λॻ͘ͷ͕޷͖ͳਓ

Slide 15

Slide 15 text

$֦ுΛॻ͚͹͍͍ 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]

Slide 16

Slide 16 text

$ͷ͕͍͍͜͜

Slide 17

Slide 17 text

$ͷ͕͍͍͜͜ #include 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(;;) {}; } εʔύʔϋΧʔͬΆ͍

Slide 18

Slide 18 text

$ͷ͕͜͜ྑ͘ͳ͍

Slide 19

Slide 19 text

$ͷ͕͜͜ྑ͘ͳ͍ εʔύʔϋΧʔ͗͢Δ #include 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(;;) {}; }

Slide 20

Slide 20 text

ͦ͜Ͱ;JH $͔ΒಟΛൈ͍ͯεʔύʔϋΧʔΈΛ࢒ͨ͠ݴޠ

Slide 21

Slide 21 text

ͦ͜Ͱ;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; }

Slide 22

Slide 22 text

;JHͷ͍͍ͱ͜ΖΛ঺հ

Slide 23

Slide 23 text

;JH͍͍ͱ͜Ζ  ΩϟϥΫλʔ ͔Θ͍͍

Slide 24

Slide 24 text

;JH͍͍ͱ͜Ζ  ΩϟϥΫλʔ ·͍ͩΔ

Slide 25

Slide 25 text

;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 ͳΜͰ$ʹ͸ͳ͍Μͩ

Slide 26

Slide 26 text

;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Λݺ΂ Δ

Slide 27

Slide 27 text

;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ͱ͔͸๷͛ͳ ͍

Slide 28

Slide 28 text

;JH͍͍ͱ͜Ζ  $ίϯύΠϥʹͳΔ w طଘͷ$ HDD ࢿ࢈ʹ;JHίʔυΛॱ͍࣍ࠞͥͯ͘ͷ͕༰қ w 5ZQF4DSJQUͷBMMPX+TΈ͍ͨͳงғؾͰ$Λ࢖͑Δʢ఻ΘΔʁʣ w $3VCZࣗମ΋[JHDDͰίϯύΠϧ͢Δ͜ͱ͸ʜʜͰ͖Δ ~/ruby/build % CC="zig cc" ../configure % make % make install

Slide 29

Slide 29 text

;JH͍͍ͱ͜Ζ  ΩϟϥΫλʔ ·͍ͩΔ

Slide 30

Slide 30 text

࣮ફ;JHͰ(FNΛ࡞Δ w ฒྻͰߴ଎ʹ࠶ؼͰϑΟϘφονΛܭࢉ ͯ͘͠ΕΔ΍ͭΛ࡞ͬͨ w IUUQTHJUIVCDPNPTZPZV[JHSC pC w 3VCZͰ͸(7-͕͋ΔͷͰฒྻʹͳ Βͳ͍ʂ fib(42) fib(41) fib(40) fib(40) fib(39) fib(39) fib(38

Slide 31

Slide 31 text

͜Μͳײ͡ ΅ͪ΅ͪ଎͍ 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ͱ͔͕ඞཁʹͳͬͯ Δͷ͸͝Ѫᇷ

Slide 32

Slide 32 text

$ʹίϯύΠϧ͢Δ ext.zig ext.c ext.so zig build-obj -ofmt=c gcc -fPIC -shared w (FNͷҰ෦ͱͯ͠;JHίʔυΛ ഑෍͢Δ৔߹ɺϢʔβʔ؀ڥʹ ;JHίϯύΠϥ͕ඞཁʹͳΔ w ʜʜͱ͍͏͜ͱʹ͸ͳΒͳͯ͘ɺ ;JHΛࣄલʹ$ʹม׵͓ͯ͘͜͠ ͱ͕Ͱ͖Δ w ͜ΕͳΒHDD͑͋͞Ε͹͍͍ w ΋ͪΖΜ௚઀TPΛ࡞Δ͜ͱ΋Ͱ͖ Δ

Slide 33

Slide 33 text

Ͱ͖ͨ λΠτϧճऩͰ͖ͨʁ w ͜ͷௐࢠͰ3VCZίʔυΛͲΜͲΜ;JHʹͨ͠ΒͲΜͲΜ଎͘ͳΓͦ͏ w ͜ΕͰ*46$0/΋༏উͩʂʂʂ

Slide 34

Slide 34 text

Զ͸଎͍3VCZ͕΄͔ͬͨ͠ͷʹ ͳΜͰ;JH͹͔ͬΓॻ͍ͯΔΜͩʜʜ w ଟ෼ͦ͏͍͏͜ͱ͡Όͳ͍

Slide 35

Slide 35 text

͜͏͍͏࿩Λ͢Δͱग़ͯ͘Δ΍ͭ

Slide 36

Slide 36 text

3VTUͰΑ͘ͳ͍ʁ

Slide 37

Slide 37 text

3VTU࠷ڧ ·͊Θ͔Δ w ͳΜ͔3VTUͷ΄͏͕҆શͩ͠ w ͳΜ͔3VTUͷ΄͏͕։ൃମݧ͕͍͍Β͍͠͠ w ͳΜ͔3VTUͷ΄͏͕೉͍͠͠ w ೉͍͠ͱεʔύʔϋΧʔͬΆ͍͍ͯ͘ w ԶɺϘϩʔνΣοΧʔͷؾ࣋ͪ෼͔͖ͬͯ·ͨ͠Α͆

Slide 38

Slide 38 text

;JHWT3VTU w ҆શੑͰൺ΂ΒΕΔͱɺ 3VTUͷ΄͏͕ѹ౗తʹ͙͢Ε͍ͯ Δ IUUQTYDPNTDIOFDLFSTUFJOTUBUVT

Slide 39

Slide 39 text

VOTBGF\ͦͷ3VTU͸TBGFͰ͔͢ ^ w 3VCZͷ"1*Λݺͼग़ͨ͠ॠؒʹVOTBGFͰ͢Α w VOTBGF\SC@IBTI@OFX ^ w ͦ͏ʜʜ w Զͷॻ͘ίʔυ͕TBGF͡Όͳ͍Θ͚ͳ͍Μ͚ͩͲʜʜ w 4&(7͢Δ·Ͱ͸ಈ͍ͯΔ͚Ͳʜʜ

Slide 40

Slide 40 text

VOTBGF\ͦͷ3VTU͸TBGFͰ͔͢ ^ w 3VCZͷ"1*Λݺͼग़ͨ͠ॠؒʹVOTBGFͰ͢Α w VOTBGF\SC@IBTI@OFX ^ w ͦ͏ʜʜ w Զͷॻ͘ίʔυ͕TBGF͡Όͳ͍Θ͚ͳ͍Μ͚ͩͲʜʜ w 4&(7͢Δ·Ͱ͸ಈ͍ͯΔ͚Ͳʜʜ ൱

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

;JHͷ΄͏͕ڧ͍ͧʂ

Slide 43

Slide 43 text

$Ͱ$֦ுΛ࡞Δ 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

Slide 44

Slide 44 text

·͡Ίͳ࿩ w 3VTUͰ$֦ுΛॻ͘ͷ͸·ͩ·ͩʜʜຊ౰ʹʜʜ͔ͳΓ͠ΜͲ͍ w 3VTUͷμϧ͍ͱ͜Ζ͸͔ͬ͠Γ׆͖ΔҰํ w ͍͍ͱ͜Ζ͸શવڗडͰ͖ͳ͍ w ·͡Ͱ4&(7͠·͘Δɻ4FHNFOUBUJPO'BVMU4FHNFOUBUJPO'BVMU 4FHNFOUBUJPO'BVMU w Ͳ͏ͤͦΜͳײ͡ͳΒ;JHͰؾ࣋ͪΑ͘΍Δํ͕͍͍ͱࢥ͏ͷͰͨ͠ w ϚΫϩ࢖͑Δ͠ w 3VTUͰ΍ͬͯΔͱຊ౰ʹແݶʹϚΫϩ࠶ఆٛ͢Δ͜ͱʹͳΔ

Slide 45

Slide 45 text

3VCZ(FNTʹ;JHͷ࣌୅͸͘Δͷ͔ʁ w ͳΜͱ΋ݴ͑ͳ͍ w ؆୯ʹ;JHͰॻ͚ΔΑ͏ʹͳͬͨΒɺ$֦ு͕΋͏ͪΐͬͱ਎ۙͳଘࡏʹ ͳΔ͔΋ w ΞϓϦέʔγϣϯͷҰ෦ͱͯ͠;JH࢖͏͔ɺతͳੈք؍

Slide 46

Slide 46 text

͜Ε͚֮ͩ͑ͯؼ͍ͬͯͩ͘͞

Slide 47

Slide 47 text

͜Ε͚֮ͩ͑ͯؼ͍ͬͯͩ͘͞