Neden C yansıma yok? | Netgez.com
SORU
11 Aralık 2008, PERŞEMBE


Neden C yansıma yok?

Bu biraz tuhaf bir soru. Hedeflerim, dil tasarım kararı anlamak ve yansıma olanaklarını belirlemek C .

  1. Neden C dili Komitesi dilde yansıma uygulanması yolunda gitmedi? Yansıma bir sanal makine (java gibi) üzerinde çalışmayan bir dil çok mu zor?

  2. Eğer bir C için yansıma uygulamak için olsaydı , bu sorunlar ne olacak?

Yansıma kullanır tanınmış sanırım: editörler daha kolay yazılabilir, program kodu alay birim testleri için oluşturulabilir. daha küçük olacak Ama eğer yansıma kullanır da yorum bırakırsan çok iyi olur.

CEVAP
11 Aralık 2008, PERŞEMBE


C yansıması ile bazı sorunlar var .

  • Bir sürü iÅŸ eklemek için, ve C Komitesi oldukça muhafazakar ve kapalı ödeyeceÄŸim emin olmadıkça radikal yeni özellikler üzerinde zaman harcamak yok. (Ekleme için bir öneri modül sistemine benzer .NET derlemeleri yapılmış ve süre sanırım genel kanı bu çok iyi olur, deÄŸil onların birinci önceliÄŸi ÅŸu anda, ve geri itti kadar sonra C 0x. Bu özellik için motivasyon kurtulmak için #sistemi vardır, ama aynı zamanda en azından bazı meta verileri etkinleÅŸtir).

  • Bilmiyorsun ne için para vermene gerek yok kullanın. Bu temel gerekir biri tasarım felsefeleri C altında yatan . Neden benim kod etrafında taşımak gerekir eÄŸer hiç ihtiyacım olabilir eÄŸer meta? Ayrıca, meta veriler ekleme derleyici halindedirler en iyi duruma getirme. Neden ben ödemek zorundayım eÄŸer hiç ihtiyacım olabilir eÄŸer Åžifremi maliyet meta?

  • BaÅŸka büyük bir noktaya götürür bizi: C yaparçokbirkaç garanti hakkında derlenen kod. Bu derleyici yapmak oldukça izin verilir o seviyor bir ÅŸey daha, sürece sonuç iÅŸlevselliÄŸi nedir bekleniyor. ÖrneÄŸin, sınıflar için gerçekten gerekli deÄŸil orada olmak. Derleyici onları, satır içi iyileÅŸtirebilirsiniz yaptıkları her ÅŸeyi, ve sık sık sadece, çünkü hatta basit bir ÅŸablon kodu eÄŸilimindedir epeyce bir ÅŸablon oluÅŸturmak örneklemesi. C standart kütüphanedayanırbu saldırgan hakkında optimizasyonu. Funktorlar, sadece ölçülebilir yükü ise ve baÅŸlatmasını tahrip nesne uzakta optimize edilebilir. [] operatörünün bir vektörel sadece karşılaÅŸtırılabilir çiÄŸ performans dizi indeksleme tüm operatör olabilir çünkü inlined ve tamamen kaldırıldı, böylece derlenmiÅŸ kodu. C# ve Java bu konuda fazla iddialı derleyici çıktı. Ben tanımlarsanız C sınıfı#, sonra da o sınıfaolur varoluÅŸturulan derleme içinde. EÄŸer daha önce hiç kullanmamıştım bile. Bile aramalar üye fonksiyonları için olabilir inlined. Sınıfı olmalı bu yansıma bulabilmesi var, . Bu kısmı C ile ayrılmıştır. demek ki derleme bayt kodunu bu JİT derleyiciolabilirKaldır sınıf tanımları ve satır içi eÄŸer iÅŸlevleri bile seviyor, ilk C# derleyici. C , sadece bir derleyici var ve çıkış verimli kod. EÄŸer meta verileri incelemek için izin verildi C çalıştırılabilir, beklediÄŸiniz her sınıf, hangi tanımlı bakın derleyici var demektir tüm tanımlı sınıfları korumak için gerekirse onlar bile.

  • Ve sonra ÅŸablonlar vardır. C ÅŸablonlar gibi bir ÅŸey deÄŸildir diÄŸer dillerde jenerik. Her örnekleme bir ÅŸablon oluÅŸturur yeniyazın. std::vector<int> tamamen ayrı bir sınıftır std::vector<float>. O kadar ekler bir bütün içinde farklı bir yeri program. Biz bu kelimeleri ne olmalı gördün mü?ÅŸablon::std vektör? Ama bu nasıl bir yana, kaynak kodu yok olan yapı, zamanında derken? Görmek zorundayım ayrı sınıflar std::vector<int> std::vector<float>. Ve std::vector<int>::iterator ve * *5, aynı const_iterator için. Ve ÅŸablon içine adım bir kez , hızlı bir ÅŸekilde sona metaprogramming baÅŸlatmasını yüzlerce ÅŸablon, inlined ve kaldırılır olsun tüm yine derleyici tarafından. Hayır var anlamı, bir parçası hariç derleme zamanı metaprogram. Tüm yüzlerce sınıf görünür hale yansıma için? Etmek zorunda kalırdık aksi takdirde bizim yansıma çünkü eÄŸer bile sınıfları ben aslında tanımlanan garanti deÄŸil mi faydasız olacakorada olmak. Ve yan bir sorun template sınıf örneÄŸi kadar yok. std::vector<int> kullanan bir program düşünün. Yansıma sistemi std görmek gerekir::vector::yineleyici? Bir yandan, kesinlikle çok beklersiniz. Önemli bir sınıf ve std::vector<int>, açısından tanımlanmışyokmeta var. DiÄŸer taraftan, eÄŸer program hiçbir zaman aslındakullanırbu sınıf ÅŸablonu yineleyici türünü hiç örneÄŸi ve derleyici ilk etapta oluÅŸturulan class olmayacak. Ve kaynak kodlarına eriÅŸim gerektirdiÄŸinden çalışma zamanında oluÅŸturmak için çok geç.

  • Ve son olarak, yansıma çok deÄŸil C gibi, C gibi hayati#. Bu neden tekrar, ÅŸablon metaprogramming. Çözebilir mi her ÅŸey, ama çoÄŸu için nerede baÅŸka çare olur yansıma, olası bir yazmak için. aynı iÅŸi yapar olan metaprogram derleme zamanında bir ÅŸey. ::type_traits artırmak basit örnek. Türü hakkında bilmek istediÄŸiniz T? Onun type_traits kontrol edin. C#, biraz sonra balık olurdu türü yansıma kullanarak. Yansıma hala bazı için yararlı olacaktır ÅŸeyleri görebiliyorum ana kullanın, hangi metaprogramming kolay olmaz yerine, otomatik için. kod seri hale getirme), ama o-cekti bazı önemli bedelleri C ve gerekli diÄŸer dillerdeki kadar sık deÄŸil.

Düzenleme: Yorumlarına yanıt olarak:

cdleary: Evet, hata ayıklama sembolleri türleri yürütülebilir kullanılan meta veri deposu, benzer bir şey yapmak. Ama onlar da ben tarif sorunları muzdarip. Eğer hiç bir yayın oluşturma, hata ayıklama denedim, ne demek istediğimi anlayacaksınız. Son kod inlined kaçmış olan kaynak kodu bir sınıf, oluşturduğunuz büyük bir mantıksal boşluklar var. Eğer işe yarar bir şey için yansıma kullanmak olsaydı, daha güvenilir ve tutarlı olması gerekir. Olduğu gibi, tipleri ve hemen hemen her zaman derleme kaybolan ufuk olacaktır. Küçük bir ayrıntı değiştirmek ve derleyici inlined olsun ve hiç bir tepki olarak değil, hangi değiştirmeye karar verir. Nasıl bir şey, hatta en alakalı türleri meta temsil edilecek olduğunu garanti değilken, yararlı ayıklamak mı? Aradığın tip var en son inşa edilmiş olabilir, ama artık yok. Ve yarın, biri yazın tekrar olacak yani tamamen inlined olsun, yok o sadece yeterince büyük yapar küçük masum bir işlevi, küçük masum bir değişikliği kontrol eder. Hala hata ayıklama sembolleri için yararlı, ama bundan çok daha fazla değil. Bu şartlar altında bir sınıf için seri hale getirme kodu üretmek için çalışıyor nefret ediyorum.

Evan Teran: elbette bu sorunlarolabilirçözümlenecek. Ama o benim 1 numaralı noktaya geri düşer. Bir sürü iş alır, ve C Komitesi daha önemli olduğunu hissediyorum şeyler bol vardır. C bazı sınırlı yansıma (ve sınırlı olacaktır) almanın yararı gerçekten diğer özellikler pahasına odaklanarak haklı çıkarmak için yeterince büyük mü? Gerçekten zaten (çoğunlukla) QT gibi kütüphaneler ve preprocessors yoluyla yapılabilir, hangi temel dil özelliklerini ekleyerek büyük bir yararı var mı? Belki, ama gerekirse böyle kütüphaneler yoktu olsaydı zaten çok daha acil. Özel öneriler için, şablonlar üzerine vermemek tamamen yararsız olacağına inanıyorum. Standart kütüphane için yansıma kullanmak mümkün, örneğin olursun. Bir std görmesine izin vermez::vektör? Şablonlar vardırbüyükC parçası . Şablonlar üzerinde çalışmayan bir özellik bir işe yaramıyor.

Ama haklısın, yansıma çeşit uygulanabilir. Ama dili büyük bir değişim olacak. Şimdi olduğu gibi, bir tür derleme bir yapı sadece. Derleyici yarar, ve başka bir şey için varlar. Kodun derlenmiş sonraders yok. Kendinizi germek, fonksiyonları hala var olduğunu iddia edebilirsin, ama gerçek, eğer atlamak çevirici talimatları bir sürü, bir yığın, bir sürü/pop itin. Bu meta verileri ekleme, kayda değer bir şey yok.

Ama dediğim gibi, var mı bir önerisi değişiklik için derleme model ekleyerek, kendi kendine yeten modülleri, meta verileri saklamak için seçin türlerini, izin diğer modüller için başvuru onlarsız sahip olurum #içerir. Bu iyi bir başlangıç, ve dürüst olmak gerekirse, standart Komitesi teklifi çok büyük bir değişiklik olduğu için evden atmadı şaşırdım. Bu yüzden belki de 5-10 yıl içinde? :)

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Electro Posé

    Electro PosÃ

    21 ÅžUBAT 2013
  • Ryan Ha

    Ryan Ha

    9 NİSAN 2006
  • William Hyde

    William Hyde

    23 HAZİRAN 2008