Почему стандартная библиотека C поставляется в комплекте с компилятором, а не с ОС?

#c #c

#c #c

Вопрос:

Извините, если это наивный вопрос, но есть кое-что, чего я не могу понять.

Почему стандартная библиотека C поставляется в комплекте с различными реализациями компилятора ( g ‘s libstdc и clang ‘s libc ) вместо того, чтобы поставляться в комплекте с (UNIX-подобной) операционной системой, как, скажем, стандартная библиотека C? Почему она не поддерживается вместе с библиотекой C, учитывая, что это ее надмножество?

Комментарии:

1. @40two Ну, это неоднозначно, вы правы. Чтобы уточнить, я имею в виду, почему они не поддерживаются под одной и той же эгидой, скажем, например, в рамках glibc или другого проекта стандартной библиотеки C.

2. Компилятор и библиотека должны согласовать двоичный интерфейс, используемый для библиотеки. Компиляторы C (в основном) согласны с общим соглашением о вызовах и тому подобным, поэтому довольно легко поддерживать библиотеку отдельно от компилятора. Компиляторы C чаще имеют различия в соглашениях о вызовах и тому подобном, поэтому библиотеку необходимо компилировать отдельно для каждого.

3. Это не так. Рассмотрено в этом сообщении в блоге .

4. Наличие ОС не означает, что вам нужна стандартная библиотека C . Но наличие компилятора C почти наверняка делает.

5. @Mysticial: библиотека libc, которая поставляется с Windows, не предназначена для использования в приложениях. Смотрите: blogs.msdn.com/b/oldnewthing/archive/2014/04/11/10516280.aspx

Ответ №1:

Основная причина в том, что не существует стандартного C ABI — каждый компилятор имеет тенденцию иметь свой собственный ABI, который отличается от и несовместим с другими компиляторами. С другой стороны, большинство операционных систем определяют стандартный C ABI, который они используют, и предоставляют стандартную библиотеку C для, и все компиляторы C для этой ОС поддерживают этот ABI.

Комментарии:

1. 1 за фактическое прочтение вопроса и ответ на конкретный вопрос, который он задает (почему C имеет одну библиотеку на компилятор, в то время как все компиляторы C, как правило, используют одну и ту же библиотеку), а не просто комментируют тангенциальную точку (т. Е. Технически библиотека C также не является частью ОС).

2. На самом деле Херб Саттер (Herb Sutter) (из Microsoft) пытается получить стабильный ABI для C с моделью, подобной C, см. n4028: Определение переносимого C ABI .

3. @MatthieuM.: К сожалению, состояние этого предложения на самом деле представляет собой всего лишь (неполный) набор предлагаемых требований и ничего конкретного. Проблема в том, что существует множество подводных камней, связанных с определениями наследования и виртуальных функций и поддержанием обратной совместимости, при этом нет хорошего способа их устранения

4. @ChrisDodd: Да, я все еще надеюсь, что до C 17 еще есть время 🙂

5. Черт, ваш ответ был на обзоре Firsts Posts , и я просто хотел спросить, говорили ли вы об API вместо ABI. Я потерпел неудачу, потому что нажал на комментарий… Я чувствую, что меня обманули 🙂

Ответ №2:

Операционные системы в целом не поддерживают языки. Они поддерживают только свои собственные системные вызовы. В большинстве операционных систем эта поддержка предоставляется как часть библиотеки C, поскольку C имеет связь самого низкого уровня. Другие языки и среды выполнения (такие как C , python и т. Д.) Строят свою поддержку во время выполнения поверх библиотеки поддержки системных вызовов ОС.

Комментарии:

1. UNIX и C были разработаны вместе одной и той же группой людей, поэтому системы UNIX и, следовательно, POSIX поддерживают C и C, которые во многих отношениях тесно связаны с ОС.

Ответ №3:

Библиотека C также поддерживается отдельно: как glibc, так и msvcr для Windows * (не знаю подробностей на Mac). Тот факт, что is «поставляется с ОС», заключается в том, что все (большинство) двоичные файлы связаны с ним, поэтому без него ничего не будет работать. Конечно, то же самое можно сказать и о стандартной библиотеке C , но не такой строгой.

Компилятор часто предоставляет расширения, которые разработчики библиотек используют для облегчения разработки. При реализации новой функции библиотека адаптируется. Иногда эти изменения нарушают работу. В случае glibc/ libstdc (/libc ?) Обратная совместимость поддерживается внутри библиотеки (с использованием символов с версиями). В случае CRT для Windows появились различные несовместимые версии стандартных библиотек C и C , связанные с каждой версией компилятора. Также: в случае Visual Studio компилятор имеет тенденцию разрывать ABI между версиями, поэтому «ОС» должна поставляться со всеми версиями библиотек.

PS: конечно, для Windows, возможно, было бы «чище» включать новые версии CRT / C lib в Центр обновления Windows. Другие варианты были сделаны еще тогда, и большинство из них застряли до сих пор.

Комментарии:

1. К сожалению, некоторые приложения обращаются к внутренним компонентам среды выполнения Visual Studio C, что, безусловно, является ошибкой приложения, но понятно, что команда Visual Studio не хочет ломать эти приложения.

Ответ №4:

Исходный код библиотеки C поставляется в комплекте с исходными текстами GCC. Это имеет смысл, потому что библиотека C идет рука об руку с языком C . Это не компонент операционной системы. Некоторые ее аспекты, такие как управление памятью и ввод-вывод, взаимодействуют с возможностями ОС, но большая часть этого не делает.

С другой стороны, фактическое объединение библиотеки C — это работа дистрибутива операционной системы (например, какой-то разновидности GNU / Linux).

В конечном счете, именно ваш дистрибутив определяет, как упакован libstdc . Например, может иметь смысл, чтобы это был отдельный пакет (который может даже появиться в нескольких версиях). Это связано с тем, что libstdc предоставляет разделяемую библиотеку, и эта разделяемая библиотека необходима как зависимость для других пакетов, независимо от того, установлен компилятор или нет. И некоторые пакеты могут работать только с определенной версией этой библиотеки.

«Часть ОС» или «часть компилятора» на самом деле не имеют смысла: вопрос в том, «часть какого пакета», и это зависит от дистрибутива, потому что при сборке пакета GCC ваши скрипты сборки могут затем разделить временное дерево установки на произвольные пакеты на основеваше видение того, как организовать дистрибутив.

Предположим, мы создали дистрибутив ОС «ceeplusplusy». Тогда библиотеку C можно было бы считать важным компонентом ОС. То есть предположим, что основные приложения, которые необходимы только для запуска ОС, все переписаны на C и все используют библиотеку: такие вещи, как системный демон, оболочка, «getty» и так далее. Тогда библиотека C необходима на ранних этапах загрузки. В конечном счете, что такое ОС, а что нет?

Ответ №5:

На Mac вы найдете как libc.dylib (стандартная библиотека C), так и libc .dylib (стандартная библиотека C ) в каталоге /usr/lib . На устройстве iOS вы их не найдете (легко), но они оба там тоже есть. Совершенно очевидно, что они не являются частью компилятора, потому что они необходимы практически для запуска всех программ, и они присутствуют, даже если вы никогда не устанавливали никаких компиляторов.