Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Ruby bindings 2016
How to create bindings 2016
Ko...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Acknowledgment
感謝
@SoManyHs and @drbrain
They fix...
Silver sponsorSilver sponsor
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Goal
目標
You become
a new bindings developer
あなたが新...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Bindings?
バインディングとは
Glue of (mainly) C and Ruby
主...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Bindings
バインディング
C
Bindings
Ruby require "socket"...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Why should I learn?
なんでバインディング開発者になるの?
To use Rub...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Incr. bindings developer
バインディング開発者が増えるといいな
Why d...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Summary
概要
Ext★ SWIG FFI GI☆
Base
Tech
Ext Ext li...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Demo
デモ
Make powerful
auto generated
bindings
自動生...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
What is ext?
拡張ライブラリーってなに?
Ext★ SWIG FFI GI☆
Base...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Extension library
拡張ライブラリーとは
Ruby library written...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Ext lib and bindings
拡張ライブラリーとバインディング
Extension l...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
What is libffi?
libffiってなに?
Ext★ SWIG FFI GI☆
Bas...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
libffi and FFI: 1
libffiとFFIとは:1
libffi: Library ...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
libffi and FFI: 2
libffiとFFIとは:2
Ruby FFI
Library...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
libffi and bindings
libffiとバインディング
C
Ruby
attach_...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Impl. language
実装言語
Ext★ SWIG FFI GI☆
Base
Tech
E...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Ext impl. by
拡張ライブラリーの実装方法
Ext★ SWIG FFI GI☆
Base...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Ext impl. by: Target
拡張ライブラリーの実装方法:対象
/* hello.h ...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Ext impl. by hand
手動での拡張ライブラリーの実装
libhello RubyBi...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Ext impl. by hand
手動での拡張ライブラリーの実装
https://github....
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Ext impl. by generation
自動生成での拡張ライブラリーの実装
libhell...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Ext impl. by generation
自動生成での拡張ライブラリーの実装
SWIG ca...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Ext impl. by SWIG
SWIGでの拡張ライブラリーの実装
// swig -ruby...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Use ext by SWIG
SWIGで作った拡張ライブラリーを使う
irb(main):001...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
By SWIG again
SWIGでもう一度
%module hello
%{#include ...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Use again
もう一度使う
irb(main):001:0> require "hello"...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Wrap up1: Ext
まとめ1:拡張ライブラリー
By hand: Needs more w...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Wrap up2: Ext
まとめ2:拡張ライブラリー
On maintenance
e.g.: ...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
libffi impl. by
libffiベースでの実装方法
Ext★ SWIG FFI GI☆...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
libffi impl. by hand
手動でのlibffiベースの実装
libhello Ru...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
libffi impl. by hand
手動でのlibffiベースの実装
require "ff...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Use libffi impl. by hand
手動でのlibffiベースの実装を使う
irb(...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Wrap FFI impl. 1
FFIでの実装をラップ1
class Hello
def ini...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Wrap FFI impl. 2
FFIでの実装をラップ2
class Hello
def mes...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Use wrapped impl.
ラップした実装を使う
irb(main):001:0> req...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
libffi impl. by gen.
自動生成でのlibffiベースの実装
libghello...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
libffi impl. by gen.
自動生成でのlibffiベースの実装
require "...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Use libffi impl. by gen.
自動生成でのlibffiベースの実装を使う
ir...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Wrap up1: libffi
まとめ1:libffi
By hand: Needs more ...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Wrap up2: libffi
まとめ2:libffi
On maintenance
e.g.:...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Impl. by generation
生成ベースでの実装方法
Ext★ SWIG FFI GI☆...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
SWIG⇔GI: When
SWIG⇔GI:生成タイミング
When are bindings g...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
SWIG⇔GI: Maintenance
SWIG⇔GI:メンテナンス
SWIG: Maintai...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
SWIG: Overview (reprise)
SWIG:概要(再掲)
libhello Rub...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
SWIG: Maintenance
SWIG:メンテナンス
libhello RubyBindin...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
GI: Overview (reprise)
GI:概要(再掲)
libghello RubyBi...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
GI: Maintenance
GI:メンテナンス
RubyBindings
Generated ...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Wrap up1
まとめ1
Bindings: Glue of C and Ruby
バインディン...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Wrap up2
まとめ2
Bindings increase cases that
Ruby c...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Wrap up3
まとめ3
Recommend GI based bindings
GIベースのバ...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Wrap up4
まとめ4
Let's become a
bindings
developer!
...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Advertisement
宣伝
OSS Gate
Helps people who want t...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Wrap up (reprise)
まとめ(再掲)
Let's become a
bindings...
Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0
Things not covered
話さなかったこと
Bindings are difficul...
Upcoming SlideShare
Loading in …5
×

How to create bindings 2016

264 views

Published on

This talk describes how to create Ruby bindings of a C library. It's the latest information in 2016.

  • Be the first to comment

How to create bindings 2016

  1. 1. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Ruby bindings 2016 How to create bindings 2016 Kouhei Sutou ClearCode Inc. RubyKaigi 2016 2016-09-09
  2. 2. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Acknowledgment 感謝 @SoManyHs and @drbrain They fixed English in this slide @RubyKaigi 2016 Official Party 昨日のパーティーで英語をチェックしてくれた!ありがとう!
  3. 3. Silver sponsorSilver sponsor
  4. 4. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Goal 目標 You become a new bindings developer あなたが新しくバインディング開発者になること
  5. 5. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Bindings? バインディングとは Glue of (mainly) C and Ruby 主にCとRubyをつなぐもの You can use features implemented in C from Ruby Cで実装された機能をRubyから使える ✓ e.g.: Socket, OpenSSL, YAML, ... 例:ソケット、OpenSSL、YAML… ✓ ✓
  6. 6. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Bindings バインディング C Bindings Ruby require "socket" socket(2) Can use socket! Bindings require "socket" socket(2) Can't use... Error
  7. 7. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Why should I learn? なんでバインディング開発者になるの? To use Ruby in more cases Rubyをもっといろんな場面で使うため e.g.: Machine leaning, multimedia, full text search, cipher and so on 例:機械学習、画像・動画・音声処理、全文検索、暗号 ✓ ✓ Can use existing features in Ruby through bindings バインディングがあると既存のいい機能をRubyで使える ✓
  8. 8. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Incr. bindings developer バインディング開発者が増えるといいな Why do I become a bindings developer? バインディング開発者になりませんか? To expand use cases of Ruby! Rubyを使えるケースを増やすために! ✓ Not just a user for provided features 提供された機能を使う1ユーザーではなく ✓ ✓
  9. 9. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Summary 概要 Ext★ SWIG FFI GI☆ Base Tech Ext Ext lib ffi lib ffi Impl. by Hand Gene- rate Hand Gene- rate ★ Extension library(拡張ライブラリー) ☆ GObject Introspection: Recommended(オススメ)
  10. 10. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Demo デモ Make powerful auto generated bindings 自動生成されたバインディングがいかに強力か
  11. 11. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 What is ext? 拡張ライブラリーってなに? Ext★ SWIG FFI GI☆ Base Tech Ext Ext lib ffi lib ffi Impl. by Hand Gene- rate Hand Gene- rate ★ Extension library(拡張ライブラリー) ☆ GObject Introspection: Recommended(オススメ)
  12. 12. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Extension library 拡張ライブラリーとは Ruby library written in C Cで書かれたRuby用ライブラリー ✓ Most bindings are ext lib 多くのバインディングは拡張ライブラリーとして実装 openssl is ext lib and bindings oepnsslは拡張ライブラリーでバインディング ✓ Exc.: stringio is ext lib but... 例外:stringioは拡張ライブラリーだが… ✓ ✓
  13. 13. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Ext lib and bindings 拡張ライブラリーとバインディング Extension library Bindings stringioopenssl
  14. 14. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 What is libffi? libffiってなに? Ext★ SWIG FFI GI☆ Base Tech Ext Ext lib ffi lib ffi Impl. by Hand Gene- rate Hand Gene- rate ★ Extension library(拡張ライブラリー) ☆ GObject Introspection: Recommended(オススメ)
  15. 15. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 libffi and FFI: 1 libffiとFFIとは:1 libffi: Library to impl. FFI FFIを実現するためのライブラリー ✓ Foreign Function Interface Generally: All APIs to impl. bindings 一般的にはバインディングを実装するためのすべての API ✓ Ruby doesn't use "FFI" term Rubyでは「FFI」という単語を使わない ✓ ✓
  16. 16. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 libffi and FFI: 2 libffiとFFIとは:2 Ruby FFI Library based on libffi libffiを使ったライブラリー ✓ Provides Ruby API to implement bindings バインディングを実装するためのRubyのAPIを提供 ✓ ✓
  17. 17. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 libffi and bindings libffiとバインディング C Ruby attach_function :rand, [], :int rand(3) libffi libffi based Ruby API Bindings
  18. 18. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Impl. language 実装言語 Ext★ SWIG FFI GI☆ Base Tech Ext Ext lib ffi lib ffi Impl. lang C C+α Ruby Ruby ★ Extension library(拡張ライブラリー) ☆ GObject Introspection: Recommended(オススメ)
  19. 19. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Ext impl. by 拡張ライブラリーの実装方法 Ext★ SWIG FFI GI☆ Base Tech Ext Ext lib ffi lib ffi Impl. by Hand Gener ate Hand Gene- rate ★ Extension library(拡張ライブラリー) ☆ GObject Introspection: Recommended(オススメ)
  20. 20. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Ext impl. by: Target 拡張ライブラリーの実装方法:対象 /* hello.h */ #pragma once typedef struct hello_t Hello; Hello *hello_new (void); void hello_free (Hello *hello); const char *hello_message(Hello *hello);
  21. 21. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Ext impl. by hand 手動での拡張ライブラリーの実装 libhello RubyBindings Implemented in C by hand Use C API provided by Ruby
  22. 22. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Ext impl. by hand 手動での拡張ライブラリーの実装 https://github.com/kou/rabbit-slide-kou-rubykaigi-2016/ blob/master/c-api/bindings/hello.c #include <ruby.h> #include <hello.h> static void rb_hello_free(void *data) { Hello *hello = data; hello_free(hello); } static const rb_data_type_t rb_hello_type = { "Hello", { NULL, rb_hello_free, NULL, }, NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY, }; static VALUE rb_hello_alloc(VALUE klass) { return TypedData_Wrap_Struct(klass, &rb_hello_type, NULL); } static VALUE rb_hello_initialize(VALUE self) { Hello *hello; hello = hello_new(); DATA_PTR(self) = hello; return Qnil; } static VALUE rb_hello_message(VALUE self) { Hello *hello; const char *message; TypedData_Get_Struct(self, Hello, &rb_hello_type, hello); message = hello_message(hello); return rb_str_new_cstr(message); } void Init_hello(void) { VALUE hello; hello = rb_define_class("Hello", rb_cData); rb_define_alloc_func(hello, rb_hello_alloc); rb_define_method(hello, "initialize", rb_hello_initialize, 0); rb_define_method(hello, "message", rb_hello_message, 0); }
  23. 23. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Ext impl. by generation 自動生成での拡張ライブラリーの実装 libhello RubyBindings Generated by SWIG Use C API provided by Ruby hello.i SWIG
  24. 24. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Ext impl. by generation 自動生成での拡張ライブラリーの実装 SWIG can generate impl. Simplified Wrapper and Interface Generator SWIGで実装を生成できる ✓ A user TensorFlow: A library for machine intelligence TensorFlow:機械知能のライブラリー Used to generate Python bindings Pythonバインディングを生成するために使用 ✓ ✓
  25. 25. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Ext impl. by SWIG SWIGでの拡張ライブラリーの実装 // swig -ruby hello.i -> hello_wrap.c %module hello %{ #include <hello.h> %} %include <hello.h>
  26. 26. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Use ext by SWIG SWIGで作った拡張ライブラリーを使う irb(main):001:0> require "hello" => true irb(main):002:0> hello = Hello.hello_new => #<SWIG::TYPE_p_hello_t:0x000...> irb(main):003:0> Hello.hello_message(hello) => "Hello" irb(main):004:0> Hello.hello_free(hello) => nil # Raw C API... :<
  27. 27. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 By SWIG again SWIGでもう一度 %module hello %{#include <hello.h>%} typedef struct hello_t { %extend { hello_t() {return hello_new();} ~hello_t() {hello_free($self);} const char *message() {return hello_message($self);} } } Hello;
  28. 28. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Use again もう一度使う irb(main):001:0> require "hello" => true irb(main):002:0> hello = Hello::Hello.new => #<Hello::Hello:0x000...> irb(main):003:0> hello.message => "Hello" # Object oriented API!
  29. 29. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Wrap up1: Ext まとめ1:拡張ライブラリー By hand: Needs more work 手動:たくさん書かないといけない ✓ By generation: Less work 生成:書くことが少ない Needs more work for easy use 使いやすいAPIにするにはたくさん書かないといけない ✓ ✓
  30. 30. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Wrap up2: Ext まとめ2:拡張ライブラリー On maintenance e.g.: New functions, enums メンテナンス時:(例:新しい関数・列挙値が追加され た) By hand: Needs more work 手動:追加作業あり ✓ By generation: No more work (But the bindings may not be easy to use) 生成:(使いやすくないけど)追加作業なし This is a large benefit! これは大きな利点! ✓ ✓
  31. 31. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 libffi impl. by libffiベースでの実装方法 Ext★ SWIG FFI GI☆ Base Tech Ext Ext lib ffi lib ffi Impl. by Hand Gene- rate Hand Gener ate ★ Extension library(拡張ライブラリー) ☆ GObject Introspection: Recommended(オススメ)
  32. 32. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 libffi impl. by hand 手動でのlibffiベースの実装 libhello RubyBindings Implemented in Ruby by hand Use Ruby API provided by Ruby FFI
  33. 33. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 libffi impl. by hand 手動でのlibffiベースの実装 require "ffi" module LibHello extend FFI::Library ffi_lib "../../libhello/lib/libhello.so" attach_function :hello_new, [], :pointer attach_function :hello_message, [:pointer], :string attach_function :hello_free, [:pointer], :void end
  34. 34. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Use libffi impl. by hand 手動でのlibffiベースの実装を使う irb(main):001:0> require "hello" => true irb(main):002:0> hello = LibHello.hello_new => #<FFI::Pointer address=0x00000002b07ef0> irb(main):003:0> LibHello.hello_message(hello) => "Hello" irb(main):004:0> LibHello.hello_free(hello) => nil # Raw C API... :<
  35. 35. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Wrap FFI impl. 1 FFIでの実装をラップ1 class Hello def initialize hello = LibHello.hello_new hello_free = LibHello.method(:hello_free) @hello = FFI::AutoPointer.new(hello, hello_free) end end
  36. 36. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Wrap FFI impl. 2 FFIでの実装をラップ2 class Hello def message LibHello.hello_message(@hello) end end
  37. 37. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Use wrapped impl. ラップした実装を使う irb(main):001:0> require "hello" => true irb(main):002:0> hello = Hello.new => #<Hello:0x000...> irb(main):003:0> hello.message => "Hello" # Object oriented API!
  38. 38. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 libffi impl. by gen. 自動生成でのlibffiベースの実装 libghello RubyBindings Generated by gi(*) gem at runtime Hello.typelib Annotation g-ir-compiler gi gem (*) gi = gobject-introspection GObject wrapper libhello gi
  39. 39. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 libffi impl. by gen. 自動生成でのlibffiベースの実装 require "gi" Hello = GI.load("Hello")
  40. 40. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Use libffi impl. by gen. 自動生成でのlibffiベースの実装を使う irb(main):001:0> require "hello" => true irb(main):002:0> hello = Hello::Hello.new => #<Hello::Hello:0x2a9de98 ptr=0x2ecd540> irb(main):003:0> hello.message => "Hello" # Object oriented API!
  41. 41. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Wrap up1: libffi まとめ1:libffi By hand: Needs more work 手動:たくさん書かないといけない Needs more work for easy use 使いやすいAPIにするにはさらに書かないといけない ✓ ✓ By generation: Less work 生成:書くことが少ない No more work for easy use しかも使いやすいAPIになる ✓ ✓
  42. 42. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Wrap up2: libffi まとめ2:libffi On maintenance e.g.: New functions, enums メンテナンス時:(例:新しい関数・列挙値が追加され た) By hand: Needs more work 手動:追加作業あり ✓ By generation: No more work 生成:追加作業なし This is a large benefit! これは大きな利点! ✓ ✓
  43. 43. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Impl. by generation 生成ベースでの実装方法 Ext★ SWIG FFI GI☆ Base Tech Ext Ext lib ffi lib ffi Impl. by Hand Gener ate Hand Gener ate ★ Extension library(拡張ライブラリー) ☆ GObject Introspection: Recommended(オススメ)
  44. 44. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 SWIG⇔GI: When SWIG⇔GI:生成タイミング When are bindings generated? バインディングの生成タイミング On build⇔Runtime ビルド時⇔実行時 ✓ SWIG: Need to build for new ver. 新しいバージョンがでたらリビルドが必要 ✓ GI: No more work for new ver. 新しいバージョンがでても追加作業なし ✓ ✓
  45. 45. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 SWIG⇔GI: Maintenance SWIG⇔GI:メンテナンス SWIG: Maintain .i file for each language binding 各言語バインディング用に.iファイルをメンテナンス ✓ GI: Maintain annotations for all language bindings 全言語バインディング用にアノテーションをメンテナンス We can work together with other language binding maintainers ✓ ✓
  46. 46. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 SWIG: Overview (reprise) SWIG:概要(再掲) libhello RubyBindings Generated by SWIG Use C API provided by Ruby hello.i SWIG
  47. 47. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 SWIG: Maintenance SWIG:メンテナンス libhello RubyBindings Generated by SWIG Use C API provided by Ruby SWIG hello.i Ruby binding maintainers maintain
  48. 48. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 GI: Overview (reprise) GI:概要(再掲) libghello RubyBindings Generated by gi(*) gem at runtime Hello.typelib Annotation g-ir-compiler gi gem (*) gi = gobject-introspection GObject wrapper libhello gi
  49. 49. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 GI: Maintenance GI:メンテナンス RubyBindings Generated by gi(*) gem at runtime Hello.typelibg-ir-compiler gi gem (*) gi = gobject-introspection libhello gi libghello Annotation GObject wrapper We can maintain with library maintainers and other language binding maintainers
  50. 50. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Wrap up1 まとめ1 Bindings: Glue of C and Ruby バインディング:主にCとRubyをつなぐもの You can use features implemented in C from Ruby Cで実装された機能をRubyから使える ✓ ✓
  51. 51. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Wrap up2 まとめ2 Bindings increase cases that Ruby can be used バインディングはRubyを使えるケースを増やす Because they provide existing good features to Ruby バインディングは既存のよい機能をRubyで使えるように するから ✓ ✓
  52. 52. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Wrap up3 まとめ3 Recommend GI based bindings GIベースのバインディングがオススメ For easy maintenance メンテンナンスしやすいから ✓ For easy to use API 使いやすいAPIになるから ✓ ✓ GI: GObject Introspection
  53. 53. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Wrap up4 まとめ4 Let's become a bindings developer! バインディング開発者になろう!
  54. 54. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Advertisement 宣伝 OSS Gate Helps people who want to be an OSS developer (but not yet) OSS開発者になりたいけど一歩踏み出せていない人を支 援 ✓ ✓ ClearCode booth(クリアコードブース) You can discus about OSS Gate and more technical details OSS Gateやもっと技術的な話や雑談をできる ✓ ✓
  55. 55. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Wrap up (reprise) まとめ(再掲) Let's become a bindings developer! バインディング開発者になろう!
  56. 56. Ruby bindings 2016 - How to create bindings 2016 Powered by Rabbit 2.2.0 Things not covered 話さなかったこと Bindings are difficult to install on Win. Any idea? Windowsでインストールが大変。どうすれば? ✓ Performance・Annotation 性能・アノテーション ✓ Details of each binding's create method それぞれのバインディング作成方法の詳細 ✓

×