Örneğin , geçmişten gelen SysInternals aracı "FileMon", kaynak kodu tamamen 4.000 satırlık bir dosyada bulunan bir çekirdek modu sürücüsüne sahiptir. Şimdiye kadar yazılmış ilk ping programı için de aynı (~ 2.000 LOC).
Örneğin , geçmişten gelen SysInternals aracı "FileMon", kaynak kodu tamamen 4.000 satırlık bir dosyada bulunan bir çekirdek modu sürücüsüne sahiptir. Şimdiye kadar yazılmış ilk ping programı için de aynı (~ 2.000 LOC).
Yanıtlar:
Birden fazla dosya kullanmak her zaman ek idari ek yük gerektirir. Bir derleme ve / veya ayrılmış derleme ve bağlama aşamaları ile makefile oluşturmak, farklı dosyalar arasındaki bağımlılıkların doğru yönetildiğinden emin olmak, kaynak kodun e-posta veya indirme yoluyla daha kolay dağıtılması için bir "zip" betiği yazmak vb. üzerinde. Günümüzde modern IDE'ler genellikle bu yükün çoğunu üstlenir, ancak ilk ping programının yazıldığı sırada, bu tür bir IDE bulunmadığından oldukça eminim. Ve ~ 4000 LOC kadar küçük dosyalar için, sizin için birden fazla dosyayı iyi yöneten bir IDE olmadan, söz konusu ek yük ile birden fazla dosya kullanmanın yararları arasındaki ilişki insanların tek dosya yaklaşımı için bir karar vermesine neden olabilir.
Çünkü C modülerleşmede iyi değil. Dağınık (başlık dosyaları ve #includes, harici fonksiyonlar, link-time hataları, vb.) Ve ne kadar fazla modül eklerseniz, o kadar zorlaşır.
Daha modern diller kısmen daha iyi modülerleştirme yeteneklerine sahiptir, çünkü C'nin hatalarından öğrenirler ve kod tabanınızı daha küçük ve daha basit birimlere ayırmayı kolaylaştırırlar. Ancak C ile, aksi halde tek bir dosyada çok fazla kod olarak kabul edilebilecek olanların toplanması anlamına gelse bile, tüm bu sorunlardan kaçınmak veya en aza indirmek faydalı olabilir.
Tarihsel nedenlerin yanı sıra, bunu modern performansa duyarlı yazılımda kullanmanın bir nedeni var. Kodun tümü bir derleme ünitesindeyken, derleyici tüm program optimizasyonlarını yapabilir. Ayrı derleme üniteleriyle, derleyici tüm programı belirli şekillerde optimize edemez (örneğin, belirli bir kodu satırlara yerleştirerek).
Bağlayıcı kesinlikle derleyicinin yapabileceklerine ek olarak bazı optimizasyonlar yapabilir, ancak hepsini yapamaz. Örneğin: modern bağlayıcılar, birden çok nesne dosyasında bile, kayıtsız işlevler seçmede gerçekten iyidir. Başka optimizasyonlar yapabilirler, fakat bir derleyicinin bir fonksiyon içinde yapabilecekleri gibi bir şey yoktur.
Tek kaynaklı bir kod modülünün iyi bilinen bir örneği SQLite'dir. Bunun hakkında daha fazla bilgiyi The SQLite Amalgamation sayfasından öğrenebilirsiniz .
1. Yönetici Özeti
100'den fazla ayrı kaynak dosya "sqlite3.c" adında ve "birleştirilmesi" olarak adlandırılan tek bir büyük C kodu dosyasına birleştirilir. Birleştirme, bir uygulamanın SQLite'yi gömmek için ihtiyaç duyduğu her şeyi içerir. Birleştirme dosyası 180.000'den fazla satır uzunluğunda ve 6 megabayttan daha büyüktür.
Tüm SQLite kodunu tek bir büyük dosyada birleştirmek, SQLite'ın kurulumunu kolaylaştırır - izlenmesi gereken tek bir dosya vardır. Ayrıca tüm kodlar tek bir çeviri biriminde olduğundan, derleyiciler% 5 ile% 10 arasında daha hızlı olan makine koduyla sonuçlanan daha iyi prosedürler arası optimizasyon yapabilir.
$(CC) $(CFLAGS) $(LDFLAGS) -o $(TARGET) $(CFILES)
her şeyi tek bir soudce dosyasına taşımaktan çok daha kolaydır . Tüm program derlemesini, insanların profil oluşturma ve hata ayıklama işlemlerini nasıl kapattıklarına benzer şekilde değiştirmemiş olan yeniden derleme işlemini atlayan geleneksel derleme komut dosyasına alternatif bir hedef olarak bile yapabilirsiniz. Her şey bir büyük yığın kaynağındaysa bu seçeneğe sahip değilsiniz. İnsanların alıştığı şey bu değil, ama bunun için hantal bir şey yok.
Basitlik faktörüne ek olarak, diğer katılımcı belirtilen, birçok C programı bir kişi tarafından yazılmıştır.
Bireysel ekibiniz olduğunda, kod değişikliklerinde gereksiz çakışmaları önlemek için uygulamayı birkaç kaynak dosyaya bölmek istenir. Özellikle, projede çalışan hem ileri hem de çok küçük programcılar olduğunda.
Bir kişi kendi başına çalışıyorsa, bu sorun değil.
Şahsen ben alışkanlık yapan bir şey olarak işlevine bağlı olarak birden fazla dosya kullanıyorum. Ama bu sadece benim.
Çünkü C89'un inline
işlevleri yoktu . Bu, dosyanızı işlevlere bölmek anlamına gelir, yığında değerlerin itilmesi ve etrafa atlamak yükü. Bu, kodu 1 büyük anahtar ifadesinde (olay döngüsü) uygulamak için bir miktar ek yük ekledi. Ancak bir olay döngüsünün, daha modüler bir çözümden daha verimli (hatta doğru) uygulanması her zaman çok daha zordur. Bu yüzden büyük ölçekli projeler için insanlar modülerleşmeyi tercih ediyor. Ancak tasarımı önceden düşünmüşler ve durumu 1 anahtar ifadesinde kontrol edebiliyorlardı, bunun için seçtiler.
Günümüzde, C'de bile, modülerleştirme için performanstan ödün verilmesine gerek yoktur çünkü C işlevlerinde bile satır içi olabilir.
inline
, C89 derleyicilerinde hiç bir anahtar kelime olmadığı için satır içi olamaz , çünkü her şeyi tek bir dev fonksiyonda yazmak zorunda kalıyorsunuzdur . Asla inline
bir performans optimizasyonu olarak kullanmamalısınız - derleyici genellikle sizden daha iyi bilecektir (ve anahtar kelimeyi de görmezden gelebilir).
inline
Anahtar kelime in-line optimizasyonlar için olsun veya olmasın sorusu daha önemli olduğu bağlayıcı ilgili anlambilim içeriyor, ancak bazı uygulamalar içinde astar kontrol etmek ve bu tür şeyler bazen çok önemli olabilir diğer direktiflerini var. Bazı durumlarda, bir işlev kaplamaya değmeyecek kadar büyük gibi görünebilir, ancak sabit katlama boyutu ve yürütme süresini neredeyse hiçbir şeye indirgeyemez.
Bu, henüz şaşırmadığım bir evrim örneği olarak görülüyor.
Karanlık programlama günlerinde, tek bir DOSYA'nın derlenmesi dakikalar alabilir. Bir program modülerleştirilmişse, gerekli başlık dosyalarının eklenmesi (önceden derlenmiş başlık seçenekleri yoktur) önemli bir ek yavaşlama nedeni olacaktır. Ek olarak, derleyici, muhtemelen otomatik bir takas dosyası kullanmadan, bazı bilgileri diskte tutmayı seçebilir / buna ihtiyaç duyabilir.
Bu çevresel faktörlerin devam eden kalkınma uygulamalarına aktardığı ve zaman içinde ancak yavaşça adapte olduğu alışkanlıklar.
Tek bir dosyayı kullanmanın kazandığı zaman, HDD'ler yerine SSD'leri kullandığımıza benzerdi.