Forum: Ders Arası RSS
std.demangle
erdem (Moderatör) #1
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: std.demangle
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/phob…

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 mesaj erdem tarafından değiştirildi; zaman: 2012-01-31, 04:39.
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ı
O foruma sonra bakacağım.

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
acehreli (Moderatör) #3
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ı
Yanıtlanan mesaj #1
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
erdem (Moderatör) #4
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
O foruma sonra bakacağım.

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.
acehreli (Moderatör) #5
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ı
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
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:
Forum: Ders Arası RSS
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-21, 11:03:08 (UTC -08:00)