Mengapa menggunakan perpustakaan C ++ begitu rumit?

14

Pertama-tama, saya ingin mencatat bahwa saya suka C ++ dan saya salah satu dari orang-orang yang berpikir lebih mudah untuk kode dalam C ++ daripada Java. Kecuali satu hal kecil: perpustakaan.

Di Jawa, Anda cukup menambahkan beberapa toples ke jalur build dan selesai.

Dalam C ++ Anda biasanya harus menetapkan beberapa jalur untuk file header dan perpustakaan itu sendiri. Dalam beberapa kasus, Anda bahkan harus menggunakan bendera build khusus. Saya terutama menggunakan Visual Studio, Code Blocks dan tidak ada IDE sama sekali. Semua 3 opsi tidak berbeda jauh ketika berbicara tentang menggunakan perpustakaan eksternal.

Saya bertanya-tanya mengapa tidak ada alternatif yang lebih sederhana untuk ini? Seperti memiliki file .zip khusus yang memiliki semua yang Anda butuhkan di satu tempat sehingga IDE dapat melakukan semua pekerjaan untuk Anda menyiapkan flag build. Apakah ada kendala teknis untuk ini?

Pijusn
sumber

Jawaban:

15

C ++ dirancang untuk meningkatkan bahasa C dengan membuat bahasa yang lebih mudah, lebih otomatis dengan dukungan untuk pemrograman berorientasi objek. Tapi itu tidak melakukan apa pun untuk mengubah atau meningkatkan cara C menangani perpustakaan eksternal dan file header. C ++ tidak memiliki sistem modul seperti bahasa yang lebih modern - C masih menggunakan sistem C preprocessor dan linker. Karena salah satu tujuan C ++ yang disebutkan adalah kompatibilitas dengan kode C, ini tidak terlalu mengejutkan. Sistem modul C ++ apa pun harus bekerja berdampingan dengan sistem file-header / linker C yang lama. Komite standar C ++ sama sekali belum sempat untuk merancang sistem modul yang lebih modern. (Meskipun mereka sedang mengerjakannya, lihat komentar Klaim di bawah ini.)

Charles Salvia
sumber
8
Baris terakhir tidak sepenuhnya benar: sistem modul telah bekerja sejak 2004 (dokumen pertama) tetapi tersirat begitu banyak pekerjaan sehingga bahkan tidak dapat benar-benar dipertimbangkan untuk standar terakhir karena akan ada kurangnya implementasi untuk mendukung proposal. Implementasi itu telah di wortk (bersama dengan draft lain) untuk mendapatkan standar C ++ berikutnya. Bukannya itu bukan prioritas desainer C ++, ini hanya salah satu fitur yang Anda tidak bisa salah, harus tetap retro-commpatibility (dengan sebagian besar kode C dan C ++ 11) dan sangat sulit untuk mendapatkan yang benar. Jadi butuh banyak waktu.
Klaim
Luar biasa. Terima kasih, Klaim, atas informasinya. Pasti akan memeriksanya. Itu sangat mengasyikkan :)
Pijusn
Sebagian besar bahasa menjauhkan diri dari bisnis standardisasi tautan karena mekanismenya dapat bervariasi antar sistem operasi. Sifat run -where Java membutuhkan mandat tautan dan format perpustakaan tertentu. Tidak ada yang salah dengan itu, tetapi membawa beberapa overhead yang mungkin tidak diinginkan dalam semua kasus.
Blrfl
Terus terang, saya cukup takut untuk membaca bahwa komite standar C ++ bekerja pada sistem modul untuk bahasa itu sendiri. C ++ sudah merupakan bahasa yang sangat besar dan kompleks dan mencoba menambahkan fitur sensitif seperti itu bisa sangat berisiko. Seperti dicatat oleh Karl Bielefeldt di sini di bawah ini, masalah ini sudah menemukan solusi yang baik di tingkat platform (sistem paket Linux) dan mungkin dapat diatasi dengan sangat baik oleh sebagian besar IDE dengan sedikit usaha. Lihat bagaimana Perpustakaan Qt dan Pencipta Qt menangani masalah ini, misalnya.
AlexBottoni
1
@AlexBottoni, saya benar-benar ragu mereka akan datang dengan sistem modul standar setiap saat abad ini. Mereka bahkan tidak memasukkan konsep dalam C ++ 11 karena mereka tidak bisa menyetujui implementasi yang tepat. Sistem modul yang bekerja berdampingan dengan sistem header / linker bahkan lebih rumit, dan kita mungkin tidak akan melihatnya untuk waktu yang sangat lama.
Charles Salvia
2

Itu bukan hambatan teknis. Di Linux, "file zip khusus" Anda adalah paket dev perpustakaan yang Anda instal dengan manajer paket, dan mengatur flag include dan linker semudah menambahkan beberapa baris pada Anda configure.acyang menggunakan pkg-config untuk mengatur berbagai hal.

Pkg-config juga tersedia untuk Windows, tetapi hambatan budaya telah mencegah adopsi yang meluas. Unix memiliki sejarah yang kuat untuk memungkinkan portabilitas dengan mendistribusikan kode sumber, sehingga mereka menyertakan alat pengembangan secara gratis. Windows memiliki sejarah yang kuat dengan hanya mendorong distribusi biner dan mengisi daya pengembang untuk alat. Ketika Anda menghasilkan uang dengan menjual perpustakaan, tidak masuk akal untuk memudahkan pihak ketiga untuk menyediakannya.

Karl Bielefeldt
sumber