Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Julia の FFI

Julia の FFI

Introducing Julia's FFI features.

Kenta Murata

October 20, 2018
Tweet

More Decks by Kenta Murata

Other Decks in Technology

Transcript

  1. 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
  2. Kenta MurataʰJulia ͷ FFIʱJuliaTokyo #8 2018-10-20 Topics • Julia の特徴と

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

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

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

    • 既存の成熟したツールを Julia から有効活⽤したい • そのために Julia から他⾔語の機能を呼び出す必要がある • 他⾔語の機能を Julia から呼び出すために FFI が必要
  6. 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 <https://github.com/JuliaInterop>
  7. 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 <https://github.com/JuliaInterop> コア機能 ライブラリ
  8. 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 はなんとキーワードである!
  9. Kenta MurataʰJulia ͷ FFIʱJuliaTokyo #8 2018-10-20 ccall はキーワードである • Julia

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

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

    <https://github.com/JuliaInterop/JavaCall.jl/blob/ master/src/jvm.jl#L229-L241> • libjvm.so を動的ロードして JVM の C API を使って Julia と Java の橋渡しをする • PyCall.jl と RCall.jl もやっていることは同じ
  14. 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"
  15. Kenta MurataʰJulia ͷ FFIʱJuliaTokyo #8 2018-10-20 Apache Arrow 東京ミートアップ 2018

    • Apache Arrow の開発者および Apache Arrow を活⽤するとうれしく なりそうなプロダクトの開発者を増やすための集まり • 開発者を増やすための集まり (つまり、ユーザーを増やすための集ま りではない) • Apache Arrow をきっかけに、国内のツール開発者を結束させたい • 開催⽇: 2018年12⽉8⽇ • 会場: Speee Lounge (今⽇と同じ場所) • <https://speee.connpass.com/event/103514/>