Apakah perpustakaan C statis disukai? [Tutup]

11

Ada 2 argumen untuk memiliki pustaka bersama:

  1. Ini membantu mengurangi ruang disk.
  2. Ketika pustaka bersama diperbarui, semua binari yang bergantung padanya mendapatkan pembaruan.

Terutama ada satu kelemahan untuk perpustakaan bersama:

  • Mereka (dapat) memperkenalkan neraka ketergantungan.

Pada komputer desktop, keuntungan pertama tidak lagi berlaku. Membuang-buang ruang disk tidak banyak masalah hari ini.

Memiliki binari statis akan memungkinkan kita untuk mendapatkan manajer paket yang jauh lebih baik - maksud saya, neraka ketergantungan akan menjadi hal di masa lalu. Menambahkan program akan hanya menambahkan biner; akhirnya folder untuk membiarkannya menangani file-nya. Menghapus program hanya akan menghapus file ini. Ketergantungan? Hilang.

Keuntungan ke-2 masih ada, tapi saya pikir keuntungan binari statis pada komputer desktop lebih berat daripada itu. Maksudku, bahkan bahasa-bahasa baru seperti Go mengkompilasi semua binari mereka terlepas dari keuntungan shared library, karena kenyamanannya.


Karena salah satu kelebihan utama dari shared library bukanlah masalah besar lagi, apakah C static library masih disukai? Jika demikian, mengapa?

Florian Margaine
sumber
4
Alasan utama bahwa C digunakan lagi adalah khusus karena Anda tidak bekerja pada komputer desktop modern.
Telastyn
18
@ Telastyn saya minta maaf? Sebagian besar perangkat lunak yang diinstal pada komputer desktop saya ditulis dalam C.
Florian Margaine
6
Bit sisi - situs yang tidak dibaca yang dibacanya - Dynamic Linking Dianggap Berbahaya
6
Salah satu manfaat dari perpustakaan dinamis adalah bahwa orang masih dapat memperbarui perpustakaan untuk mengatasi masalah bug, lubang keamanan atau masalah perangkat keras dalam game sumber tertutup berusia 15 tahun Anda yang telah lama berhenti menerima pembaruan. Jenis ceruk tetapi karena permainan yang bagus bukan komoditas, "cukup gunakan program lain" tidak terlalu membantu. Juga penting untuk mematuhi LGPL tanpa membuka sumber kode Anda sendiri.
Doval
4
Anda lupa dua keuntungan lain dari pustaka bersama: 1) pustaka itu dibagikan juga, 2) semua penghubung sangat payah, dan menautkan biner besar sangat tidak menyenangkan. Memisahkan biner menjadi beberapa entitas yang lebih kecil membuat keseluruhan proses jauh lebih dapat ditoleransi.
SK-logic

Jawaban:

9

Premis pertanyaan Anda cacat. Apa yang disukai adalah menempel doktriner dan absolut tanpa pemahaman tentang dasar di belakang mereka (Pemrograman Kargo Cargo?).

Jawaban SO tertaut adalah studi yang menarik dalam topik yang sangat- Pertanyaan itu adalah tentang mengapa kompilasi dengan opsi-statis tidak bekerja, jawaban yang Anda tautkan tidak lebih dari kata-kata kasar tentang tidak menggunakan tautan statis. Jika tidak membahas mengapa itu buruk, dan menuntut OP menggunakan tautan dinamis. Sangat disayangkan itu ditandai sebagai jawaban yang benar (jawaban berikut memiliki dua kali lebih banyak suara dan merupakan jawaban yang benar untuk pertanyaan OP) karena meskipun jawaban yang benar ada, itu sangat tersembunyi di antara pendapat dogmatis.

Pertanyaan sebenarnya adalah apa pro dan kontra dari menghubungkan statis vs dinamis dan kapan satu lebih disukai dari yang lain.

mattnz
sumber
2
Jawaban Basile memang memberi tahu Anda secara tepat mengapa ia merekomendasikan penggunaan pustaka bersama: "Mengapa Anda ingin menautkan aplikasi Anda secara statis? Ini umumnya merupakan kesalahan (karena Anda tidak mendapat untung dari pembaruan ke pustaka dinamis sistem). Khususnya penggantian layanan nama fasilitas dari libc menginginkan pustaka dinamis. " Ini bukan" kata-kata kasar "hanya karena Anda tidak setuju dengannya.
Cody Grey
@Cody Jawaban yang ditautkan ke telah diedit sejak saya menyebutnya kata-kata kasar. Satu-satunya pendapat yang saya pegang pada tautan statis dan dinamis adalah menggunakan pendapat yang sesuai dengan kebutuhan Anda, dan memahami kekuatan dan kelemahan pilihan daripada jatuh ke dalam doktrin pemrograman kultus kargo karena "seseorang berkata begitu".
mattnz
Ya, bagian "Khususnya ..." telah ditambahkan. Tidak yakin bagaimana itu mempengaruhi status kata-katanya. Tentu saja saya tidak menganjurkan pemrograman kultus kargo. Hanya saja para pendukung tautan statis (dalam pengalaman saya) sering melewatkan atau meremehkan masalah keamanan. Menghubungkan statis bisa sangat sesuai untuk utilitas sekali pakai, membuat aplikasi mandiri dan karenanya distribusi menjadi lebih mudah. Tetapi aplikasi apa pun yang akan digunakan secara luas atau digunakan untuk produksi harus benar-benar terhubung ke perpustakaan bersama. Tidak ada kerugian nyata: pada tingkat aplikasi ini, Anda sudah membutuhkan proses penyebaran.
Cody Grey
1
Contoh yang baik dari mana penghubung statis sesuai adalah tempat saya bekerja - sistem kritis kehidupan yang besar dan rumit. Setelah modul kritis diuji dan disetujui untuk operasi, perilakunya tidak boleh berubah tanpa melalui 'proses'. Namun, tidak ada bagian penting operasional dan tidak seumur hidup dari sistem (penagihan dan pelaporan) yang memerlukan kontrol yang kurang kuat dan menggunakan tautan dinamis.
mattnz
7

Dari sudut pandang pengembang, penautan dinamis sering kali dapat mempercepat kompilasi / tautan / pengujian Anda.

Dari sudut pandang manajemen paket, ambil libGL, misalnya. Saya memiliki sekitar selusin implementasi berbeda yang tersedia di manajer paket saya, beberapa generik dan beberapa menargetkan kartu grafis tertentu. Jika tidak terhubung secara dinamis, harus ada selusin versi dari setiap program yang terhubung dengan libGL, atau Anda harus menyusun lapisan abstraksi tambahan yang tidak seefisien panggilan fungsi.

Pikirkan masalah keamanan di perpustakaan populer seperti Qt. Dengan tautan dinamis, saya hanya dapat memperbarui satu paket itu, daripada harus mengidentifikasi, mengkompilasi ulang, dan menggunakan setiap paket tunggal yang terhubung di Qt.

Menghubungkan statis mungkin memiliki keuntungan dalam aplikasi sumber tertutup yang dikerahkan secara independen, tetapi dalam manajemen paket sumber terbuka itu lebih menyakitkan daripada membantu.

Karl Bielefeldt
sumber
2
Ini benar (mempercepat pengembangan), tetapi sangat frustasi karena membuatnya menjadi produksi. Contoh kanonik adalah Firefox. Jumlah upaya rekayasa (dalam bentuk hackous mengerikan) yang telah dipercepat untuk meningkatkan resolusi simbol tautan dinamis sehingga Firefox memuat dalam waktu yang wajar benar-benar gila. Kinerja yang jauh lebih baik dapat dicapai dengan biaya rekayasa yang jauh lebih sedikit jika mereka hanya bersedia untuk menautkan semua kode dalam proyek secara statis (sementara masih dinamis menghubungkan perpustakaan sistem dan plugin, jika diinginkan).
R .. GitHub BERHENTI MEMBANTU ICE
5

Pustaka bersama sangat disukai oleh pengelola distribusi Linux karena alasan Anda # 2. Sangat penting bagi mereka bahwa, misalnya, ketika seseorang menemukan bug keamanan di zlib , mereka tidak harus mengkompilasi ulang setiap program yang menggunakan zlib --- tidak hanya biayanya lebih banyak siklus CPU untuk melakukan mengkompilasi ulang, semua orang yang menggunakan distro kemudian harus mengunduh ulang semua program tersebut. Sementara itu, dalam paket yang disediakan oleh distribusi, neraka ketergantungan bukanlah suatu masalah, karena semuanya diuji untuk bekerja dengan set perpustakaan itu.

Jika Anda sedang membangun perangkat lunak pihak ketiga bahwa kebutuhan perpustakaan yang tidak dalam distribusi Anda, maka statis menghubungkan orang-orang perpustakaan mungkin kurang kerumitan daripada alternatif, dan yang baik itu.

Hal penting lainnya yang perlu diketahui adalah bahwa GNU libcdan GCC libstdc++memiliki komponen yang tidak berfungsi dengan baik jika pustaka terhubung secara statis. Masalah yang paling umum adalah dengan dlopen, karena modul apa pun yang Anda muat dengan dlopenitu sendiri terkait secara dinamislibc.so.6 . Jadi itu berarti sekarang Anda memiliki dua salinan pustaka C di ruang alamat Anda, dan keriuhan terjadi ketika mereka tidak menyetujui salinan mallocstruktur data internal mana (misalnya) yang resmi. Semakin buruk: sejumlah fungsi yang tampaknya tidak ada hubungannya dengan dlopen, suka gethostbynamedan iconv, gunakandlopensecara internal (sehingga perilaku mereka dapat dikonfigurasi-runtime). Untungnya, ABI untuk libc dan libstdc ++ sangat stabil, sehingga Anda tidak akan menemui masalah yang menghubungkan mereka secara dinamis.

zwol
sumber
2

Saya setuju dengan poin terakhir mattnz: pertanyaan ini adalah pertanyaan yang dimuat. Ini mengasumsikan bahwa tautan statis itu buruk. Saya dapat memikirkan dua alasan mengapa ini tidak terjadi:

  • Tautan statis aman: jika pustaka bersama diperbarui sehingga aplikasi menggunakan yang baru (mungkin yang baru menimpa yang lama, atau yang lama dihapus), itu dapat menimbulkan risiko bahwa versi baru merusak aplikasi. Ini adalah perubahan kode di luar lingkup pembaruan resmi untuk aplikasi. Mungkin belum diuji. Menghubungkan statis menghindari ini dengan tidak berbagi perpustakaan secara eksternal. Saya berpendapat bahwa ini merupakan kerugian bagi perpustakaan bersama karena risiko ini. Bagaimana jika versi baru dari shared library memperkenalkan bug baru yang merusak beberapa aplikasi lama?

  • Menghubungkan statis memastikan aplikasi lebih mandiri. Meskipun pustaka bersama dapat dikolokasi dengan executable primer, seringkali pustaka disimpan di lokasi bersama. Aplikasi yang terhubung secara statis lebih mudah untuk memastikan "portable" dalam arti "tidak memerlukan perubahan pada file, direktori atau pengaturan yang dimiliki oleh OS" (pikirkan direktori Windows, registry, / dll).


sumber
Terima kasih telah meningkatkan keunggulan yang ingin saya sebutkan. Namun, jika Anda melihat sebagian besar paket yang disediakan oleh distribusi Linux misalnya, mereka tidak dikompilasi secara statis. Ini tidak tampak bahwa kompilasi statis adalah disukai, setidaknya dari sudut pandang eksternal pandang.
Florian Margaine
1
Pustaka dinamis pada hampir semua OS di luar sana akhir-akhir ini dirancang berdasarkan permintaan. Hanya halaman yang benar-benar digunakan yang ada dalam memori. Jika beberapa aplikasi menggunakan fungsionalitas yang sama, mereka akan berbagi memori dan menggunakan kurang dari kasus perpustakaan statis. Jika beberapa aplikasi menggunakan fungsionalitas berbeda di pustaka yang sama, kedua set fungsionalitas ini akan di-paging, memiliki dampak yang kira-kira sama dengan pendekatan statis.
Alan Shutko
@AlanShutko Saya melakukan perjuangan dan mengetik ulang bagian itu beberapa cara karena apa yang Anda sebutkan. Tidak ada jaminan nyata baik cara, bahkan jika sistem operasi modern dalam praktiknya menawarkan efisiensi perpustakaan bersama dengan overhead statis. Saya akan mengedit lagi.
@Snowman Saya pikir poin dasarnya adalah bahwa pada sistem operasi realistis apa pun yang menyediakan tautan dinamis (Saya tidak tahu ada OS yang menggunakan tautan dinamis tetapi tidak meminta paging) poin kedua Anda tidak tahan air: memori tidak benar-benar digunakan: memori tidak benar-benar digunakan kecuali fungsi tersebut digunakan, dan memori yang digunakan oleh perpustakaan dinamis dapat dibagi di antara berbagai program yang menggunakannya, menjadikan penggunaan memori untuk versi dinamis lebih efisien daripada kurang. Alasan pertama dan ketiga Anda valid, tetapi saya akan menghapus yang kedua: dengan asumsi realistis, itu salah.
Jules
@ Jules Saya setuju, ini adalah titik yang bermasalah dan validitasnya meragukan dalam sistem operasi modern. Saya menghapusnya.
1

Perpustakaan statis dan dinamis masing-masing memiliki kegunaannya sendiri. Melihat satu aplikasi dalam ruang lingkup kami mendapatkan ide yang berbeda tentang apa yang perlu dan apa yang tidak.

Menghubungkan statis secara drastis menyederhanakan penyebaran aplikasi. Tidak harus mendeteksi dan menangani versi yang berbeda. Cukup bakar dan gunakan.

Keuntungan yang jelas dengan perpustakaan dinamis adalah kemampuan untuk menerapkan pembaruan secara mandiri.

Ini adalah salah satu alasan saya membenci maven dan pembangun proyek menghubungkan dinamis serupa lainnya untuk java. Mereka mengharapkan versi pustaka tunggal tersedia di url yang diberikan selamanya. Tidak memahami masalah yang terjadi dalam 10 tahun ketika tidak ada yang bisa mengkompilasi aplikasi karena semua sumber dan stoples hilang.

banyak keripik
sumber
Apakah ada alasan khusus mengapa tidak mungkin bagi program yang menggunakan FooLib1.8untuk dapat memasukkan kode untuk pustaka itu dalam paket yang dapat dieksekusi dengan cara standar, sehingga memungkinkan utilitas pemutakhiran yang dikirimkan FooLib1.9untuk meningkatkan atau menurunkannya? Kode cara disimpan di Classic Macintosh akan membuatnya sangat mudah; adakah alasan mengapa sistem saat ini tidak dapat melakukannya dengan lebih baik?
supercat
@supercat maksud Anda bahwa setiap versi perpustakaan yang diberikan akan tersedia di sistem? Tidak yakin saya mengerti pertanyaannya. Pertanyaan OP diarahkan lebih ke perpustakaan bersama sistem lebar dibandingkan perpustakaan statis yang akan dikemas bersama.
Banyak keripik
Maksud saya adalah bahwa memiliki paket yang dapat dieksekusi termasuk semua perpustakaan yang seharusnya tidak harus menghalangi kemungkinan meningkatkan perpustakaan yang terkandung di dalamnya. Jadi, saya tidak tahu bahwa saya akan menganggap kemampuan untuk meningkatkan hal-hal setelah penempatan sebagai keuntungan dari tidak menggabungkan aplikasi dengan perpustakaannya.
supercat
Jika lisensi perpustakaan yang diberikan memungkinkan Anda untuk mendistribusikannya dengan paket Anda maka itu selalu merupakan cara yang disukai untuk melakukannya. Ini mengurangi jumlah ketergantungan eksternal. Karena Anda akan mendistribusikan semuanya maka mekanik pemutakhiran atau penambalan akan beroperasi dengan cara yang sama dengan statis atau dinamis. Penambalan biasanya didasarkan pada delta biner. Tidak akan ada perbedaan.
Banyak keripik