Perbedaan antara perpustakaan statis dan terbagi?

560

Apa perbedaan antara perpustakaan statis dan shared?

Saya menggunakan Eclipse dan ada beberapa jenis proyek termasuk Static Libraries dan Shared Libraries? Apakah yang satu memiliki keunggulan dibandingkan yang lain?

Mohit Deshpande
sumber
4
Wikipedia memiliki deskripsi yang baik tentang perbedaan antara perpustakaan statis, dinamis, dan terbagi.
Adam Holmberg

Jawaban:

745

Pustaka bersama adalah file .so (atau Windows .dll, atau OS X .dylib). Semua kode yang berkaitan dengan perpustakaan ada di file ini, dan direferensikan oleh program yang menggunakannya saat run-time. Program yang menggunakan perpustakaan bersama hanya membuat referensi ke kode yang digunakan di perpustakaan bersama.

Perpustakaan statis adalah file .a (atau di Windows .lib). Semua kode yang berkaitan dengan perpustakaan ada di file ini, dan secara langsung ditautkan ke program pada waktu kompilasi. Program yang menggunakan perpustakaan statis mengambil salinan kode yang digunakannya dari perpustakaan statis dan menjadikannya bagian dari program. [Windows juga memiliki file .lib yang digunakan untuk referensi file .dll, tetapi mereka bertindak dengan cara yang sama seperti yang pertama].

Ada kelebihan dan kekurangan dalam setiap metode:

  • Pustaka bersama mengurangi jumlah kode yang diduplikasi dalam setiap program yang memanfaatkan pustaka, menjaga biner tetap kecil. Ini juga memungkinkan Anda untuk mengganti objek bersama dengan yang secara fungsional setara, tetapi mungkin telah menambahkan manfaat kinerja tanpa perlu mengkompilasi ulang program yang memanfaatkannya. Akan tetapi, shared library akan memiliki biaya tambahan yang kecil untuk pelaksanaan fungsi serta biaya pemuatan run-time karena semua simbol di perpustakaan perlu dihubungkan ke hal-hal yang mereka gunakan. Selain itu, pustaka bersama dapat dimuat ke dalam aplikasi saat run-time, yang merupakan mekanisme umum untuk menerapkan sistem plug-in biner.

  • Perpustakaan statis meningkatkan ukuran keseluruhan biner, tetapi itu berarti bahwa Anda tidak perlu membawa serta salinan perpustakaan yang sedang digunakan. Karena kode terhubung pada waktu kompilasi, tidak ada biaya pemuatan run-time tambahan. Kode itu ada di sana.

Secara pribadi, saya lebih suka pustaka bersama, tetapi menggunakan pustaka statis ketika perlu memastikan bahwa biner tidak memiliki banyak dependensi eksternal yang mungkin sulit dipenuhi, seperti versi spesifik dari pustaka standar C ++ atau versi spesifik dari pustaka Boost C ++.

Petesh
sumber
2
"ganti objek yang dibagikan dengan ... setara secara fungsional, tetapi dapat [meningkatkan] kinerja": khususnya, fungsionalitas pemanggil yang setara dalam penggunaan semantik API (antarmuka pemrograman aplikasi: tanda tangan fungsi dan variabel termasuk tipe), tetapi sisi implementasi fungsi mungkin berbeda di lebih dari perf .: misalnya fungsi selalu log ke file -> juga masuk ke server TCP: port diharapkan dalam $ MY_APP_LOG_SERVER.
Tony Delroy
1
"[.sos mengeluarkan] biaya tambahan yang kecil untuk pelaksanaan fungsi" - itu mungkin (jika grup fungsi / pemesanan telah dioptimalkan untuk lokalitas cache di tautan statis, atau karena keanehan pada OS / loader / compiler / arsitektur seperti cross -segment / large-pointer perf. penalti), tetapi pada banyak arsitektur / kompiler-pengaturan linker dinamis menambal panggilan untuk membuat opcode mesin panggilan yang sama persis.
Tony Delroy
2
"Karena kode terhubung pada waktu kompilasi, tidak ada biaya pemuatan run-time tambahan. Kode hanya ada di sana." - ya dan tidak ... semuanya ada dalam gambar yang dapat dieksekusi siap untuk ditelusuri jika diperlukan, tetapi - mulai dari situasi di mana program Anda belum berjalan cukup baru dalam cache - dengan perpustakaan bersama itu mungkin (kadang-kadang mungkin atau tertentu) bahwa OS, driver atau program lain yang sedang berjalan telah memuat perpustakaan bersama yang ingin digunakan aplikasi Anda, dalam hal ini mungkin ada dalam cache dan program Anda mulai dan berjalan lebih cepat.
Tony Delroy
15
Apa yang gagal disebutkan oleh beberapa orang adalah bahwa dengan perpustakaan statis kompiler mengetahui fungsi mana yang dibutuhkan aplikasi Anda dan kemudian dapat mengoptimalkannya hanya dengan memasukkan fungsi-fungsi tersebut. Ini dapat mengurangi ukuran perpustakaan secara besar-besaran, terutama jika Anda hanya menggunakan subset yang sangat kecil dari perpustakaan yang sangat besar!
jduncanator
1
Jawaban ini bisa lebih terorganisir. Akan sangat membantu untuk membuat daftar peluru untuk pro / kontra atau tabel untuk menunjukkan perbedaan di setiap dimensi di mana ada perbedaan.
ElefEnt
377

Perpustakaan statis seperti toko buku, dan perpustakaan bersama seperti ... perpustakaan. Dengan yang pertama, Anda mendapatkan salinan buku / fungsi Anda sendiri untuk dibawa pulang; dengan yang terakhir Anda dan semua orang pergi ke perpustakaan untuk menggunakan buku / fungsi yang sama. Jadi siapa pun yang ingin menggunakan pustaka (dibagi) perlu tahu di mana itu, karena Anda harus "pergi mendapatkan" buku / fungsi. Dengan perpustakaan statis, buku / fungsi itu milik Anda, dan Anda menyimpannya di rumah / program Anda, dan begitu Anda memilikinya, Anda tidak peduli di mana atau kapan Anda mendapatkannya.

Paul Richter
sumber
70

Sederhana:

  • Menghubungkan statis: satu executable besar
  • Tautan dinamis: eksekusi kecil ditambah satu atau lebih file perpustakaan (file .dll pada Windows, .so di Linux, atau .dib pada macOS)
StackedCrooked
sumber
1
Jawaban ini adalah yang terbaik bagi saya karena praktis. Itu jauh lebih masuk akal daripada metafora yang tidak berbicara tentang apa yang sebenarnya terjadi di komputer. Setelah mengetahui bahwa inilah yang terjadi, saya secara intuitif mengetahui semua implikasi lain.
off99555
36

Untuk pustaka statis, kode diekstraksi dari pustaka oleh linker dan digunakan untuk membangun yang dapat dieksekusi pada saat Anda mengkompilasi / membangun aplikasi Anda. Eksekusi akhir tidak memiliki dependensi pada perpustakaan pada saat run time

Untuk pustaka bersama, kompiler / penghubung memeriksa apakah nama yang Anda tautkan ada di pustaka saat aplikasi dibuat, tetapi tidak memindahkan kode mereka ke dalam aplikasi. Pada waktu berjalan, perpustakaan bersama harus tersedia.

Bahasa pemrograman C sendiri tidak memiliki konsep perpustakaan statis atau bersama - mereka sepenuhnya merupakan fitur implementasi.

Secara pribadi, saya lebih suka menggunakan perpustakaan statis, karena membuat distribusi perangkat lunak lebih mudah. Namun, ini adalah pendapat di mana banyak darah (kiasan) telah ditumpahkan di masa lalu.


sumber
5
+1 untuk "Bahasa pemrograman C itu sendiri tidak memiliki konsep perpustakaan statis atau terbagi - keduanya sepenuhnya merupakan fitur implementasi."
Tiger
1
Hai anon / @ Tiger, mengapa Anda menyatakan "Bahasa pemrograman C itu sendiri tidak memiliki konsep perpustakaan statis atau bersama - mereka sepenuhnya merupakan fitur implementasi."? Bisakah Anda jelaskan sedikit detail atau tunjuk saya ke referensi yang sesuai?
Sunil Shahu
@SunilShahu Bagaimana program dikompilasi dan ditautkan khusus untuk kompiler dan penghubung yang Anda gunakan, yaitu implementasi spesifik bahasa. Speficikasi bahasa umumnya tidak menggambarkan bagaimana bahasa harus diimplementasikan atau dibangun, hanya fungsionalitas, sintaksis, tata bahasa, dll.
JC Rocamonde
@SunilShahu contoh yang lebih jelas mungkin JavaScript, misalnya, di mana spesifikasi (EcmaScript) menjelaskan fitur-fitur bahasa, tetapi vendor yang berbeda yang mengirim penerjemah JS (mesin browser atau Node.js, misalnya). Di sisi lain, Bahasa Pemrograman Python memiliki beberapa implementasi. Yang resmi adalah CPython, tetapi ada yang lain ditulis dalam bahasa lain.
JC Rocamonde
31

Perpustakaan statis dikompilasi sebagai bagian dari aplikasi, sedangkan perpustakaan bersama tidak. Saat Anda mendistribusikan aplikasi yang bergantung pada perpustakaan yang dibagikan, perpustakaan, mis. dll pada MS Windows perlu diinstal.

Keuntungan dari pustaka statis adalah bahwa tidak ada dependensi yang diperlukan untuk pengguna yang menjalankan aplikasi - misalnya mereka tidak perlu meng-upgrade DLL mereka apa pun. Kerugiannya adalah aplikasi Anda berukuran lebih besar karena Anda mengirimkannya dengan semua perpustakaan yang dibutuhkan.

Selain mengarah ke aplikasi yang lebih kecil, pustaka bersama menawarkan pengguna kemampuan untuk menggunakan pustaka mereka sendiri, mungkin versi yang lebih baik daripada mengandalkan salah satu yang merupakan bagian dari aplikasi

Tarski
sumber
3
DLL sih seperti yang telah diketahui
gheese
1
"Perpustakaan statis dikompilasi sebagai bagian dari aplikasi" ... perpustakaan statis dikompilasi sebagai perpustakaan statis dan terhubung sebagai bagian dari aplikasi
idclev 463035818
19

Keuntungan paling signifikan dari shared library adalah hanya ada satu salinan kode yang dimuat dalam memori, tidak peduli berapa banyak proses yang menggunakan perpustakaan. Untuk pustaka statis, setiap proses mendapatkan salinan kodenya sendiri. Ini dapat menyebabkan pemborosan memori yang signifikan.

OTOH, keuntungan dari perpustakaan statis adalah bahwa semuanya dibundel ke dalam aplikasi Anda. Jadi Anda tidak perlu khawatir bahwa klien akan memiliki perpustakaan yang tepat (dan versi) yang tersedia di sistem mereka.

Jasmeet
sumber
1
gambar yang dapat dieksekusi lebih besar pada disk, serta dalam memori, saat menggunakan lib statis.
JustJeff
Itu benar, itulah yang saya singgung ketika saya mengatakan semuanya dibundel ke dalam aplikasi Anda.
Jasmeet
Selain itu, .sofile pada sistem * nix adalah pustaka yang agak dibagi (dinamis).
snr
6

Di atas semua jawaban lain, satu hal yang belum disebutkan adalah decoupling:

Biarkan saya berbicara tentang kode produksi dunia nyata, yang telah saya tangani:

Perangkat lunak yang sangat besar, terbuat dari> 300 proyek (dengan studio visual), sebagian besar dibangun sebagai lib statis dan akhirnya semua terhubung bersama dalam satu executable besar, Anda berakhir dengan masalah berikut:

Waktu -Link sangat panjang. Anda mungkin berakhir dengan lebih dari 15 menit tautan, karena katakanlah 10 detik waktu kompilasi - Beberapa alat bertekuk lutut dengan alat eksekusi yang besar, seperti alat periksa memori yang harus memasukkan kode. Anda mungkin jatuh ke dalam batas yang telah dianggap bodoh.

Yang lebih bermasalah adalah decoupling dari perangkat lunak Anda: pada contoh dunia nyata ini, file header dari setiap proyek dapat dijangkau dari proyek lain mana pun. Sebagai akibatnya, sangat mudah bagi satu pengembang untuk menambahkan dependensi; itu hanya tentang memasukkan tajuk, karena tautan pada akhirnya akan memunculkan simbol. Itu berakhir dengan ketergantungan bersepeda yang mengerikan dan kekacauan total.

Dengan shared library, ini merupakan pekerjaan ekstra karena pengembang harus mengedit sistem build proyek untuk menambahkan library dependen. Saya mengamati bahwa kode pustaka bersama cenderung menawarkan API kode yang lebih bersih.

kayu pasir
sumber
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  |                                     |
-------------------------------------------------------------------------
snr
sumber