Легендарный Бьерн Страуструп взялся за задачу упростить обобщенное программирование на C++.
В недавнем докладе он напоминает, что концепции — инструмент описания интерфейса шаблонов — одна из основ обобщенного программирования. Доклад создателя C++ так и называется — «Концепции: будущее обобщенного программирования». В концепциях Страуструп видит решение проблемы спецификации интерфейсов, уже давно присутствующей в C++, языке, появившемся более 35 лет тому назад.
«Принципы написания обобщенного кода в C++ слишком сильно отличаются от того, как пишется остальной код», — признал Страуструп.
Сам он определяет обобщенное программирование как методологию, подразумевающую разработку и реализацию обобщенных алгоритмов, то есть таких, которые без изменений могут работать с входными данными различных типов. Методы обобщенного программирования в числе прочего позволяют создавать более компактные библиотеки функций. Страуструп выразил надежду на то, что его идеи найдут воплощение в стандарте C++ в течение менее трех лет. По его убеждению, концепции существенно облегчат написание рационального и надежного кода на C++.
Сейчас концепции существуют в форме технической спецификации ISO. Их назначение — снабдить шаблоны удобно заданными интерфейсами без накладных расходов периода выполнения. Как подчеркивает Страуструп, смысл концепций в том, чтобы реализовать поддержку обобщенного программирования в C++ полностью, как это было изначально задумано.
Наиболее явным результатом добавления концепций станет кардинальное улучшение качества сообщений об ошибках, но самым важным долговременным следствием будет повышение гибкости и понятности кода.
Бьерн Страуструп определяет обобщенное программирование как методологию, подразумевающую разработку и реализацию обобщенных алгоритмов, которые без изменений могут работать с входными данными различных типов Источник: stroustrup.com |
Концепции также позволяют решить давнюю проблему чрезмерной громоздкости синтаксиса шаблонов. Решение Страуструпа позволит проверять аргументы в период компиляции на соответствие требованиям, заданным с помощью предикатов.
На данный момент механизм концепций уже реализован в CNU C Compiler 6.2. По словам Страуструпа, он рассчитывает, что они станут частью стандарта C++ 20: «Надеюсь, концепции появятся во всех ведущих реализациях языка еще задолго до 2020 года. На мой взгляд, их надо было включить еще в C++ 17, но комитет по стандартизации не смог прийти к консенсусу».
Согласно первоначальному замыслу о поддержке обобщенного программирования в C++, шаблоны должны были отвечать трем требованиям: «Полная общность и выразительность, нулевые накладные расходы по сравнению с ручным переписыванием алгоритмов и удобно заданные интерфейсы. Но реализовать все три свойства никак не удавалось, в итоге мы добились сводимости по Тьюрингу и более высокой по сравнению с ручным кодированием продуктивности, а интерфейсы оставались неудачными — по сути, это ‘утиная типизация’ на этапе компиляции, когда функция, вместо того чтобы проверять типы в интерфейсе, принимает входные параметры любых типов со свойствами, используемыми в реализации. При этом код мог быть очень запутанным».
Решение Страуструпа применимо и к другим языкам программирования. «Сама идея довольно общая, — пишет он. — Предикаты периода компиляции можно использовать практически с любым компилируемым языком, и во многих языках что-то подобное уже есть».