Как (и кто может) реализовать стандартные функции библиотеки, определенные комитетом C++?
Когда комитет по С ++ публикует новую функцию, которая станет частью стандартной библиотеки в следующем стандарте языка, он также выпускает некоторый исходный код или какое-то руководство о том, как реализовать эту функцию?
Давайте принимать unique_ptr
В качестве примера. Комитет по языку просто определяет интерфейс для этого шаблона класса и позволяет поставщику компилятора реализовать его так, как он хочет? Как именно происходит этот процесс реализации стандартных функций библиотеки.
Может кто-нибудь реализовать части стандартной библиотеки для платформы, которая еще не поддерживает ее? Допустим, я хотел бы реализовать некоторые классные функции стандартной библиотеки C++, чтобы использовать ее в среде микроконтроллера. Как я мог это сделать? Где мне искать информацию? Если я решу сделать свой проект открытым, могу ли я это сделать? Должен ли я точно следовать указаниям стандарта или я могу написать несовместимую версию?
4 ответа
Обычно,
каждая новая функция библиотеки проходит через предложение.
Если это предложение поступает в рабочую группу по развитию библиотек комитета C++, оно проходит серию итераций (насколько мне известно, "жесткая основа").
Он проходит серию процессов уточнения, как описано здесь
Если для этого требуется техническая спецификация (TS) (начиная с C++11), он отправляется туда для выпечки. Взять, к примеру,
#include <filesystem>
был в файловой системе TS до C++17.Одной из вещей, которая, по моему мнению, комитету нравится, является опыт реализации.
Более подробную информацию можно найти на сайте ISOCpp
Ну а что касается реализации:
Существует целый ряд "библиотечных функций", которые нельзя реализовать исключительно как библиотеку. они требуют поддержки компилятора. И в этом случае компиляторы предоставляют "встроенные" функции, к которым вы можете подключиться. Возьмем, к примеру, clang предоставляет встроенные функции для определенных type_traits
Большинство библиотечных функций имеют некоторый опыт реализации, в основном из библиотек Boost.
Вы можете посмотреть исходный код стандартной библиотеки по умолчанию, которая поставляется вместе с вашим компилятором:
К сожалению, большинство реализаций используют целую кучу подчеркиваний. Главным образом потому, что они зарезервированы для использования "Стандартной библиотекой".
Может кто-нибудь реализовать части стандартной библиотеки для платформы, которая еще не поддерживает ее?
Да, вы можете, пока ваш компилятор поддерживает эту платформу, а платформа или операционная система предоставляет применимый API. Например. std::cout
, элементы std::ifstream
и многое другое требует поддержки конкретной платформы.
Допустим, я хотел бы реализовать некоторые классные функции стандартной библиотеки C++, чтобы использовать ее в среде микроконтроллера. Как я мог это сделать?
Вы можете посмотреть в код других и начать с этого. Мы учимся у гигантов. Некоторые примеры с открытым исходным кодом:
Как я мог это сделать? Где мне искать информацию?
Вы можете проверить документ, который представил эту функцию в библиотеке C++. Например,
std::optional
имеет отдельную реализацию, которая использовалась в качестве эталонной реализации на этапах предложения.Вы можете проверить стандартную библиотеку и сделать кропотливое исследование.:-)
- Искать в Интернете.:-)
- Или напишите это с нуля, как указано в стандарте
Должен ли я точно следовать указаниям стандарта или я могу написать несовместимую версию?
Нет необходимости следовать указаниям стандартной библиотеки C++. Это была бы ваша "собственная" библиотека.
Формально нет. Как и во всех существующих стандартах, C++ Standard устанавливает правила и не дает реализации. Однако с практической точки зрения практически невозможно внедрить новую функцию в Стандартную библиотеку без предлагаемой реализации, поэтому часто можно найти компоненты, прикрепленные к предложениям.
Что касается ваших вопросов о "можете ли вы написать несовместимую версию", вы можете делать все, что захотите. Принятие может зависеть от вашего соответствия или нет - широко распространенный MSVC, как известно, нарушает стандарт C++.
Комитет не выпускает никаких справочных реализаций. Вначале все было стандартизировано, а затем разработчики инструментов ушли и внедрили стандарт. Это изменилось, и теперь комитет ищет функции, которые были реализованы и протестированы до стандартизации.
Также крупные разработки обычно не идут прямо в стандарт. Сначала они становятся экспериментальными функциями, называемыми Технической спецификацией или TS. Эти TS могут быть позже включены в основной стандарт.
Вы можете написать собственную реализацию стандартной библиотеки C++. У Plum Hall есть набор тестов (коммерческий, у меня нет связи, но Plum Hall очень вовлечен в стандартизацию C++).
Я не вижу никаких проблем с тем, чтобы быть несовместимым. Почти все реализации имеют некоторые расширения. Только не делайте ложных заявлений, особенно если вы хотите продать свой продукт.
Если вы заинтересованы в участии, это можно сделать через ваш "национальный орган" (ANSI для США, BSI для Великобритании и т. Д.). На веб-сайте isocpp есть раздел по стандартизации, который будет хорошей отправной точкой.
Как правило, новая функция не стандартизирована, если у комитета нет убедительных доказательств того, что она может быть реализована и будет полезна. Это очень часто состоит из реализации прототипа в boost, библиотеки GNU или одного из коммерческих поставщиков компиляторов.
Сам стандарт не содержит каких-либо рекомендаций по реализации - это просто спецификация. Поставщики компиляторов (или их субподрядчики) выбирают, как реализовать эту спецификацию.
В конкретном случае unique_ptr
был принят в стандарт от boost::unique_ptr
- и вы все еще можете использовать последний. Если у вас есть компилятор, который скомпилирует для вашего микроконтроллера, почти наверняка он сможет собрать достаточно наддува, чтобы сделать unique_ptr
Работа.
Ничто не мешает вам написать несоответствующую реализацию (за исключением тривиального момента, что если вы продаете его как соответствующий стандартам, а это не так, вы можете получить, что ваш местный эквивалент Торговых стандартов будет сбит с толку.)