Forum: D Programlama Dili RSS
Kütüphane (DLL) ilintileri
Alper# #1
Üye Haz 2015 tarihinden beri · 8 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Kütüphane (DLL) ilintileri
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?

2) 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 mesaj 2 defa değişti; son değiştiren: acehreli; zaman: 2015-10-09, 09:19.
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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.

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.

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.)

Ö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 */);

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.

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.

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
Alper# #3
Üye Haz 2015 tarihinden beri · 8 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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.
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Eski konulara da bakmak istersen 'ilinti extern(C)' diye aratabilirsin.

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-18, 09:28:41 (UTC -08:00)