Thread overview
Kütüphane (DLL) ilintileri
Oct 08, 2015
Alper#
Oct 09, 2015
Alper#
October 08, 2015

Selam arkadaşlar foruma kayıt olup, ortadan kaybolup ve dayanayıp tekrar sessizce forumu takip eden bir arkadaşınız. Okulla bir kaç haftadır uğraşmamdan dolayı boş zamanı çok az oluyor. Ama sürekli D'nin bu kadar güzel sözdimini düşünce benim için çok önemli bir hobi amaçlı bir proje üstünde çok kafa yoruyorum.

Neyse esas konuma döneyim:

Basit bir 2D oyun motoru yapmak için kaç aydır araştırma yapıyordum. Amacım sıfırdan ortaya bir şey çıkarmak değildi. Yada kodları alıp yapıştırıp puzzle parçaları gibi birleştirmekte değildi. Bunu yapan insanlar nasıl düşünerek bu kodları yazdı. Sıfırdan yazamayacağım için bende azda olsa kopya çekme isteği doğdu. Mantıklarını kavramam gerekti. Sonra fark ettim ki matematiğin dibine vurmuşlar. Matematik sorun değil eksiklerimi Türkçe kaynaklarla hallediyorum. Basit fizik kurallarını kodlarla uyguluyorum. Birazcık üniversite fiziği birazcık kalkülüs derken bu işi yapacağıma çok eminim.

Esas sorularıma geçersek;

  1. https://github.com/DerelictOrg/DerelictGLFW3 şu örnekte anladığım kadar Windows için glfw.dll dosyasının methodlarını kullanabiliyoruz. Language Bindings dedikleri olayı çok güzel şekilde açıklıyor. Anlamadığım nokta C/C++ ile yazılmış binary lib. nasıl iletişim kuruyor. İşaretçileri kullanarak nasıl methodları çağırıp işlem yaptırabiliyor.

Örneğin:

alias da_glfwCreateWindow = GLFWwindow* function( int,int,const( char )*,GLFWmonitor*,GLFWwindow* );

Bu kod bize ne anlatıyor?

  1. Language Bindings nasıl yapılıyor. Tam olarak nasıl bir mantık işliyor. OpenGL C ile yazılmış grafik kütüphanesini başka dillerle nasıl hükmediliyor.

Aklımda daha çok soru var ama en önemlisi bunlar. Ciddi anlamda neyle uğraşmam gerektiğimi çözebilmiş değilim.

Şimdiden yardımlarınız için teşekkürler.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 09, 2015

Ali hocam cevabiniz icin cok tesekkur ederim. Eve gidince C ile basit bir program yazip bunu D ile kullanmaya calisacagim.

Konu basligini istediginiz bir baslikla degistirerek, forum takipcilerinde yararlanabilecegi bir konu olmasi dilegiyle.

Tekrardan cevabiniz icin tesekkur ederim.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 08, 2015

Alıntı (Alper#):

>
  1. https://github.com/DerelictOrg/DerelictGLFW3 şu örnekte anladığım kadar Windows için glfw.dll dosyasının methodlarını kullanabiliyoruz.

Evet, D kodları C kütüphanelerini olduğu gibi çağırabilir. Gereken tek şey, D tarafında çağrılmakta olan işlevin bir C işlevi olduğunu (ve ne parametreler aldığını) bildirmektir.

Alıntı:

>

Language Bindings dedikleri olayı çok güzel şekilde açıklıyor.

O zaman bu yazacaklarım biraz tekrar olacak.

C ve D gibi derlemeli dillerde kaynak kod makine koduna dönüştürülür. Bu adımdan sonra artık kodun hangi dilden gelmiş olduğu değil, hangi işlemcinin olduğu belirgindir.

İçinde foo(int) ve bar(double) diye iki işlev bulunan bir C kaynak dosyası derlendiğinde c.o dosyası oluşmuş olsun. O dosyanın içinde temelde bağlayıcının (linker veya loader) yararlandığı temelde şu bilgi vardır: "Bu dosyada isimleri (tarihsel nedenlerle) _foo ve _bar olan iki işlev var ve dosya içinde şu noktada bulunuyorlar." O kadar...

C++ ve D gibi dillerde durum bundan farklı olmamakla birlikte, işlev isimlerinde ufak bir güçlük vardır. Bu dillerde işlev yükleme diye bir olanak olduğundan, örneğin foo(int) yanında foo(string) de bulunabilir. Bu yüzden, derlenen dosyadaki sembol isimleri basitçe _foo (ve _foo) olamaz. Bunların .o dosyalardaki işlev isimlerinin aldıkları parametrelerin türlerini de gösterecek biçimde _foo_int ve _foo_string gibi olması gerekir. (Bu isimleri örnek olarak verdim; gerçekte daha farklıdır. İlgilenenler core.demangle'daki mangle işlevine bakabilirler: http://dlang.org/phobos/core_demangle.html#.mangle.)

Yani, bir D programı foo(42) dediğinde bunun _foo_int adlı bir işleve doğru olduğu anlaşılır. Sorun: Eğer çağrılan foo(int) C ile derlenmiş bir program parçasında bulunuyorsa, bağlayıcı çağıranla işlevi bağlayamaz.

Bunun çözümü, D'nin extern(C) olanağından yararlanmaktır. extern(C) olarak bildirilen bir işlevin isminin C kurallarına göre aranır:

extern(C) void foo(int);    // Bir C binding'i
void main(){
   foo(42);    // <-- Bu, extern(C) yüzünden _foo adlı bir işleve çağrıdır
               //     (Yani, _foo_int adlı bir işleve değil.)
}

İşte, binding'ler, bir C kütüphanesinin işlevlerini (ve türlerini) D'nin kullanabildiği biçimde extern(C) olarak bildiren basit dosyalardır.

Alıntı:

>

Anlamadığım nokta C/C++ ile yazılmış binary lib. nasıl iletişim kuruyor.

Yukarıda da dediğim gibi, foo(42) ifadesi şöyle kodlanıyor: "burada _foo isimli işlevi çağırıyoruz." Çağrılmakta olan işlevin hangi program parçasında (.o dosyası) veya kütüphanede olduğunu bulup herşeyi bir araya getirip programı oluşturmak bağlayıcının görevidir.

Yani, burada çağıranla çağrılanın isimlerinin aynı biçimde kurulmuş olmalarından başka bir şey gerekmiyor. (Aslında 42 gibi parametre değerlerinin çağrı yığıtına ne biçimde yerleştirildikleri de önemli ama o bu konuyla doğrudan ilgili değil.)

Alıntı:

>

Örneğin:

> alias da_glfwCreateWindow = GLFWwindow* function( int,int,const( char )*,GLFWmonitor*,GLFWwindow* );
> ```

>
> Bu kod bize ne anlatıyor?

O bu konuyla tam ilgili değil. Yukarıdaki satır sağ tarafta bir işlev göstergesi türü tanımlıyor: iki int vs. alan ve GLFWwindow* döndüren işlev göstergesi.

Sol tarafındaki ise ona güzel bir isim veriyor: da_glfwCreateWindow.

Dolayısıyla aşağıdaki kodun anlamı, "foo şöyle şöyle bir işlev göstergesidir":

da_glfwCreateWindow foo;


O bildirime uyan bir işlevimiz varsa, foo'yu ona eşitleyebiliriz ve sonra onu çağırabiliriz:

foo = &benimUygunİşlevim;
foo(42, 43, /* vs */);



Alıntı:
> 2) Language Bindings nasıl yapılıyor. Tam olarak nasıl bir mantık işliyor.

Tekrar etmek pahasına, binding, temelde kütüphanenin .h dosyasındaki bildirimleri vs. bir .d dosyası içinde extern(C) olarak tanımlamaktan başka bir şey değil.

Alıntı:
> OpenGL C ile yazılmış grafik kütüphanesini başka dillerle nasıl hükmediliyor.

Yine tekrar etmek pahasına, kütüphanenin hangi dilde yazıldığının hiçbir önemi yok. Kütüphanede _foo diye bir işlev varsa, onu çağıran kod o kütüphaneyle bağlanabilir.

Alıntı:
> Aklımda daha çok soru var ama en önemlisi bunlar.

Bunlar "cevabını bulamadığım sorular"dan daha uygun ;) konu başlıklarını hakeden çok ilginç sorular. Ben her soru için ayrı konu açmayı seviyorum. O zaman konular daha derli toplu oluyor.

Ali

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
October 09, 2015

Eski konulara da bakmak istersen 'ilinti extern(C)' diye aratabilirsin.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]