Идея о введении в язык атрибутов навроде const/volatile
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 19.03.18 09:03
Оценка:
У меня еще пару десятков лет назад возникла идея насчет введения в язык дополнительных наследуемых атрибутов (квалификаторов) наподобие const/volatile, чтобы при помощ набора правил соответствия ловить на этапе компиляции ошибки доступа, блокировок, приоритетов и т.п., которые обычно ловятся лишь на этапе отладки, или только специальными (и весьма дорогими) инструментами, применимыми не к каждой программе.

Простой пример: объекту, разделяемому между параллельными потоками, присваиваем атрибут needs_lock. Функции (например, lock()), которая фактически захватывает блокировку для доступа к объекту, присваиваем атрибут holds_lock. Это может быть и автоматически сделано компилятором, если задать правило присвоения атрибутов, вроде того, как const с функции-члена переносится на *this. Одновременно компилятор автоматически переносит атрибут holds_lock на все функции, вызывающие lock() — хоть прямо, хоть косвенно через обращение к объекту. Если в каком-то месте программы захват блокировки недопустим (например, для исключения задержки выполнения кода реального времени) — достаточно будет вставить правило, требующее отсутствия атрибута holds_lock у любой из вызываемых функций. Еще правильнее это сделать через присвоение функциям кода реального времени другого атрибуа (real_time) и объявления глобальных правил, задающих возможные варианты соответствия атрибутов.

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

Разумеется, статический набор правил не позволит изящно описать ситуацию, например, захвата нескольких блокировок внутри одной функции в разной последовательности, в зависимости от условий. Но в таких случаях можно разбить функцию на части, или предусмотреть временные исключения, вроде const_cast, или что-нибудь аналогичное mutable.

Опубликовал идею в группе обсуждения предложений по стандарту, но там пока никто не проявил интереса.

Если кому интересно — опишу подробнее на русском.
код данные атрибут квалификатор qualifier attribute lock mutex real-time compile-time
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.