![6449ti9.gif 6449ti9.gif](https://i.hizliresim.com/6449ti9.gif)
![pDHFoUY.png pDHFoUY.png](https://i.imgur.com/pDHFoUY.png)
Merhabalar, ben Bunjo. Bu konuda FFI (Foreign Function Interface) kütüphanesini temel olarak anlatacağım.
![pDHFoUY.png pDHFoUY.png](https://i.imgur.com/pDHFoUY.png)
Ruby Foreign Function Interface Nedir?
Ruby FFI (Foreign Function Interface), Ruby programlarından C ve C++ gibi diğer dillerde yazılmış kütüphanelere kolayca erişim sağlamak için kullanılan bir kütüphanedir. FFI, Ruby kodu ile yerel (native) kütüphaneler arasında köprü görevi görerek, Ruby kodunun doğrudan bu kütüphaneleri içinde çağırmasına olanak tanır.
![pDHFoUY.png pDHFoUY.png](https://i.imgur.com/pDHFoUY.png)
C Kütüphanesini Yazma
C:
// libexample.c
#include <stdio.h>
void hello_world() {
printf("Hello, world!\n");
}
int add(int a, int b) {
return a + b;
}
Örnek olarak, ekrana yazı yazan ve iki sayıyı toplayan bir C kodumuz olsun.
Linux için
Kütüphaneyi derlemek için Makefile dosyayı oluşturunuz
Linux için
Kütüphaneyi derlemek için Makefile dosyayı oluşturunuz
Makefile:
# Makefile
libexample.so: libexample.c
gcc -shared -o libexample.so -fPIC libexample.c
Daha sonrasında "make" komutu ile derleme işlemini yapabilirsiniz.
Windows için
Not: Bu kütüphane Windows sistemlerde çalışmayabilir.
GCC derleyicisini indirip, parh değişkenlerini ayarladıktan sonra
Komutu ile derleme işlemini yapabilirsiniz.
Bu komutlar sonucunda, libexample.so adında paylaşımlı bir kütüphane oluşturacaktır.
.dll olarakta kullanabilirsiniz.
Windows için
Not: Bu kütüphane Windows sistemlerde çalışmayabilir.
GCC derleyicisini indirip, parh değişkenlerini ayarladıktan sonra
Rich (BB code):
gcc -shared -o libexample.so -fPIC libexample.c
Komutu ile derleme işlemini yapabilirsiniz.
Bu komutlar sonucunda, libexample.so adında paylaşımlı bir kütüphane oluşturacaktır.
.dll olarakta kullanabilirsiniz.
Ruby FFI ile Etkileşim
Yazdığımız C kodu ile etkileşime geçen basit bir kod yazalım
Ruby:
require 'ffi'
module Example
extend FFI::Library
ffi_lib './libexample.so' # Dosya yolu
attach_function :hello_world, [], :void
attach_function :add, [:int, :int], :int
end
# Kullanım
Example.hello_world
puts Example.add(5, 3)
Kod Açıklaması
FFI Modülü Yükleme ve Kullanma
FFI Modülü Yükleme ve Kullanma
Ruby:
require 'ffi'
Modül Tanımlama ve Kütüphane Bağlama
Ruby:
module Example
extend FFI::Library
ffi_lib './libexample.so'
Example adında bir modül tanımlayıp, FFI::Library modülünü genişletiyoruz. Ardından, ffi_lib ile C kütüphanesini bağlıyoruz.
Fonksiyonları Bağlama
Ruby:
attach_function :hello_world, [], :void
attach_function :add, [:int, :int], :int
Fonksiyonları Kullanma
Ruby:
Example.hello_world
puts Example.add(5, 3)
![pDHFoUY.png pDHFoUY.png](https://i.imgur.com/pDHFoUY.png)
FFI ile Point
C:
// point.c Dosyası
struct Point {
int x;
int y;
};
struct Point create_point(int x, int y) {
struct Point p;
p.x = x;
p.y = y;
return p;
}
Kod Açıklaması
struct Point Tanımı
struct Point Tanımı
C:
struct Point {
int x;
int y;
};
Bu kısımda Point isimli bir yapı (struct) tanımlanıyor.
struct Point iki adet int türünde değişken içeriyor: x ve y.x: Noktanın x koordinatını tutar.
y: Noktanın y koordinatını tutr.
y: Noktanın y koordinatını tutr.
create_point Fonksiyonu
C:
struct Point create_point(int x, int y) {
struct Point p;
p.x = x;
p.y = y;
return p;
}
create_point isimli bir fonksiyon tanımlanıyor. Bu fonksiyon, iki int parametre alarak (x ve y), bir Point yapısı oluşturup geri döndürüyor.
Fonksiyonun dönüş tipi struct Point olarak belirtilmiş.
Fonksiyonun adımları:
struct Point p; ifadesi ile p adında bir Point yapısı oluşturuluyor.
p.x = x; ifadesi ile p yapısının x alanına fonksiyonun x parametresi atanıyor.
p.y = y; ifadesi ile p yapısının y alanına fonksiyonun y parametresi atanıyor.
return p; ifadesi ile oluşturulan p yapısı geri döndürülüyor.
Fonksiyonun dönüş tipi struct Point olarak belirtilmiş.
Fonksiyonun adımları:
struct Point p; ifadesi ile p adında bir Point yapısı oluşturuluyor.
p.x = x; ifadesi ile p yapısının x alanına fonksiyonun x parametresi atanıyor.
p.y = y; ifadesi ile p yapısının y alanına fonksiyonun y parametresi atanıyor.
return p; ifadesi ile oluşturulan p yapısı geri döndürülüyor.
Etkileşimi sağlayacak olan Ruby kodu
Ruby:
# example.rb
require 'ffi'
module Example
extend FFI::Library
ffi_lib 'point.so'
class Point < FFI::Struct
layout :x, :int,
:y, :int
end
attach_function :create_point, [:int, :int], Point.by_value
end
point = Example.create_point(2, 3)
puts "Point: (#{point[:x]}, #{point[:y]})"
Kod Açıklaması
module Example
Ruby:
module Example
extend FFI::Library
ffi_lib './libexample.so'
Example adında bir modül tanımlanıyor.
extend FFI::Library ile FFI modülünün özelliklerini Example modülüne dahil ediyoruz.
ffi_lib './example.so' ile libexample.so adlı paylaşımlı kütüphaneyi yüklüyoruz. Bu kütüphane, point.c dosyasından derlenmiş olmalıdır.
class Point < FFI::Struct
Ruby:
class Point < FFI::Struct
layout :x, :int,
:y, :int
end
Point adında bir sınıf tanımlanıyor ve FFI::Struct sınıfından türetiliyor.
layout metodu ile Point yapısının C tarafındaki struct Point ile aynı düzenlemeye sahip olduğunu belirtiyoruz.
attach_function
Ruby:
attach_function :create_point, [:int, :int], Point.by_value
end
attach_function metodu ile C kütüphanesindeki create_point fonksiyonunu Ruby'de kullanılabilir hale getiriyoruz.
:create_point Ruby'deki metod ismi.
[:int, :int] fonksiyonun iki int parametre aldığını belirtir.
Point.by_value fonksiyonun Point türünde bir değer döndüreceğini belirtir.
Geriye kalan kod kısımlarında ise fonksiyonların çağırımı ve kullanımı yer alıyor.
![pDHFoUY.png pDHFoUY.png](https://i.imgur.com/pDHFoUY.png)
FFI çok detaylı bir kütüphanedir daha fazlası için
Okuyan herkese teşekkürler.