Реализация стандартных библиотек
Существует много реализаций стандартной библиотеки, например, языка Си. У меня некоторая путаница. :(
- Эти реализации создавались для определенных ОС или для определенных компиляторов?
- Почему компилятор может работать только с одной стандартной библиотекой?
Ответы (3 шт):
Стандартная библиотека потому и стандартная, что определена в стандарте языка. В нем определено, как выглядят функции, классы, переменные (их интерфейс), а также как они должны работать (назовем это контракт) - т.е. если это алгоритм - какова должна быть его сложность, если это, скажем, математическая функция - какова ее область определения, или какие действия она должна выполнять при успешном выполнении и в случае каких-то сбоев. Что именно должно быть внутри - стандарт не оговаривает. Так что, например, разработчики могут использовать некоторые нестандартные возможности своего компилятора.
Команда разработчиков имеет право в рамках указанных в стандарте ограничений работать так, как считает наиболее верным и эффективным - для данного компилятора, данной операционной системы, данной аппаратной архитектуры.
Естественно, компилятор привязан к своей библиотеке - хотя бы потому, что их разрабатывала одна команда, и с другими компиляторами вполне может быть какая-то внутренняя несовместимость, тем более что библиотеки поставляются в основном не в виде исходных текстов, а в уже скомпилированном виде, для тех или иных условий работы (разрядность, метод компоновки, отладочная информация и т.п.). Могут отличаться сами бинарные форматы. И вообще - родное :) - оно всегда лучшее и надежное решение. Грубо говоря, к кому вы будете предъявлять претензии, если другая реализация не заработает с вашим компилятором? :) Обратите внимание - сторонние библиотеки поставляются в основном либо как исходные тексты, которые вы должны компилировать своим компилятором, либо как набор бинарных библиотек для разных компиляторов/операционных систем.
"По-моему, так". (с) Пух
- Каждый компилятор имеет 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, задаваемым самим компилятором (точнее, его разработчиками)
Эти реализации создавались для определенных ОС или для определенных компиляторов?
ответ очевиден -- некотрые да, в то время как другие, нет (они кроссплатформены).
Почему компилятор может работать только с одной стандартной библиотекой?
это сильное утверждение. Вообще говоря, с какой библиотекой соберете и установите компилятор, с той и будет работать (если они окажутся друг с другом совместимы).
Кстати, не совсем понятно, что вы имеете в виду говоря о работе компилятора с библиотекой?
Тут напрашиваются 3 варианта:
Это библиотека, которую использует компилятор, когда сам работает, т.е. в процессе компиляции программы пользователя.
Библиотека, вызовы которой компилятор подставляет в некоторых случаях в генерируемый им код.
Та библиотека, функции которой вы явно вызываете из своей программы.
(о ней программа компилятора обычно ничего не знает, что подсунете линкеру, с тем он объектники и соберет)