Statik ve paylaşılan kütüphaneler arasındaki fark nedir?


560

Statik ve paylaşılan kütüphaneler arasındaki fark nedir?

Eclipse kullanıyorum ve Statik Kütüphaneler ve Paylaşılan Kütüphaneler gibi çeşitli proje türleri var mı? Birinin diğerine göre bir avantajı var mı?


4
Wikipedia'nın statik, dinamik ve paylaşılan kütüphaneler arasındaki ayrımın iyi bir açıklaması vardır .
Adam Holmberg

Yanıtlar:


745

Paylaşılan kütüphaneler .so (veya Windows .dll veya OS X .dylib) dosyalarıdır. Kütüphaneyle ilgili tüm kodlar bu dosyadadır ve çalışma zamanında onu kullanan programlar tarafından referans verilir. Paylaşılan kitaplığı kullanan bir program yalnızca paylaşılan kitaplıkta kullandığı koda başvurur.

Statik kütüphaneler .a (veya Windows .lib) dosyalardır. Kütüphaneyle ilgili tüm kodlar bu dosyadadır ve derleme zamanında doğrudan programa bağlanır. Statik kitaplık kullanan bir program, kullandığı kodun statik kitaplıktan kopyalarını alır ve programın bir parçası haline getirir. [Windows ayrıca .dll dosyalarına başvurmak için kullanılan .lib dosyalarına sahiptir, ancak ilk dosya ile aynı şekilde çalışırlar].

Her yöntemin avantajları ve dezavantajları vardır:

  • Paylaşılan kitaplıklar, kitaplıkları kullanan her programda çoğaltılan kod miktarını azaltır ve ikili dosyaları küçük tutar. Ayrıca, paylaşılan nesneyi işlevsel olarak eşdeğer olan, ancak onu kullanan programı yeniden derlemenize gerek kalmadan performans avantajları eklenmiş olabilecek bir nesneyle değiştirmenize de olanak tanır. Bununla birlikte, paylaşılan kütüphaneler, işlevlerin yürütülmesi için küçük bir ek maliyete ve çalışma zamanı yükleme maliyetine sahip olacaktır, çünkü kütüphanedeki tüm sembollerin kullandıkları şeylere bağlanması gerekir. Ayrıca, paylaşılan kütüphaneler, ikili eklenti sistemlerinin uygulanması için genel mekanizma olan çalışma zamanında bir uygulamaya yüklenebilir.

  • Statik kütüphaneler ikilinin toplam boyutunu arttırır, ancak kullanılan kütüphanenin bir kopyasını yanınızda taşımanız gerekmez. Kod derleme zamanında bağlandığından, ek çalışma zamanı yükleme maliyeti yoktur. Kod sadece orada.

Şahsen, paylaşılan kütüphaneleri tercih ederim, ancak ikili kütüphanenin C ++ standart kütüphanesinin belirli sürümleri veya Boost C ++ kütüphanesinin belirli sürümleri gibi karşılamak için zor olabilecek birçok dış bağımlılığa sahip olmadığından emin olmak gerektiğinde statik kütüphaneler kullanıyorum.


2
"paylaşılan nesneyi yerine ... işlevsel olarak eşdeğer, ancak performansı artırabilir": özellikle, API'nin semantik kullanımında eşdeğer çağıran işlevsellik (uygulama programlama arabirimi: işlev imzaları ve türleri içeren değişkenler), ancak uygulama tarafı işlevsellik perf'den daha fazla farklılık gösterebilir .: örneğin işlev her zaman dosyaya oturum açar -> ayrıca TCP sunucusunda oturum açar: $ MY_APP_LOG_SERVER içinde beklenen bağlantı noktası.
Tony Delroy

1
"[.sos a) işlevlerin yürütülmesi için küçük bir ek maliyet" - bu mümkündür (işlev grupları / sıralama statik bağlantıdaki önbellek yeri için optimize edilmişse veya işletim sistemi / yükleyici / derleyici / mimari gibi gariplikler nedeniyle -segment / büyük işaretçi mükemmel cezalar), ancak birçok mimaride / derleyici ayarında dinamik bağlayıcı aynı çağrı makinesi opcodeslerini oluşturmak için çağrıyı yamalar.
Tony Delroy

2
"Kod derleme zamanında bağlandığından, ek çalışma zamanı yükleme maliyeti yoktur. Kod basitçe oradadır." - evet ve hayır ... hepsi yürütme gerektiriyorsa sayfalandırılmaya hazır yürütülebilir görüntüde, ancak - programınızın önbellekte olmaya yetecek kadar yeni çalışmadığı bir durumdan başlayarak - paylaşılan kütüphanelerle mümkündür (bazen muhtemelen veya belirli) işletim sisteminin, sürücünün veya başka bir çalışan programın uygulamanızın kullanmak istediği aynı paylaşılan kitaplığı önceden yüklemiş olduğundan emin olun; bu durumda önbellekte olabilir ve programınız daha hızlı başlatılır ve çalışır.
Tony Delroy

15
Bazı insanların bahsetmediği şey, statik kitaplıklarda derleyicinin uygulamanızın hangi işlevlere ihtiyacı olduğunu bilmesi ve daha sonra yalnızca bu işlevleri ekleyerek optimize edebilmesidir. Bu, özellikle büyük bir kütüphanenin gerçekten küçük bir alt kümesini kullanırsanız, kütüphane boyutunu büyük ölçüde azaltabilir!
jduncanator

1
Bu cevap daha iyi organize edilebilir. Artı / eksiler için mermi listeleri veya bir farkın olduğu her boyuttaki farklılıkları göstermek için bir tablo yapmak yararlı olacaktır.
ElefEnt

377

Statik kütüphane kitapçı gibidir ve paylaşılan kütüphane ... kütüphane gibidir. İlkiyle, eve götürmek için kitabın / fonksiyonun kendi kopyasını alırsınız; ikincisi ile siz ve diğer herkes aynı kitabı / işlevi kullanmak için kütüphaneye gidersiniz. Bu yüzden (paylaşılan) kütüphaneyi kullanmak isteyen herkesin nerede olduğunu bilmesi gerekir, çünkü kitabı / işlevi “gitmeye” ihtiyacınız vardır. Statik bir kütüphane ile kitabın / fonksiyonun size ait olması ve onu evinizin / programınızın içinde tutmanız ve bir kez sahip olduğunuzda nerede veya ne zaman aldığınız umurumda değil.


70

Basitleştirilmiş:

  • Statik bağlantı: bir büyük yürütülebilir dosya
  • Dinamik bağlantı: küçük bir yürütülebilir dosya artı bir veya daha fazla kütüphane dosyası (Windows'ta .dll dosyaları, Linux'ta .so veya macOS'ta .dylib)

1
Bu cevap benim için en iyisi çünkü pratik. Bilgisayarda gerçekte neler olup bittiğinden bahsetmeyen bir metafordan çok daha mantıklı. Bunun olduğunu bildikten sonra, sezgisel olarak diğer tüm sonuçları biliyorum.
off99555

36

Statik bir kitaplık için kod, bağlayıcı tarafından kitaplıktan çıkarılır ve uygulamanızı derlediğiniz / oluşturduğunuz noktada son yürütülebilir dosyayı oluşturmak için kullanılır. Son yürütülebilir dosyanın çalışma zamanında kitaplığa bağımlılığı yoktur

Paylaşılan bir kitaplık için, derleyici / bağlayıcı, uygulama oluşturulduğunda bağlandığınız adların kitaplıkta var olup olmadığını kontrol eder, ancak kodlarını uygulamaya taşımaz. Çalışma zamanında, paylaşılan kitaplık kullanılabilir olmalıdır.

C programlama dilinin kendisinin statik veya paylaşılan kitaplık kavramı yoktur - tamamen bir uygulama özelliğidir.

Şahsen, yazılım dağıtımını kolaylaştırdığı için statik kütüphaneleri kullanmayı tercih ederim. Bununla birlikte, bu geçmişte çok (figüratif) kanın aktığı bir görüştür.


5
+1 için "C programlama dilinin kendisinde statik veya paylaşılan kitaplık kavramı yoktur - bunlar tamamen bir uygulama özelliğidir."
Tiger

1
Merhaba anon / @Tiger, neden "C programlama dilinin kendisinin statik ya da paylaşılan kitaplık kavramı yok - bunlar tamamen bir uygulama özelliğidir." Lütfen biraz ayrıntılı olarak açıklayabilir veya beni uygun referansa yönlendirebilir misiniz?
Sunil Shahu

@SunilShahu Programın nasıl derlendiği ve bağlandığı, kullandığınız derleyiciye ve bağlayıcıya, yani dilin özel uygulamasına özgüdür. Dil özellikleri genellikle dillerin nasıl uygulanması veya oluşturulması gerektiğini, yalnızca işlevsellik, sözdizimi, dilbilgisi vb.
Tanımlamaz

@SunilShahu daha belirgin örnekler, örneğin, belirtimin (EcmaScript) dilin özelliklerini açıkladığı JavaScript olabilir, ancak JS yorumlayıcılarını (örneğin tarayıcı motorları veya Node.js) gönderen farklı satıcılardır. Öte yandan, Python Programlama Dili'nin çeşitli uygulamaları vardır. Resmi olan CPython, ancak başka dillerde yazılmış başkaları da var.
JC Rocamonde

31

Statik kütüphaneler bir uygulamanın parçası olarak derlenirken, paylaşılan kütüphaneler derlenmez. Paylaşılan liberlere bağlı bir uygulamayı dağıtırsanız, kütüphaneler, ör. MS Windows üzerinde dll yüklü olması gerekir.

Statik kütüphanelerin avantajı, uygulamayı çalıştıran kullanıcı için herhangi bir bağımlılığın gerekli olmamasıdır - örneğin DLL'lerini herhangi bir şekilde yükseltmeleri gerekmez. Dezavantajı, uygulamanızın boyutunun daha büyük olmasıdır, çünkü ihtiyacınız olan tüm kütüphanelerle birlikte gönderiyorsunuz.

Paylaşılan kitaplıklar, daha küçük uygulamalara yol açmanın yanı sıra, kullanıcıya uygulamanın bir parçası olandan ziyade kendi kitaplıklarını, belki de daha iyi bir sürümünü kullanma olanağı sunar


3
Bilindiği gibi DLL cehennem
gheese

1
"Statik kütüphaneler bir uygulamanın parçası olarak derlenir" ... statik kütüphaneler statik kütüphaneler olarak derlenir ve bir uygulamanın parçası olarak bağlanır
idclev 463035818

19

Paylaşılan kitaplıkların en önemli avantajı, kitaplığı kaç işlem kullanıyor olursa olsun, belleğe yüklenen kodun yalnızca bir kopyasının olmasıdır. Statik kütüphaneler için her işlem kodun kendi kopyasını alır. Bu önemli bellek israfına yol açabilir.

Statik kütüphanelerin bir avantajı olan OTOH, her şeyin uygulamanızda bir araya gelmesidir. Bu nedenle, istemcinin sistemlerinde doğru kitaplığa (ve sürüme) sahip olduğundan endişelenmenize gerek yoktur.


1
statik görüntü kullanılırken disk üzerinde ve bellekte yürütülebilir görüntü daha büyüktür.
JustJeff

Bu doğru, her şeyin uygulamanızda bir araya geldiğini söylediğimde bunu ifade ediyordum.
Jasmeet

Ayrıca, .so* nix sistemlerindeki dosyalar biraz paylaşılan (dinamik) kütüphanedir.
snr

6

Diğer tüm cevapların yanı sıra, henüz bahsedilmeyen bir şey de ayrıştırmaktır:

İlgilendiğim gerçek bir dünya üretim kodu hakkında konuşmama izin verin:

300'den fazla projeden (görsel stüdyo ile) yapılmış çok büyük bir yazılım, çoğunlukla statik lib olarak inşa edilir ve son olarak büyük bir yürütülebilir dosyada birbirine bağlanır, aşağıdaki sorunlarla karşılaşırsınız:

-Bağlantı süresi çok uzun. Diyelim ki 10 dakikadan fazla derleme zamanı -Bazı araçlar dizinde, kodu kullanması gereken bellek kontrol araçları gibi büyük bir yürütülebilir dosya ile bağlantı kurabilirler. Aptal olarak görülen sınırlara ulaşabilirsin.

Daha sorunlu olan, yazılımınızın ayrıştırılmasıdır: bu gerçek dünya örneğinde, her projenin başlık dosyalarına diğer projelerden erişilebilir. Sonuç olarak bir geliştiricinin bağımlılık eklemesi son derece kolaydı; sadece üstbilgiyi eklemekle ilgiliydi, çünkü sonunda bağlantı allwaws sembolleri bulacak. Korkunç bisiklet bağımlılıkları ve tam karışıklık ile sonuçlanır.

Paylaşılan kitaplıkla, geliştiricinin bağımlı kitaplığı eklemek için proje oluşturma sistemini düzenlemesi gerektiğinden, bu biraz fazladan bir iştir. Paylaşılan kütüphane kodunun daha temiz bir kod API'si sunma eğiliminde olduğunu gözlemledim.


2
-------------------------------------------------------------------------
|  +-  |    Shared(dynamic)       |   Static Library (Linkages)         |
-------------------------------------------------------------------------
|Pros: | less memory use          |   an executable, using own libraries|
|      |                          |     ,coming with the program,       |
|      |                          |   doesn't need to worry about its   |
|      |                          |   compilebility subject to libraries|
-------------------------------------------------------------------------
|Cons: | implementations of       |   bigger memory uses                |
|      | libraries may be altered |                                     |
|      | subject to OS  and its   |                                     |
|      | version, which may affect|                                     |
|      | the compilebility and    |                                     |
|      | runnability of the code  |                                     |
-------------------------------------------------------------------------
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.