Slide 1

Slide 1 text

Julia の FFI Kenta Murata Speee Inc. 2018-10-20 JuliaTokyo #8

Slide 2

Slide 2 text

Kenta MurataʰJulia ͷ FFIʱJuliaTokyo #8 2018-10-20 self.introduce • Kenta Murata (mrkn) • Working as a researcher at R&D unit in Speee Inc. • As a CRuby committer • Making Ruby available for data analysis tasks • Making sparse tensor support in Apache Arrow • Hobby = Playing with my daughter, Computer Science, Mathematics, Physics, Photograph

Slide 3

Slide 3 text

Kenta MurataʰJulia ͷ FFIʱJuliaTokyo #8 2018-10-20

Slide 4

Slide 4 text

Kenta MurataʰJulia ͷ FFIʱJuliaTokyo #8 2018-10-20 https://twitter.com/speee_pr

Slide 5

Slide 5 text

Kenta MurataʰJulia ͷ FFIʱJuliaTokyo #8 2018-10-20 Topics • Julia の特徴と FFI の重要性 • Julia で利⽤できる FFI の種類 • ccall を使ってみる • PyCall.jl を使ってみる • まとめ • Apache Arrow について宣伝

Slide 6

Slide 6 text

Kenta MurataʰJulia ͷ FFIʱJuliaTokyo #8 2018-10-20 Julia の特徴と
 FFI の重要性

Slide 7

Slide 7 text

Kenta MurataʰJulia ͷ FFIʱJuliaTokyo #8 2018-10-20 Julia の特徴 • C / Fortran のように⾼速 • Ruby のようにダイナミック • ⽂法がまとも • Lisp-like マクロがある • 若くてキラキラしている

Slide 8

Slide 8 text

Kenta MurataʰJulia ͷ FFIʱJuliaTokyo #8 2018-10-20 Julia はまだ若い • Julia 1.0 はスタートラインである • pandas や scikit-learn のように広く利⽤されて成熟した 道具はまだ存在しない • 伸びしろしか無いので楽しい • 現場で今すぐ役⽴たせることは難しい

Slide 9

Slide 9 text

Kenta MurataʰJulia ͷ FFIʱJuliaTokyo #8 2018-10-20 Julia における FFI の重要性 • 既存の成熟したツールを Julia から有効活⽤したい • そのために Julia から他⾔語の機能を呼び出す必要がある • 他⾔語の機能を Julia から呼び出すために FFI が必要

Slide 10

Slide 10 text

Kenta MurataʰJulia ͷ FFIʱJuliaTokyo #8 2018-10-20 Julia で利⽤できる FFI の種類

Slide 11

Slide 11 text

Kenta MurataʰJulia ͷ FFIʱJuliaTokyo #8 2018-10-20 Julia の FFI • C/Fortran: ccall • C++: CxxWrap.jl (Cxx.jl は 1.0 に対応してない) • Python: PyCall.jl • R: RCall.jl • Java: JavaCall.jl • See

Slide 12

Slide 12 text

Kenta MurataʰJulia ͷ FFIʱJuliaTokyo #8 2018-10-20 Julia の FFI • C/Fortran: ccall • C++: Cxx.jl or CxxWrap.jl • Python: PyCall.jl • R: RCall.jl • Java: JavaCall.jl • See コア機能 ライブラリ

Slide 13

Slide 13 text

Kenta MurataʰJulia ͷ FFIʱJuliaTokyo #8 2018-10-20 ccall の使い⽅ • SYNTAX: ccall((func_name, lib), ret_type, (arg_type1, ), arg1, ) ccall(func_ptr, ret_type, (arg_type1, ), arg1, ) • 例: libc の gethostname を呼び出す hostname = Vector{UInt8}(undef, 128)
 ccall((:gethostname, “libc”), Int32,
 (Ptr{UInt8}, Csize_t), hostname, sizeof(hostname)) • ccall はなんとキーワードである!

Slide 14

Slide 14 text

Kenta MurataʰJulia ͷ FFIʱJuliaTokyo #8 2018-10-20 ccall はキーワードである • Julia は⾔語仕様に ccall を含んでいる! • ccall は⼀⾒関数呼び出しに⾒えるが、実は関数呼び出し とは異なる⽅法でコンパイルされる • そもそもトップレベルに ccall 関数は定義されてないし、 ccall という名前の関数も定義できない

Slide 15

Slide 15 text

Kenta MurataʰJulia ͷ FFIʱJuliaTokyo #8 2018-10-20 ccall は FFI の基本 • JavaCall.jl, PyCall.jl, RCall.jl の実態は ccall • ⾔語コアの共有ライブラリを動的ロードして、処理系の C API を使って Julia との間をブリッジしている • それぞれのライブラリは、⾔語間のデータ交換のための 型変換や処理系特有の機能を扱うための API を提供する

Slide 16

Slide 16 text

Kenta MurataʰJulia ͷ FFIʱJuliaTokyo #8 2018-10-20 julia> using JavaCall julia> JavaCall.init(["-Xmx128M"]) julia> jlm = @jimport java.lang.Math JavaObject{:java.lang.Math} (constructor with 2 methods)) julia> jcall(jlm, "sin", jdouble, (jdouble,), pi/2) 1.0 JavaCall.jl from http://juliainterop.github.io/JavaCall.jl/

Slide 17

Slide 17 text

Kenta MurataʰJulia ͷ FFIʱJuliaTokyo #8 2018-10-20 julia> using JavaCall julia> JavaCall.init(["-Xmx128M"]) julia> jlm = @jimport java.lang.Math JavaObject{:java.lang.Math} (constructor with 2 methods)) julia> jcall(jlm, "sin", jdouble, (jdouble,), pi/2) 1.0 julia> jnu = @jimport java.net.URL JavaObject{:java.net.URL} (constructor with 2 methods) julia> gurl = jnu((JString,), "http://www.google.com") JavaObject{:java.net.URL}(Ptr{Void} @0x0000000108ae2aa8) julia> jcall(gurl, "getHost", JString,()) "www.google.com" julia> j_u_arrays = @jimport java.util.Arrays JavaObject{:java.util.Arrays} (constructor with 2 methods) julia> jcall(j_u_arrays, "binarySearch", jint, (Array{jint,1}, jint), [10,20,30,40,50,60], 40) 3 JavaCall.jl from http://juliainterop.github.io/JavaCall.jl/

Slide 18

Slide 18 text

Kenta MurataʰJulia ͷ FFIʱJuliaTokyo #8 2018-10-20 JavaCall.jl の実態は ccall • • libjvm.so を動的ロードして JVM の C API を使って Julia と Java の橋渡しをする • PyCall.jl と RCall.jl もやっていることは同じ

Slide 19

Slide 19 text

Kenta MurataʰJulia ͷ FFIʱJuliaTokyo #8 2018-10-20 実践 ccall

Slide 20

Slide 20 text

Kenta MurataʰJulia ͷ FFIʱJuliaTokyo #8 2018-10-20 /* hello.c */ char const * hello(void) { return "Hello World"; } Demo $ cc -shared -fPIC -o libhello.so hello.c $ julia -q julia> unsafe_string(ccall(("hello", "libhello"), Cstring, ())) "Hello World"

Slide 21

Slide 21 text

Kenta MurataʰJulia ͷ FFIʱJuliaTokyo #8 2018-10-20 Apache Arrow について

Slide 22

Slide 22 text

Kenta MurataʰJulia ͷ FFIʱJuliaTokyo #8 2018-10-20 ݱ࣮͔Β ཧ૝΁ What is
 Apache Arrow?

Slide 23

Slide 23 text

Kenta MurataʰJulia ͷ FFIʱJuliaTokyo #8 2018-10-20 アンケート • Julia を使うことに興味がある⼈ • Julia で使える道具を作ることにも興味がある⼈

Slide 24

Slide 24 text

Kenta MurataʰJulia ͷ FFIʱJuliaTokyo #8 2018-10-20 Apache Arrow 東京ミートアップ 2018 • Apache Arrow の開発者および Apache Arrow を活⽤するとうれしく なりそうなプロダクトの開発者を増やすための集まり • 開発者を増やすための集まり (つまり、ユーザーを増やすための集ま りではない) • Apache Arrow をきっかけに、国内のツール開発者を結束させたい • 開催⽇: 2018年12⽉8⽇ • 会場: Speee Lounge (今⽇と同じ場所) •