Стандартна бібліотека

Стандартна бібліотека мови програмування - набір модулів, класів, об'єктів, констант, глобальних змінних, шаблонів, макросів, функцій і процедур, доступних для виклику з будь-якої програми, написаної на цій мові і присутніх у всіх реалізаціях мови.


1. Історія

У ранніх мовах програмування (таких як Фортран, Алгол, Кобол, Бейсик) функціональність, не пов'язана безпосередньо з мовою, але необхідна для створення більшості реальних програм, включалася безпосередньо в мову і нерідко реалізовувалася безпосередньо на рівні транслятора або середовища виконання (для різних мов) . До числа таких функцій ставилися насамперед ті, які було неможливо, незручно або неефективно реалізовувати засобами самої мови програмування: команди введення-виведення, обчислення стандартних математичних і логічних функцій, специфічні операції з деякими типами даних, робота з зовнішніми пристроями, з "сирої" пам'яттю, взаємодія з операційною системою та інше. Такий підхід був не позбавлений недоліків: компілятор опинявся прив'язаний не лише до архітектури комп'ютера, яка статична і змінюється не так часто, але і до його програмному середовищі, в першу чергу - до операційної системи, яка може змінюватися набагато частіше.

У 1970-х роках в процедурних мовах широко поширилася концепція модульності. З'явилися синтаксичні засоби для опису програми як набору відносно незалежних модулів. Природним наслідком стало те, що розробники мов програмування стали виносити входили раніше до складу мов універсальні функції в зовнішні бібліотечні модулі і підключати ці модулі до програм при необхідності. Але виключення стандартних функцій з мови могло привести до проблем сумісності: кожен виробник компілятора міг надавати власні бібліотеки. Тому разом зі специфікацією мови програмування розробники почали пропонувати специфікацію на стандартну бібліотеку - ту частину програмного оточення, яка зобов'язана бути присутньою в будь реалізації даної мови. З цього моменту будь-яка реалізація тієї чи іншої мови програмування поділяється на три частини: реалізація власне мови (компілятор), реалізація стандартної бібліотеки і додаткові кошти (середа розробки, редактор зв'язків, засоби документування, додаткові бібліотеки), які зазвичай не стандартизуються разом з мовою, хоча на них можуть існувати окремі стандарти. Теоретично, будь-який програміст, що використовує тільки стандартні мовні засоби та стандартну бібліотеку, може бути впевнений, що його програма буде працювати однаково на будь-якій платформі.

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


2. Типові підходи до проектування

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

  • Перший - стандартна бібліотека повинна містити в собі тільки ті процедури і функції, які використовуються практично всіма і володіють максимальною універсальністю. Зокрема, цієї позиції дотримується Бьерн Страуструп, автор мови C + + [1]. Однією з підстав цієї концепції є просте міркування: чим більше специфічна надається бібліотекою функціональність, тим важче реалізувати її так, щоб вона в повній мірі задовольняла вимогам кожного конкретного випадку; якщо бібліотечна реалізація не буде універсальною і ефективною у всіх варіантах застосування, то для більшості реальних завдань вона виявиться невідповідною, отже - даремною.
  • Другий - стандартна бібліотека повинна містити в собі максимально можливу кількість типових алгоритмів, забезпечувати просту роботу з більшістю (в ідеалі, з усіма) об'єктами, з якими може взаємодіяти програма. Одним із прикладів реалізації цього підходу є мова Python з девізом "Batteries included" (батарейки в комплекті) [2]. Доказом на користь цього підходу є уявлення, згідно з яким швидкість написання програм і їх коректність у більшості випадків важливіше ефективності (принаймні, для більшості прикладних програм), тому краще всього надати програмістові максимум готових, ретельно перевірених механізмів, які він зможе використовувати, щоб програмування "вручну" було необхідно тільки для дійсно нетривіальних алгоритмів; це заощадить час і вбереже програміста від технічних помилок у написанні того, що вже було реалізовано.

3. Склад

Залежно від можливостей мови, стандартна бібліотека може містити:

Зазвичай стандартна бібліотека містить основні алгоритми та структури даних, необхідні для:

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

  1. Затребуваність - бути важливими доступними для всіх користувачів мови.
  2. Використовувані - прямо або побічно використовуватися всіма програмістами для вирішення всіх завдань, пов'язаних з цілями бібліотеки.
  3. Ефективність - для більшості застосувань бібліотечна реалізація повинна бути не гірше реалізації тих же механізмів "вручну".
  4. Незалежність від алгоритмів - надавати можливість задавати алгоритми в якості параметрів. Наприклад, стандартна функція сортування повинна давати можливість визначити будь-який алгоритм порівняння елементів.
  5. Математична примітивність - кожна компонента повинна надавати одну певну функцію або групу функцій, використовуваних тільки спільно.
  6. Зручність, ефективність та безпека - принаймні, в більшості типових варіантів застосування.
  7. Завершеність - "Стандартна бібліотека може залишити безліч функцій іншим бібліотекам, але якщо вже вона взялася за якесь завдання, то повинна забезпечити достатню функціональність, щоб окремим користувачам і розробникам не доводилося замінювати її засоби".
  8. Органічно поєднуватися з мовою - служити природним продовженням мовних засобів, типів, операцій.
  9. Тіпобезопасность - безпека з точки зору типів за замовчуванням.
  10. Підтримка загальноприйнятих стилів програмування.
  11. Розширюваність - здатність одноманітно працювати з вбудованими типами даних і з типами, обумовленими користувачем.

4. Реалізація в синтаксисі мови

У деяких мовах функції введення / виводу є частиною синтаксису самої мови (наприклад, Basic, Pascal, Python) і не можуть бути відтворені як самостійні функції (процедури). З одного боку, це дозволяє створювати більш гнучкий синтаксис для операторів виводу (наприклад, оператор виводу на екран writeln в Pascal істотно простіше по синтаксису ніж функція printf в стандартній бібліотеці мови Сі), з іншого боку, це ускладнює синтаксис мови і утрудняє використання компілятора мови для створення програм не використовують ці можливості (наприклад, в вбудовуваних комп'ютерах).