Возможны ли самомодифицирующиеся, рекурсивно самоизменяющие свои реализации автоматические тесты к рекурсивно самоизменяющимся метапрограммам?
Присказка:
1. Объективно существуют метапрограммы, т.е. шаблонный код, который порождает какую-то конкретную реализацию алгоритма с конкретным набором внутренних параметров.
2. Человек - внешняя по отношению к ПО разумная реальность, которая задает стартовый набор начальных тестов, требований, ограничений и т.п. Такой субъект, который целеполагание может производить и алгоритмы составлять и системы аксиом выбирать (машина автоматически теоремы доказывать способна в рамках начальной аксиоматики, тоже важный факт).
3. Предположим, что у нас есть реализация рекурсивной метапрограммы, порождающей саму себя. Рекурсивные вызовы осуществимы, в метапрограмме сама программа является данными. Значит рекурсивная метапрограмма себя преобразующая, вроде бы теоретически тоже может существовать. Она, будучи реализована гибкой, вероятно, не только включает или исключает из своего тела какие-то алгоритмы по заранее предоставленной базе (не выдумывать же ей стартовые алгоритмы), не только внутренние свои параметры подкручивает, но и дописывает каким-то чудом новый код и вносит его в эту базу алгоритмов (см. пункт 3). И на очередной итерации код должен соответствовать чему-то, что проверяет требования в пункте 2.
4. И вот мы хотим эту рекурсивную самопорождающую саму себя программу (3) протестировать. Конечно, тест может быть написан вручную. Теория TDD утверждает, что тест должен предшествовать реализации, что нужно код покрывать тестами максимально, что тесты в принципе автоматизируются.
Размышляя над пунктами 1-3, я допускаю их осуществимость, знаю или предполагаю, что в принципе это все уже есть и практически возможно.
Мейерс про метапрограммирование шаблонов писал, рекурсия тоже штука известная.
Но когда я думаю про пункт 4, не могу понять, не знаю возможны ли логически/математически самоизменяющиеся тесты, которые тестируют самоизменяющиеся программы?
Т.е. человек задал стартовую реализацию (например, медленную пузырьковую сортировку) и стартовый тест, какие-то базовые ограничения, а потом все как-то улучшается само собой адаптивненько так, варится рекурсивно внутри метаметакомпилятора до готовности. И разворачивается в сортировку быструю-быструю на N-ой итерации, плюс соответствующий тест сами себя переписал из начального, отслеживая покрытие кода.
"Тостер для программиста" :)
Что такое тест?
Это верное утверждение относительного того что: f(a) = b.
где f - это ваша программа (такой черный ящик, функция)
В таком ключе самоизменяемых тестов не существует.
Есть начальное состояние программы, есть алгоритм её работы (в черном ящике), и есть результат исполнения этой программы. Результат должен совпадать с тем, что было заложено ранее. т.е. f(a) должно быть рано b. Если не равно, то тест не прошел.
Как можно изменить тест, чтобы получить другое покрытие начальных и конечных условий ?
А никак. А вы вообще уверены будете, что данный тест покрывает именно те условия. Может быть, в данном случае, результат исполнения программы должен быть совершенно другой?