Чому використання бібліотек C ++ настільки складне?


14

Перш за все, хочу зазначити, що я люблю C ++, і я один з тих людей, хто думає, що простіше кодувати в C ++, ніж Java. За винятком однієї крихітної речі: бібліотеки.

На Java ви можете просто додати трохи баночки до шляху збирання, і ви закінчите.

У C ++ вам зазвичай доводиться встановлювати кілька шляхів для файлів заголовків та самої бібліотеки. У деяких випадках вам навіть доводиться використовувати спеціальні прапори для складання. Я в основному використовував Visual Studio, Code Blocks і зовсім не IDE. Усі 3 варіанти не сильно відрізняються, якщо говорити про використання зовнішніх бібліотек.

Цікаво, чому для цього не було зроблено простішої альтернативи? Як у спеціальному .zip-файлі, який має все необхідне в одному місці, щоб IDE міг виконати всю роботу за налаштування прапорів збірки. Чи є якийсь технічний бар’єр для цього?

Відповіді:


15

C ++ був розроблений з метою вдосконалення мови С, роблячи простішу, більш автоматизовану мову з підтримкою об'єктно-орієнтованого програмування. Але це не зробило нічого, щоб змінити або покращити спосіб обробки C із зовнішніми бібліотеками та файлами заголовків. C ++ не має модульної системи, як більш сучасні мови - вона все ще використовує систему препроцесорів і лінкерів. Оскільки однією із заявлених цілей C ++ була зворотна сумісність із кодом C, це насправді не дивно. Будь-яка система модулів C ++ повинна працювати поруч зі старою системою заголовків файлів / зв'язків. Комітет зі стандартів C ++ просто не задумався розробити більш сучасну модульну систему. (Хоча вони над цим працюють, дивіться коментар Клайма нижче.)


8
Останній рядок не зовсім коректний: система модулів працює з 2004 року (перший документ), але передбачала стільки роботи, що навіть не можна було реально передбачити останній стандарт, оскільки не було б можливості впровадити підтримати пропозицію. Ця реалізація була розроблена суттєво (разом з іншими проектами), щоб додати наступний стандарт C ++. Справа не в тому, що це не пріоритет дизайнерів C ++, це лише одна з цих функцій, з якою ви не можете помилитися, потрібно зберігати ретро-сумісність (з більшістю коду С та C ++ 11), і це важко важко отримати правильно. Так що потрібно багато часу.
Клайм

Дивовижно. Дякую, Клайме, за інформацію. Обов’язково це перевірять. Це дуже хвилююче :)
Піджун

Більшість мов залишаються поза справою стандартизації зв’язків, оскільки механізм може відрізнятися між операційними системами. Природа Java в будь-якому місці вимагає встановлення певного формату зв'язку та бібліотеки. У цьому немає нічого поганого, але це приносить деякі накладні витрати, які можуть бути не бажаними у всіх випадках.
Blrfl

Чесно кажучи, я дуже переляканий, читаючи, що комітет зі стандартів C ++ працює над модульною системою для самої мови . C ++ - це вже величезна і складна мова, і намагатися додати до неї таку чутливу особливість може бути дуже ризикованим. Як зазначає Карл Білефельдт тут нижче, ця проблема вже знайшла вдале рішення на платформенному рівні (система пакетних пакетів Linux) і, ймовірно, може бути вирішена дуже добре більшості ІДЕ з невеликими зусиллями. Подивіться, наприклад, як Qt Library і Qt Creator вирішують це питання, наприклад.
AlexBottoni

1
@ АлексБоттоні, я дуже сумніваюся, що вони придумають стандартизовану модульну систему будь-коли цього століття. Вони навіть не включали поняття в C ++ 11, оскільки не могли домовитися про точну реалізацію. Модульна система, яка працює поряд із системою заголовків / лінкерів, ще більш складна, і ми, мабуть, не будемо її бачити дуже довго.
Чарльз Сальвія

2

Це не технічний бар'єр. В Linux ваш "спеціальний zip-файл" - це пакет бібліотеки, який ви встановлюєте за допомогою менеджера пакунків, а налаштування прапорів include і linker настільки ж просто, як додавання до нього рядків, configure.acякий використовує pkg-config для налаштування речей.

Pkg-config також доступний і для Windows, але культурні бар'єри перешкодили його широкому застосуванню. У Unix є потужна історія включення портативності, поширюючи вихідний код, тому вони включають інструменти розробки безкоштовно. Windows має істотну історію заохочення лише бінарного розповсюдження та заряджання розробників інструментів. Коли ви робите свої гроші, продаючи бібліотеки, третім сторонам не має сенсу спрощувати їх надання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.