Стандартная библиотека

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

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

История[править | править исходный текст]

В ранних языках программирования (таких как Фортран, Алгол, Кобол, Бейсик) функциональность, не связанная непосредственно с языком, но необходимая для создания большинства реальных программ, включалась непосредственно в язык и нередко реализовывалась непосредственно на уровне транслятора или среды исполнения (для интерпретируемых языков). К числу таких функций относились прежде всего те, которые было невозможно, неудобно или неэффективно реализовывать средствами самого языка программирования: команды ввода-вывода, вычисление стандартных математических и логических функций, специфические операции с некоторыми типами данных, работа с внешними устройствами, с «сырой» памятью, взаимодействие с операционной системой и прочее. Такой подход был не лишён недостатков: компилятор оказывался привязан не только к архитектуре компьютера, которая статична и меняется не так часто, но и к его программной среде, в первую очередь — к операционной системе, которая может меняться гораздо чаще.

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

В некоторых случаях стандартная библиотека описывается непосредственно в стандарте языка (Python, Perl, Java), в некоторых — отдельными стандартами (Си), иногда она определяется исходя из практического наличия функций в реализациях языка (Basic, Pascal).

Типовые подходы к проектированию[править | править исходный текст]

Существуют два подхода для определения круга задач, которые должна выполнять стандартная библиотека языка программирования.

  • Первый — стандартная библиотека должна содержать в себе только те процедуры и функции, которые используются практически всеми и обладают максимальной универсальностью. В частности, этой позиции придерживается Бьёрн Страуструп, автор языка C++[1]. Одним из оснований этой концепции является простое соображение: чем более специфична предоставляемая библиотекой функциональность, тем труднее реализовать её так, чтобы она в полной мере удовлетворяла требованиям каждого конкретного случая; если библиотечная реализация не будет универсальной и эффективной во всех вариантах применения, то для большинства реальных задач она окажется неподходящей, следовательно — бесполезной.
  • Второй — стандартная библиотека должна содержать в себе максимально возможное количество типичных алгоритмов, обеспечивать простую работу с большинством (в идеале, со всеми) объектами, с которыми может взаимодействовать программа. Одним из примеров реализации этого подхода является язык Python с девизом «Batteries included» (батарейки в комплекте)[2]. Доводом в пользу этого подхода является представление, согласно которому скорость написания программ и их корректность в большинстве случаев важнее эффективности (по крайней мере, для большинства прикладных программ), поэтому лучше всего предоставить программисту максимум готовых, тщательно проверенных механизмов, которые он сможет использовать, чтобы программирование «вручную» было необходимо только для действительно нетривиальных алгоритмов; это сэкономит время и убережёт программиста от технических ошибок в написании того, что уже было реализовано.

Состав[править | править исходный текст]

В зависимости от возможностей языка, стандартная библиотека может содержать:

Обычно стандартная библиотека содержит основные алгоритмы и структуры данных, необходимые для:

Бьёрн Страуструп выдвинул следующие 11 принципиальных требований к средствам, предлагаемым стандартной библиотекой:

  1. Востребованность — быть важными доступными для всех пользователей языка.
  2. Используемость — прямо или косвенно использоваться всеми программистами для решения всех задач, связанных с целями библиотеки.
  3. Эффективность — для большинства применений библиотечная реализация должна быть не хуже реализации тех же механизмов «вручную».
  4. Независимость от алгоритмов — предоставлять возможность задавать алгоритмы в качестве параметров. Например, стандартная функция сортировки должна давать возможность определить любой алгоритм сравнения элементов.
  5. Математическая примитивность — каждая компонента должна предоставлять одну определённую функцию либо группу функций, используемых только совместно.
  6. Удобство, эффективность и безопасность — по крайней мере, в большинстве типичных вариантов применения.
  7. Завершённость — «Стандартная библиотека может оставить множество функций другим библиотекам, но если уж она взялась за какую-то задачу, то должна обеспечить достаточную функциональность, чтобы отдельным пользователям и разработчикам не приходилось заменять её средства».
  8. Органично сочетаться с языком — служить естественным продолжением языковых средств, типов, операций.
  9. Типобезопасность — безопасность с точки зрения типов по умолчанию.
  10. Поддержка общепринятых стилей программирования.
  11. Расширяемость — способность единообразно работать со встроенными типами данных и с типами, определяемыми пользователем.

Реализация в синтаксисе языка[править | править исходный текст]

В некоторых языках функции ввода-вывода являются частью синтаксиса самого языка (например, Basic, Pascal, Python) и не могут быть воспроизведены как самостоятельные функции (процедуры). С одной стороны, это позволяет создавать более гибкий синтаксис для операторов вывода (например, оператор вывода на экран writeln в Pascal существенно проще по синтаксису чем функция printf в стандартной библиотеке языка Си), с другой стороны, это усложняет синтаксис языка и затрудняет использование компилятора языка для создания программ не использующих эти возможности (например, в встраиваемых компьютерах).

Ссылки[править | править исходный текст]

  1. Bjarne Stroustrup. The C++ Programming Language. 3rd Ed. Addison-Wesley, 1997
  2. Guido van Rossum. Python Tutorial

См. также[править | править исходный текст]