Я не знаю ни одного языка, который бы действительно делал такую вещь, и я сомневаюсь, что он существует, поскольку это нечто, что довольно сложно реализовать, и в то же время не то, чтоэто нужно многим людям.
Часто лучше просто утверждать, что входные данные действительны, а изменения выполняются только тогда, когда это разрешено и определенным, разумным способом.Это завершает необходимость «глобальных утверждений».
Вы можете получить этот эффект «через черный ход» несколькими способами, хотя ни один из них не является действительно элегантным, а два скорее зависят от системы:
- Если ваш язык допускает перегрузку операторов (например, C ++), вы можете создать класс, который перегружает любой оператор, который изменяет значение.Выполнение там утверждений - значительная работа, но, с другой стороны, тривиальная.
- Практически в каждой системе вы можете изменить защиту страниц памяти, принадлежащих вашему процессу.Вы можете поместить переменную (и любые другие переменные, которые вы хотите утверждать) отдельно и установить страницу только для чтения.Это приведет к ошибке сегментации при записи значения, которое вы можете перехватить (и убедиться, что утверждение верно).Windows даже делает это явно доступным через «защитные страницы» (которые на самом деле являются «скрытыми страницами только для чтения»).
- Большинство современных процессоров поддерживают аппаратные точки останова.Если ваша программа не предназначена для работы на какой-то очень экзотической платформе, вы можете использовать их для получения более тонкого контроля таким же образом, как путем воздействия на средства защиты.См. Например эту статью на другом сайте, где описано, как это сделать под Windows на x86.Это решение потребует от вас написать своего рода «мини-отладчик» и подразумевает, что вы можете столкнуться с проблемами при запуске вашей программы в реальном отладчике.