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

  • itfigueres

    itfigueres

    12 EKİM 2013
  • Philip DeFranco

    Philip DeFra

    16 EYLÜL 2006
  • RomanAtwood

    RomanAtwood

    18 Kasım 2009