Реализация стандартных библиотек

Существует много реализаций стандартной библиотеки, например, языка Си. У меня некоторая путаница. :(

  1. Эти реализации создавались для определенных ОС или для определенных компиляторов?
  2. Почему компилятор может работать только с одной стандартной библиотекой?

Ответы (3 шт):

Автор решения: Harry

Стандартная библиотека потому и стандартная, что определена в стандарте языка. В нем определено, как выглядят функции, классы, переменные (их интерфейс), а также как они должны работать (назовем это контракт) - т.е. если это алгоритм - какова должна быть его сложность, если это, скажем, математическая функция - какова ее область определения, или какие действия она должна выполнять при успешном выполнении и в случае каких-то сбоев. Что именно должно быть внутри - стандарт не оговаривает. Так что, например, разработчики могут использовать некоторые нестандартные возможности своего компилятора.

Команда разработчиков имеет право в рамках указанных в стандарте ограничений работать так, как считает наиболее верным и эффективным - для данного компилятора, данной операционной системы, данной аппаратной архитектуры.

Естественно, компилятор привязан к своей библиотеке - хотя бы потому, что их разрабатывала одна команда, и с другими компиляторами вполне может быть какая-то внутренняя несовместимость, тем более что библиотеки поставляются в основном не в виде исходных текстов, а в уже скомпилированном виде, для тех или иных условий работы (разрядность, метод компоновки, отладочная информация и т.п.). Могут отличаться сами бинарные форматы. И вообще - родное :) - оно всегда лучшее и надежное решение. Грубо говоря, к кому вы будете предъявлять претензии, если другая реализация не заработает с вашим компилятором? :) Обратите внимание - сторонние библиотеки поставляются в основном либо как исходные тексты, которые вы должны компилировать своим компилятором, либо как набор бинарных библиотек для разных компиляторов/операционных систем.

"По-моему, так". (с) Пух

→ Ссылка
Автор решения: return
  • Каждый компилятор имеет 1-у стандартную библиотеку (причина: для другой std-либы есть другой компилятор + "вшитая" совместимость, например):
#include <stdio.h> // компилятор автоматически передаст линковщику необходимую часть библиотеки
  • Каждый компилятор делается для определённого набора OS с специальной реализацией для каждой OS. Также возможно такое, что часть либы будет кросс-платформенная, а часть – нет. В таких случаях, обычно, их не кросс-платформенная реализация находится в виде вот таких файлов (не обязательно именно такие файлы с именно такими именами):
some.h
some.<OS>.c
    some.windows.c
    some.macos.c
    some.linux.c
    ...

...или их более коротких версий (например, some.win[dows].c).


Итог:

  • У компилятора своя 1 std-либа
  • std-либа компилятора реализуется для своего набора OS, задаваемым самим компилятором (точнее, его разработчиками)
→ Ссылка
Автор решения: avp

Эти реализации создавались для определенных ОС или для определенных компиляторов?

ответ очевиден -- некотрые да, в то время как другие, нет (они кроссплатформены).

Почему компилятор может работать только с одной стандартной библиотекой?

это сильное утверждение. Вообще говоря, с какой библиотекой соберете и установите компилятор, с той и будет работать (если они окажутся друг с другом совместимы).

Кстати, не совсем понятно, что вы имеете в виду говоря о работе компилятора с библиотекой?

Тут напрашиваются 3 варианта:

  1. Это библиотека, которую использует компилятор, когда сам работает, т.е. в процессе компиляции программы пользователя.

  2. Библиотека, вызовы которой компилятор подставляет в некоторых случаях в генерируемый им код.

  3. Та библиотека, функции которой вы явно вызываете из своей программы.
    (о ней программа компилятора обычно ничего не знает, что подсунете линкеру, с тем он объектники и соберет)

→ Ссылка