SORU
25 Kasım 2008, Salı


Neden C derleme bu kadar uzun sürüyor?

C dosyayı C ile kıyaslandığında çok uzun zaman alır derleme# ve Java. Normal bir boyut çalıştırmak için daha bir C dosyasını derlemek için Python betiği önemli ölçüde daha uzun sürer. Şu anda VC kullanıyorum ama herhangi bir derleyici ile aynı. Neden bu?

Aklıma gelen iki sebep başlık dosyaları yükleme ve işleyişi çalışmakta, ama neden bu kadar uzun sürdüğünü açıklamak gerektiği gibi görünmüyor.

CEVAP
25 Kasım 2008, Salı


Çeşitli nedenlerden dolayı

  • Başlık dosyaları:Her derleme birimi başlıkları yüzlerce veya binlerce hatta 1 olmasını gerektirir: yüklü ve 2: derlenmiş. Her biri tipik olarak bu kadar basit bir başlık derleme sonucu emin olun çünkü her derleme birimi için çekirdekler vardırolabilirher derleme birimi arasında değişir. (Bir makro Başlığı içeriğini değiştiren bir derleme birimi) olarak tanımlanabilir.

    Bu muhtemelenkod büyük miktarda her derleme birimi için derlenmiş olması gerekir gibi temel sebebi, ve ayrıca, her başlık birden çok kez derlenecek (bir kez içeren her derleme birimi için)

  • Bağlantı:Derlenmiş bir kez tüm nesne dosyalarını birbirine bağlı olmak zorunda. Bu temelde çok iyi parallelized olamaz, ve tüm proje süreci için yekpare bir süreçtir.

  • Ayrıştırma:Sözdizimi son derece karmaşık ayrıştırma, ağır şartlara bağlıdır, ve çok zor belirsizliği ortadan kaldırmak için. Bu çok zaman alır

  • Şablon:C#, List<T> derlenmiş, kaç programda önemli olan tek türüdür. C vector<int> vector<float>, tamamen ayrı bir tip ve ayrı ayrı derlenmiş olacak.

    Bu eklemek şablonları tam bir turing-tam bir "alt dil derleyici yorumlamak ve bu gülünç olabilir" karmaşık. Hatta nispeten basit template metaprogramming kodu şablon örneklemesi düzinelerce oluşturmak özyinelemeli şablonları tanımlayabilirsiniz. Şablonları da uzun gülünç isimler ile son derece karmaşık türleri neden, linker için ekstra bir sürü iş ekleme olabilir. (Sembol isimleri bir sürü karşılaştırma var, ve eğer bu isimler binlerce karakterlerin içine büyüyebilir, bu oldukça pahalı olabilir).

    Ve tabii ki, onlar şablonları genellikle çok fazla kod ve her derleme birimi için ayrıştırılmış derlenmiş demek ki başlıkları, tanımlanmış olması nedeniyle başlık dosyaları ile sorunları azdırmak. Normal C kodu, üstbilgi genellikle sadece ileri bildirimleri, ama çok az gerçek kod içerir. C , neredeyse tüm kodu başlık dosyasında bulunması için nadir değildir.

  • Optimizasyon:C çok dramatik bazı iyileştirmeler sağlar. C# ya da Java yok izin sınıfları tamamen ortadan (onlar orada olmak için yansıma amaçlar), ama daha basit bir C şablon metaprogram kolayca oluşturmak düzinelerce ya da yüzlerce sınıfları, öğrenci Birliği inlined ve ortadan yine optimizasyon aşamasında.

    Ayrıca, C programı tam olarak derleyici tarafından optimize edilmiş olmalıdır. Bir C# programı JİT derleyicisi yüklenemedi-ek iyileştirmeleri gerçekleştirmek için güvenebilirsiniz, C gibi herhangi almaz "ikinci şans". Derleyici oluşturur ne olacak kadar getirilmiştir.

  • Makine kodu:C Java Java ya göre biraz daha karmaşık olabilir hangi makine kodu için derlendi .NET kullanım (özellikle 86 durumunda).
    (Bu sadece yorumlarda bahsedildiği çünkü bütünlüğü dışında da belirtildiği gibi. Uygulamada, bu adımı toplam derleme zamanı küçük bir kısmını daha almak pek mümkün değildir.)

Bu faktörler çoğu aslında oldukça verimli derler C kod tarafından paylaşılır. Ayrıştırma adıma bir sürü C daha karmaşıktır , ve çok daha uzun sürebilir, ama asıl suçlu muhtemelen şablonları. Kullanışlı olduğu, ve C çok daha güçlü bir dil yapmak, ama onlar da derleme hızı açısından hırpalayıcı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • André Frizzo

    André Frizz

    16 Aralık 2006
  • kimaliz

    kimaliz

    18 Temmuz 2006
  • KSI

    KSI

    25 Temmuz 2009