Пример 1. Сколько страниц в моем отчете?
Когда я учился программировать, я играл с созданием инструмента для распечатки хороших отчетов из данных. Очевидно, я хотел, чтобы он был действительно гибким и мощным, поэтому генератор отчетов должен был завершить работу всех генераторов отчетов.
Определение отчета оказалось настолько гибким, что оно было полным. Он может смотреть на переменные, выбирать между альтернативами, использовать циклы для повторения вещей.
Я определил встроенную переменную N, количество страниц в экземпляре отчета, поэтому вы можете поместить строку, на которой указана «страница n из N» на каждой странице. Я сделал два прохода, первый для подсчета страниц (в течение которых N был установлен на ноль), а второй - для их генерации, используя N, полученный с первого прохода.
Иногда первый проход будет вычислять N, а затем второй проход будет генерировать другое количество страниц (потому что теперь ненулевой N изменит то, что сделал отчет). Я пробовал делать итеративные действия до тех пор, пока N не успокоился. Тогда я понял, что это безнадежно, потому что, если он не успокоится?
Это приводит к вопросу: «Могу ли я, по крайней мере, обнаружить и предупредить пользователя, если итерация никогда не решится на стабильное значение для количества страниц, которые создает их отчет?» К счастью, к этому времени я заинтересовался чтением о Тьюринге, Годеле, вычислимости и т. Д. И установил связь.
Спустя годы я заметил, что MS Access иногда печатает «Страница 6 из 5», что является поистине чудесной вещью.
Пример 2: Составители С ++
Процесс компиляции включает в себя расширение шаблонов. Определения шаблонов могут быть выбраны из нескольких специализаций (достаточно хороших, чтобы служить «cond»), и они также могут быть рекурсивными. Таким образом, это полная мета-система Turing (чисто функциональная), в которой определениями шаблонов являются язык, типы - значения, а компилятор - действительно интерпретатор. Это был несчастный случай.
Следовательно, невозможно изучить любую данную C++-программу и сказать, может ли компилятор в принципе завершиться успешной компиляцией программы.
Поставщики компиляторов обойдутся этим, ограничив глубину стека рекурсивного шаблона. Вы можете настроить глубину в g ++.
не системы статического типа проверяют только тип переменной вместо ее значения? Я думаю, что ваш класс исказил вопрос, ожидая, что статический тип проверки отклонит ошибки во время компиляции. – andandandand 2009-07-05 14:21:09
@dmindreader - Нет. Большинство компиляторов/типов безопасных языков действительно просто проверяют типы, но можно увидеть диапазон значений для чего-то (иногда) с учетом статического анализа. Подумайте, как ReSharper или Coverity выдают предупреждения «возможного нулевого значения». – 2010-01-06 19:35:45
Я использовал для проектирования медицинских устройств. Меня однажды попросили включить в устройство с батарейным питанием свет, который указывает на то, что аккумулятор был мертв. – 2011-12-25 19:27:19