SlideShare une entreprise Scribd logo
1  sur  20
Télécharger pour lire hors ligne
ruby-f
についてざっくり解説
ota42y
2017/06/24 Shinjuku.rb #50
自己紹介
ota42y
ヘルスケア系の会社勤務(人募集中)
rubyとかgoとかC++とか
Railsで複合PK、以外といけるのでは?
ruby-f
https://github.com/f /f
rubyでForeign function interfaceを扱うgem
他言語の関数とかをやりとりするインタフェース
内部的にはlibf を使ってる
How to use
Create C library
int calc(int a, int b){
return a* b;
}
gcc -c -fPIC foo.c -o foo.o
gcc -shared -o libfoo.so foo.o
Call C library from Ruby
require 'ffi'
module FooLib
extend FFI::Library
ffi_lib "libfoo.so"
attach_function :calc, [:int, :int], :int
end
puts FooLib.calc(6, 7)
gem i ffi
ruby ffi.rb # => 6*7 = 42
Go
Go build c-shared library so it works.
package main
import "C"
//export calc
func calc(a, b int) int {
return (a + b) * 42
}
func main() {}
go build -buildmode=c-shared -o libfoo.so foo.go
# インタフェース変えてないのでそのままで動く
ruby ffi # => ((6+7)*42) = 546
Why we need FFI?
Cで高速化
既存資産の再利用
例
natto は mecab.so のためにFFI使ってる
https://github.com/buruzaemon/natto
# Lattice interface
attach_function :mecab_lattice_destroy, [:pointer], :void
attach_function :mecab_lattice_clear, [:pointer], :void
attach_function :mecab_lattice_is_available, [:pointer], :int
Why we need FFI?
Cで高速化
既存資産の再利用
例
spring-watcher-listen の依存関係にあるrb-inotify が
inotify のために使ってるので、
Rails開発だと知らずのうちに使ってる
https://github.com/guard/rb-inotify
https://github.com/guard/rb-
inotify/blob/master/lib/rb-inotify/native.rb#L9
f 良い
C拡張書かなくて良いところとか
more detail
How ruby-f call libf
内部的にはlibf を利用し、
ruby-f はruby~cの橋渡しをしてる。
libf の使い方
#include <stdio.h>
#include <ffi.h>
#include <dlfcn.h>
int main()
{
ffi_cif cif;
ffi_type *args[2];
void *values[2];
ffi_arg rc;
char *libname = "libfoo.so";
void* handle;
void* address;
int a = 6;
int b = 7;
handle = dlopen(libname, 1);
address = dlsym(handle, "calc");
args[0] = &ffi_type_sint32;
args[1] = &ffi_type_sint32;
values[0] = &a;
values[1] = &b;
ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_sint32, args)
ffi_call(&cif, address, &rc, values);
printf("result: %dn", (int)rc);
return 0;
}
# 手元の環境によって違う。ちゃんとしてればlibffiの指定は不要
gcc -I /usr/local/opt/libffi/lib/libffi-3.0.13/include/ useffi.c
./a.out
libfoo.soの関数の実行手順
dlopen でlibfoo.soを開く
dlsym で関数のポインタ取得(const_getみたいなの)
ffi_prep_cif で実行に必要な情報(cif)をセット
ffi_call にcifと関数ポインタを渡すと
良い感じに呼び出してくれる
rubyにC拡張があるので、この手順を再現してるだけ
(FFIでC拡張を書かなくてすむが、FFI自体はC拡張を
使わなければいけないジレンマ…)
rubyのf
require 'ffi'
module FooLib
extend FFI::Library
ffi_lib "libfoo.so"
attach_function :calc, [:int, :int], :int
end
puts FooLib.calc(6, 7)
関係するのは以下の三つ
f _libメソッド
attach_functionメソッド
実際の関数呼びだし(FooLib.calc)
f _libメソッド
dlopen関数でlibfoo.soを開く
読んだ.soファイルは変数に保存
https://github.com/f /f /blob/ed67c2852e8854e
bdfa2482d4fb4c2edf3da21a0/lib/f /library.rb#L9
6
https://github.com/f /f /blob/f19254bb9ad24f9a
668acd04b9cfab5e3797a05b/ext/f _c/DynamicLi
brary.c#L114
attach_function
dlsym関数で呼び出す関数のポインタを取得
https://github.com/f /f /blob/ed67c2852e885
4ebdfa2482d4fb4c2edf3da21a0/lib/f /library.r
b#L236
nd_function≒library_dlsym →dlsym
https://github.com/f /f /blob/f19254bb9ad24f
9a668acd04b9cfab5e3797a05b/ext/f _c/Dyna
micLibrary.c#L153
attach_function
取得したポインタや引数の情報を
FFI::Functionオブジェクトにして保存
この過程でcifも設定している
https://github.com/f /f /blob/c52ceb17328807
3a321a94b401243ff40110d910/ext/f _c/Funct
ionInfo.c#L192
FFI::Function.callを呼び出すメソッドをeval
https://github.com/f /f /blob/d942f7c10bf283
bf313c2df3775c71996925b145/lib/f /variadic
.rb#L62
関数呼びだし
対応するFFI::Functionのcallメソッドで、
保存された関数の情報を元にlibf を使っている。
呼び出しに必要なcifと関数ポインタは
FFI::Functionの初期化時に用意してある
なので呼び出すだけ
(一応スレッド対応とかの事前準備もやってる)
https://github.com/f /f /blob/c52ceb17328807
3a321a94b401243ff40110d910/ext/f _c/Call.c
#L430
まとめ
ruby-f のやってること
f _libメソッド(.soファイルを開く)
attach_functionメソッド(関数の呼び出し準備)
関数呼びだし
attach_function時に用意した情報と引数とを
組み合わせてf _call呼ぶ
やってることは簡単∩(・ω・)∩
(実際はruby→cの受け渡しで色々な処理がある)

Contenu connexe

Tendances

Tendances (20)

Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
TLS, HTTP/2演習
TLS, HTTP/2演習TLS, HTTP/2演習
TLS, HTTP/2演習
 
Redmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみたRedmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみた
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
 
InnoDBのすゝめ(仮)
InnoDBのすゝめ(仮)InnoDBのすゝめ(仮)
InnoDBのすゝめ(仮)
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
 
KeycloakでAPI認可に入門する
KeycloakでAPI認可に入門するKeycloakでAPI認可に入門する
KeycloakでAPI認可に入門する
 
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
 
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
 

Similaire à ruby-ffiについてざっくり解説

Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~
Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~
Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~
genroku
 
VC6によるRuby拡張ライブラリ開発環境について
VC6によるRuby拡張ライブラリ開発環境についてVC6によるRuby拡張ライブラリ開発環境について
VC6によるRuby拡張ライブラリ開発環境について
goritto
 

Similaire à ruby-ffiについてざっくり解説 (20)

ffi for rubyists
ffi for rubyistsffi for rubyists
ffi for rubyists
 
20111029 rubyon php
20111029 rubyon php20111029 rubyon php
20111029 rubyon php
 
Swiftによる関数型プログラミング超入門
Swiftによる関数型プログラミング超入門Swiftによる関数型プログラミング超入門
Swiftによる関数型プログラミング超入門
 
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話
 
Wantedly - 世界一"いいね!"される 求人サイトの作り方
Wantedly - 世界一"いいね!"される 求人サイトの作り方Wantedly - 世界一"いいね!"される 求人サイトの作り方
Wantedly - 世界一"いいね!"される 求人サイトの作り方
 
Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~
Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~
Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~
 
try!swift必見5選
try!swift必見5選try!swift必見5選
try!swift必見5選
 
KotlinConf 2018 から見る 最近の Kotlin サーバーサイド事情
KotlinConf 2018 から見る 最近の Kotlin サーバーサイド事情KotlinConf 2018 から見る 最近の Kotlin サーバーサイド事情
KotlinConf 2018 から見る 最近の Kotlin サーバーサイド事情
 
Botkit4.x Has Come!
Botkit4.x Has Come!Botkit4.x Has Come!
Botkit4.x Has Come!
 
Webフレームワークを作ってる話 #osakapy
Webフレームワークを作ってる話 #osakapyWebフレームワークを作ってる話 #osakapy
Webフレームワークを作ってる話 #osakapy
 
oFの話題が殆ど出ない oF jp Summer Workout
oFの話題が殆ど出ない oF jp Summer WorkoutoFの話題が殆ど出ない oF jp Summer Workout
oFの話題が殆ど出ない oF jp Summer Workout
 
LibreOfficeをWindows上でビルドする
LibreOfficeをWindows上でビルドするLibreOfficeをWindows上でビルドする
LibreOfficeをWindows上でビルドする
 
LibreOffice を Windows 上でビルドする UPDATE
LibreOffice を Windows 上でビルドする UPDATELibreOffice を Windows 上でビルドする UPDATE
LibreOffice を Windows 上でビルドする UPDATE
 
SmalltalkBoltでUFFI入門
SmalltalkBoltでUFFI入門SmalltalkBoltでUFFI入門
SmalltalkBoltでUFFI入門
 
hubotで快適BOT生活
hubotで快適BOT生活 hubotで快適BOT生活
hubotで快適BOT生活
 
Swift を振り返ってみよう #cswift
Swift を振り返ってみよう #cswiftSwift を振り返ってみよう #cswift
Swift を振り返ってみよう #cswift
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
 
VC6によるRuby拡張ライブラリ開発環境について
VC6によるRuby拡張ライブラリ開発環境についてVC6によるRuby拡張ライブラリ開発環境について
VC6によるRuby拡張ライブラリ開発環境について
 
LL言語でもHudsonを使おう!
LL言語でもHudsonを使おう!LL言語でもHudsonを使おう!
LL言語でもHudsonを使おう!
 
Myfirst buildpack session_mgmt_20161201
Myfirst buildpack session_mgmt_20161201Myfirst buildpack session_mgmt_20161201
Myfirst buildpack session_mgmt_20161201
 

Plus de ota42y

CarrieWaveについてざっくり解説
CarrieWaveについてざっくり解説CarrieWaveについてざっくり解説
CarrieWaveについてざっくり解説
ota42y
 

Plus de ota42y (13)

なぜか技術書典5で 3サークルの運営を同時にやった話
なぜか技術書典5で 3サークルの運営を同時にやった話なぜか技術書典5で 3サークルの運営を同時にやった話
なぜか技術書典5で 3サークルの運営を同時にやった話
 
なぜか技術書典5で 3サークルの運営をやってた話
なぜか技術書典5で 3サークルの運営をやってた話なぜか技術書典5で 3サークルの運営をやってた話
なぜか技術書典5で 3サークルの運営をやってた話
 
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦いマイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦い
 
Rails上でのpub/sub イベントハンドラの扱い
Rails上でのpub/sub イベントハンドラの扱いRails上でのpub/sub イベントハンドラの扱い
Rails上でのpub/sub イベントハンドラの扱い
 
goroutineはどうやって動いているのか
goroutineはどうやって動いているのかgoroutineはどうやって動いているのか
goroutineはどうやって動いているのか
 
bootsnapはどれくらい早くなるのか
bootsnapはどれくらい早くなるのかbootsnapはどれくらい早くなるのか
bootsnapはどれくらい早くなるのか
 
Microservices Architecture の利点と欠点
Microservices Architecture の利点と欠点Microservices Architecture の利点と欠点
Microservices Architecture の利点と欠点
 
マイクロサービスにおける 非同期アーキテクチャ
マイクロサービスにおける非同期アーキテクチャマイクロサービスにおける非同期アーキテクチャ
マイクロサービスにおける 非同期アーキテクチャ
 
FiNCでのOSSとのつきあい方
FiNCでのOSSとのつきあい方FiNCでのOSSとのつきあい方
FiNCでのOSSとのつきあい方
 
CarrieWaveについてざっくり解説
CarrieWaveについてざっくり解説CarrieWaveについてざっくり解説
CarrieWaveについてざっくり解説
 
prmdのドキュメントが読みやすくなる話
prmdのドキュメントが読みやすくなる話prmdのドキュメントが読みやすくなる話
prmdのドキュメントが読みやすくなる話
 
身近なサイバー攻撃から身を守る
身近なサイバー攻撃から身を守る身近なサイバー攻撃から身を守る
身近なサイバー攻撃から身を守る
 
HCI分野の紹介と最新研究
HCI分野の紹介と最新研究HCI分野の紹介と最新研究
HCI分野の紹介と最新研究
 

ruby-ffiについてざっくり解説