Dlaczego korzystanie z bibliotek C ++ jest tak skomplikowane?

14

Przede wszystkim chcę zauważyć, że uwielbiam C ++ i jestem jedną z osób, które uważają, że łatwiej jest pisać w C ++ niż Java. Z wyjątkiem jednej drobnej rzeczy: bibliotek.

W Javie możesz po prostu dodać słoik do ścieżki kompilacji i gotowe.

W C ++ zwykle musisz ustawić wiele ścieżek dla plików nagłówkowych i samej biblioteki. W niektórych przypadkach musisz nawet użyć specjalnych flag kompilacji. Korzystałem głównie z Visual Studio, Code Blocks i żadnego IDE. Wszystkie 3 opcje nie różnią się zbytnio, gdy mówimy o korzystaniu z bibliotek zewnętrznych.

Zastanawiam się, dlaczego nie było na to prostszej alternatywy? Jak posiadanie specjalnego pliku .zip, który zawiera wszystko, czego potrzebujesz w jednym miejscu, dzięki czemu IDE może wykonać całą pracę, konfigurując flagi kompilacji. Czy jest na to jakaś bariera techniczna?

Pijusn
źródło

Odpowiedzi:

15

C ++ został zaprojektowany w celu ulepszenia języka C poprzez stworzenie łatwiejszego, bardziej zautomatyzowanego języka z obsługą programowania obiektowego. Ale nic nie zmieniło ani nie poprawiło sposobu, w jaki C obsługuje biblioteki zewnętrzne i pliki nagłówkowe. C ++ nie ma systemu modułów podobnego do bardziej nowoczesnych języków - nadal korzysta z preprocesora C i systemu linkera. Ponieważ jednym z deklarowanych celów C ++ była zgodność wsteczna z kodem C, nie jest to tak naprawdę zaskakujące. Każdy system modułów C ++ musiałby współpracować ze starym systemem plików nagłówka / linkera C. Komitet ds. Standardów C ++ po prostu nie zajął się projektowaniem bardziej nowoczesnego systemu modułów. (Chociaż pracują nad tym, zobacz komentarz Klaima poniżej.)

Charles Salvia
źródło
8
Ostatnia linia nie jest całkowicie poprawna: system modułów działa od 2004 r. (Pierwszy dokument), ale pociąga za sobą tyle pracy, że nie można było nawet przewidzieć ostatniego standardu, ponieważ nie byłoby wdrożenia poprzeć propozycję. Ta implementacja była w wortk (wraz z innymi wersjami roboczymi), aby tartget następny standard C ++. To nie jest tak, że nie jest to priorytetem projektantów C ++, to tylko jedna z tych funkcji, których nie można się pomylić, trzeba zachować kompatybilność wsteczną (z większością kodu C i C ++ 11) i jest to niezwykle trudne do uzyskania. To zajmuje dużo czasu.
Klaim,
Niesamowite. Dziękuję, Klaim, za informację. Na pewno to sprawdzę. To bardzo ekscytujące :)
Pijusn,
Większość języków nie zajmuje się standaryzacją połączeń, ponieważ mechanizm może się różnić w zależności od systemu operacyjnego. Środowisko Java działające w dowolnym miejscu wymaga wprowadzenia określonego formatu powiązania i biblioteki. Nie ma w tym nic złego, ale powoduje to pewne koszty ogólne, które mogą nie być pożądane we wszystkich przypadkach.
Blrfl,
Szczerze mówiąc, boję się przeczytać, że komitet normalizacyjny C ++ pracuje nad systemem modułów dla samego języka . C ++ jest już ogromnym i złożonym językiem, a próba dodania do niego tak wrażliwej funkcji może być bardzo ryzykowna. Jak zauważył tutaj Karl Bielefeldt, problem ten znalazł już dobre rozwiązanie na poziomie platformy (system pakietów Linux) i prawdopodobnie można go rozwiązać bardzo dobrze przez większość IDE przy niewielkim wysiłku. Zobacz na przykład, jak Biblioteka Qt i Kreator Qt radzą sobie z tym problemem, na przykład.
AlexBottoni,
1
@AlexBottoni, naprawdę wątpię, aby opracowali znormalizowany system modułów w dowolnym momencie tego stulecia. Nie uwzględnili nawet koncepcji w C ++ 11, ponieważ nie mogli uzgodnić dokładnej implementacji. System modułów współpracujący z systemem nagłówka / linkera jest jeszcze trudniejszy i prawdopodobnie nie zobaczymy go przez bardzo długi czas.
Charles Salvia,
2

To nie jest bariera techniczna. W Linuksie „specjalny plik zip” jest pakietem tworzonym przez bibliotekę instalowanym za pomocą menedżera pakietów, a konfigurowanie flag włączania i łączenia jest tak proste, jak dodawanie kilku linii do pliku, configure.acktóry używa pkg-config do konfiguracji .

Pkg-config jest również dostępny dla systemu Windows, ale bariery kulturowe uniemożliwiły jego powszechne zastosowanie. Unix ma długą historię umożliwiania przenośności poprzez dystrybucję kodu źródłowego, dlatego zawierają narzędzia programistyczne za darmo. Windows ma długą historię zachęcania programistów do dystrybucji binarnej i pobierania opłat za narzędzia. Kiedy zarabiasz na sprzedaży bibliotek, nie ma sensu ułatwiać ich osobom trzecim.

Karl Bielefeldt
źródło