Выход следующей версии языка программирования C++ может быть отложен в последний момент из-за спора о функции Contracts, повышающей безопасность.
Функция Contracts вызвала глубокий раскол среди технических специалистов C++. Одна группа поддерживает создателя C++ Бьярне Страуструпа, который выступает против технологии в ее нынешнем виде, утверждая, что она была реализована поспешно. Другие же стремятся к внедрению Contracts, утверждая, что критики технологии отравляют сам процесс разработки C++.
Разногласия достигли апогея непосредственно перед голосованием по ратификации новой версии языка.
В октябре проект международного стандарта (DIS) C++26 не прошел ISO-голосование — предпоследнюю стадию процесса утверждения Международной организации по стандартизации, в ходе которой технические детали стандарта формально ратифицируются национальными органами по стандартизации.
В ходе голосования было подано 13 голосов «за», 9 — «против» и 12 — воздержались, что не соответствует требованию ISO о наличии не более 25% голосов «против». Contracts стали основным камнем преткновения для тех, кто голосовал против.
Спор о Contracts
Contracts позволяют разработчикам добавлять к коду предусловия и постусловия, а также утверждения, проверяющие выполнение заданных условий. Такие проверки могут помочь выявить ошибки программирования, которые в противном случае могли бы привести к неопределенному поведению.
Design by Contract (проектирование по контракту) давно является особенностью таких языков, как Ada и Eiffel.
Разработчики предлагали добавить Contracts в C++ по крайней мере десять лет назад, после того как они были внезапно удалены из C++20 из-за опасений по поводу небезопасных настроек по умолчанию.
Однако Страуструп раскритиковал пересмотренное предложение (P2900), которое вошло в C++26.
«Предложение P2900 о Contracts и расширениях направлено на изменение природы C++ и представляет собой экзистенциальную угрозу для C++, добавляя сложность и раздутость», — написали Страуструп и его коллеги в документе в августе прошлого года. Они отметили, что реализация является неаккуратной, устаревшей, недостаточно протестированной и могла бы быть более эффективно реализована в виде библиотеки.
Не все согласны. Андреас Фертиг, член комитета по стандартизации C++, считает, что критика уже была рассмотрена, и вето на предложение на таком позднем этапе процесса выпуска C++ наносит ущерб самому C++.
«Над этой темой работали годами, и она неоднократно получала большинство голосов в ее нынешнем виде. Голосуя «против», мы пошатнули устоявшуюся систему, основанную в первую очередь на доверии и уважительном сотрудничестве», — написал Фертиг в своем блоге.
Слоном в комнате, конечно же, является продолжающаяся критика того, насколько легко разработчикам случайно создавать уязвимости безопасности в C++, что побудило многие проекты перейти на Rust. Добавление средств контроля может, как отмечает Страуструп, помешать главному преимуществу C++ — быть молниеносно быстрым языком.
Проигравшие
Фертиг обвинил Страуструпа и его коллег в том, что они ведут себя как проигравшие.
«Каждый стандарт ISO — это просто набор компромиссов. Каждый иногда проигрывает, и каждый иногда выигрывает», — написал он. Но в данном случае «проигравшие стороны отказались принять свое поражение. Вопрос, который в первую очередь определяет, как двигаться дальше, заключается в том, сможет ли группа восстановить доверие».
В отличие от Фертига, Гарри Ботт, генеральный директор C++ Alliance, которая поддерживает фронтенд компилятора C++ с открытым исходным кодом EDG, не считает обсуждение Contracts дестабилизирующим для самого C++.
«Возврат проекта не является провалом процесса — это процесс, работающий так, как задумано», — написал он The Register по электронной почте. «Это не значит, что процесс нельзя улучшить. Цель должна состоять в том, чтобы извлечь уроки из этого и укрепить процесс, чтобы C++ мог продолжать развиваться таким образом, на который разработчики могут полагаться».
Что дальше?
Поскольку голосование провалилось на таком позднем этапе процесса стандартизации — что является редкостью в истории C++ — язык рискует не успеть к ожидаемой дате выпуска в этом году. Этот исход может заставить всех ссылаться на новую версию как на «C++27», а не C++26. (Это лишь неофициальное название; официальным названием этой восьмой версии языка, если она будет выпущена в следующем году, будет «ISO/IEC 14882:2027».)
Рабочая группа ISO C++ WG21 встречается на следующей неделе в Бузиусе, Бразилия, для финального противостояния.
Согласно сообщению в блоге Тибо Рикор-Маршала, консультанта по разработке программного обеспечения в парижской консалтинговой компании Margo, группа сталкивается с рядом вариантов.
Они могут исключить Contracts из спецификации, чтобы остальная часть C++26 могла быть выпущена. Однако это будет грязная работа. Придется отменить многие улучшения библиотек, уже сделанные с использованием Contracts.
Другой вариант — перенести Contracts в отдельную техническую спецификацию, где работа по доработке технологии может продолжаться.
Или они могут внести незначительные изменения, проголосовать снова и надеяться, что теплой бразильской погоды хватит, чтобы всех успокоить.®
Всегда имейте в виду, что редакции могут придерживаться предвзятых взглядов в освещении новостей.
Автор – Joab Jackson




