Thread overview
std.demangle
Jan 31, 2012
erdem
Jan 31, 2012
erdem
January 31, 2012

Aşağıdaki gibi bir C++ programımız olduğunu düşünelim:

   int  f (void) { return 1; }
   int  f (int)  { return 0; }
   void g (void) { int i = f(), j = f(0); }

Bu kodu direkt olarak C'ye dönüştürmüş olsaydık derleyici hata verecekti. Çünkü C aynı iki farklı işleve aynı ismi vermez. Bu yüzden C++ derleyicisi tür bilgilerini de sembol isimlerine yazıyormuş ve sonuç şu şekilde:

   int  __f_v (void) { return 1; }
   int  __f_i (int)  { return 0; }
   void __g_v (void) { int i = __f_v(), j = __f_i(0); }

Gelelim şimdi benim bunlardan bahsetme nedenime :-) Şimdi arkadaşın bir tanesi D ile ilgili forumlarda bir şeyler anlattı. Ama ben açıkçası ne demek istediğini hiç anlamadım :nuts:

http://www.picproje.org/index.php/topic,37572.0.html

Bir de acaba verdiği örnek phobos 1 mi acaba? Çünkü ben birim testini derleyemedim.

https://github.com/D-Programming-Language/phobos/blob/phobos-1.x/std/demangle.d

Bir de "name mangling (decoration)" terimi için aklınıza gelen Türkçe karşılık var mı acaba? Ben düşündüm düşündüm bulamadım :huh:

http://en.wikipedia.org/wiki/Name_mangling

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

January 31, 2012

Alıntı (acehreli):

>

O foruma sonra bakacağım.

Alıntı (erdem):

>

Bir de "name mangling (decoration)" terimi için aklınıza gelen Türkçe karşılık var mı acaba?

"Decoration"ın tam çevirisi olarak: isim süsleme?

Ben bir tane Fizik, Kimya Terimleri Sözlüğü buldum. Akıllara zarar! :)

Orda diyor ki kelimeler o kavramın ifade ettiği anlamı göstermelidir. Buna göre birebir çeviri yapmamıza gerek yok.

O zaman derleyici bu işlemi yaptığına göre derleyici süslemesi süsü mü desek.

Bu arada orda gördüğüm ve ilginç bulduğum bir kaç çeviri.

anode : artıuç
**capacity: **sığa
capacitor: sığaç (bunu ben uydurdum :)
**computer program: **çizeylem
conductor: iletken
constant: dursayı
photochemistry: ışılkimya
photoresistor: ışıldirenç (bunu da ben uydurdum :)

Verdiğiniz örnek gerçekten açıklayıcı olmuş. Hatta daha önce SDL için D ilmekleri yazarken de bu örneği göstermiştiniz sanırım. Şimdi hatırladım.

TDLP'nin 359. sayfasından alıntı yapıyorum:

*D modules can interface directly with C and C++ functions. The restriction is that template C++ functions are not allowed because that would require the D compiler to include a full-fledged C++ compiler. Also D's class layout is not compatible with C++ classes that use virtual inheritance.

To call functions defined in C and C++, simply specify the language in the function declaration and make sure to link your module with the appropriate libraries:*


extern(C) int foo(char*);
extern(C++) double bar(double);

The declarations cue the D compiler to generate calls with the appropriate stack layout, calling convention, and name encoding (aka name mangling), even though D functions themselves are different in some or all of these aspects.

Ben bir D programcısıyım. Amacım bir C kütüphanesindeki işlevleri çağırıp kendi programımda kullanmak. Bunun için içinde 'extern(C)' vs.. bulunan bir kod yazıyorum. Bu işleme ilmek, ilinti yazma ("binding") denilmiyor mu.

Derleyici bu işi gerçekleştirmek için süslemeler yapıyormuş, ya da program yığıtına belirli bir sırada yerleştirmek için çağrılar yapıyormuş. Bu arkaplanda derleyicinin yaptığı işler programcıyı ilgilendirir mi? Bu ilmeklerin yazılma amaçları aslında C işlevlerini çağırmak değil midir? Yani C ile D arasında bir nevi iletim köprüsü görevi görüyor.

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

January 31, 2012

O foruma sonra bakacağım.

Alıntı (erdem):

>

Bir de "name mangling (decoration)" terimi için aklınıza gelen Türkçe karşılık var mı acaba?

"Decoration"ın tam çevirisi olarak: isim süsleme?

Ali

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

January 31, 2012

Alıntı (erdem):

>

http://www.picproje.org/index.php/topic,37572.0.html

Söyledikleri doğru. Tabii o C++'taki gibi 'extern "C"' diyor ama D'de extern(C)'dir. extern(C)'nin yaptığı, isimlerin C geleneklerine uydurulması. Böylece örneğin C programından da çağrılabiliriz.

Şöyle bir D kodumuz olsun:

int topla(int a, int b)
{
   return a + b;
}

Onu şu komutla program parçası haline getirelim:

'dmd -c deneme.d'

O program parçasının içindeki isimleri görmek için Linux konsollarında 'nm' programı kullanılabilir:

'$ nm deneme.o
0000000000000000 t
0000000000000000 D _D6deneme12__ModuleInfoZ
0000000000000000 T _D6deneme5toplaFiiZi
U _Dmodule_ref
'

Görüldüğü gibi, 'topla' işlevinin ismi süslenmiş durumda. C programlarının yaptığı topla() gibi bir çağrıya karşılık olarak bağlayıcı süssüz bir isim arayacaktır. Bizim deneme.o içinde bulamaz.

C'den çağrılabilmek için "bu ismi süsleme" anlamında extern(C) kullanmamız gerekir:

extern(C) int topla(int a, int b)
{
   return a + b;
}

Şimdi bakalım:

'$ dmd -c deneme.d
$ nm deneme.o
0000000000000000 t
0000000000000000 D _D6deneme12__ModuleInfoZ
U _Dmodule_ref
0000000000000000 T topla
'

Ben isminin '_topla' olmasını beklerdim. :) Neden öyle olmadığını bilmiyorum... :)

dmd'nin söylediğine göre extern() ile şu isimler kullanılabiliyor:

'valid linkage identifiers are D, C, C++, Pascal, Windows, System'

Gerisini siz deneyiniz. :) Aslında onların yalnızca isim ile ilgili olmadıklarını da düşünüyorum. Sanırım en azından parametrelerin program yığıtına hangi sırada yerleştirildikleriyle de ilgili. (?)

Ali

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

January 31, 2012

Alıntı (erdem):

>

Derleyici bu işi gerçekleştirmek için süslemeler yapıyormuş, ya da program yığıtına belirli bir sırada yerleştirmek için çağrılar yapıyormuş. Bu arkaplanda derleyicinin yaptığı işler programcıyı ilgilendirir mi? Bu ilmeklerin yazılma amaçları aslında C işlevlerini çağırmak değil midir? Yani C ile D arasında bir nevi iletim köprüsü görevi görüyor.

Bence doğru. :)

Ali

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