December 18, 2017

Selamün Aleyküm.

Şu bağlantıda D dilinin C++ kodlarının nasıl kullandığını anlatmış: https://dlang.org/spec/cpp_interface.html
D bunun için derlenerek oluşturulan .o dosyasını kullanıyor.
Benim merak ettiğim nokta ise D dilindeki extern c++ komutu arka planda ne yapıyor da bu object dosyasının içeriğini okuyup D'de kullanılabilir hale getiriyor? Arka planda ne yaptığına dair bilgiyi nereden bulabilirim?

Yani bu object dosyalarının içeriğini okuyup da linker nasıl başka bir dile bu kodu bağlayabiliyor?

Teşekkürler.

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

December 18, 2017

Bağlayıcı düzeyinde programlama dili kavramı kalmamıştır çünkü .o dosyaları ve kütüphaneler zaten makine koduna derlenmiştir.

a.o dosyası "foo işlevinin tanımı bende var" diyebilir ve b.o dosyası da "ben foo'yu çağırıyorum" diyebilir. a.o ve b.o farklı dillerde yazıldıklarında iki konuda farklılık olabilir:

  • Sembollerin .o dosyasındaki durumları: Örneğin, C kaynak dosyasında foo diye geçen bir isim C'de _foo olarak derlenmiştir.

  • Parametrelerin işlevlere geçirilme yöntemleri. (Bakınız stdcall ve arkadaşları.)

Dolayısıyla, extern(C) veya extern(C++) dendiğinde D derleyicisine bu sembolleri nasıl oluşturacağı ve parametreleri nasıl geçireceği bildirilmiş oluyor. Yani, D derleyicisinin C++ dilini bilmesi gerekmiyor.

int falanca_D(int, double) {
   return 0;
}

extern(C)
int falanca_C(int, double) {
   return 0;
}

extern(C++)
int falanca_Cpp(int, double) {
   return 0;
}

void main() {
}

Yukarıdaki programı 'deneme' adıyla oluşturduğumuzu düşünürsek, içinde bizi ilgilendiren işlev isimleri şöyle görünüyor (Unix ortamlarındaki nm programı ile bakarak):
'
$ nm deneme | grep falanca
0000000000425cf8 W _D6deneme9falanca_DFidZi
0000000000425d00 W falanca_C
0000000000425d08 W _Z11falanca_Cppid
'
Ali

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