Forum: Diğer Konular RSS
D dili C++ kodlarını nasıl anlayabiliyor?
İbrahim #1
Üye Eki 2015 tarihinden beri · 165 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: D dili C++ kodlarını nasıl anlayabiliyor?
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.
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4583 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
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: 2018-01-18, 01:29:37 (UTC -08:00)