Я написал собственный переводчик BF в Assembly, и теперь я пишу компилятор BF на Java, который компилируется в код Assembly.Можно ли определить, удалось ли получить доступ к массиву памяти за пределами программы Brainf ** k?
Я хотел реализовать небольшую приятную функцию, которая обнаружила, что массив ячеек памяти вышел за пределы. Традиционным ограничением для массива является указание индекса в [0, 30000)
, в противном случае обычно используется [0, inf)
. Другой вариант заключается в том, что память обернута вокруг, так что в первом случае это может означать, что доступ к индексу 30000 означает доступ к индексу 0.
В моем компиляторе это обнаружение будет выполнено на этапе семантического анализа традиционного компилятора, поэтому мы уже получили наш AST (абстрактное синтаксическое дерево) на этапе анализа синтаксиса.
После попытки создать конструкцию для этого на некоторое время я нашел Detecting infinite loop in brainfuck program, а также страницу Википедии BF. Я узнал, что программа BF с массивом памяти [0, inf)
напоминает машину Тьюринга.
Таким образом, мой вопрос заключается в том, что касается как корпусов [0, max)
, так и [0, inf)
, можно ли обнаружить, что указатель памяти опускается ниже нуля, а в первом случае ниже max? Очевидно, не завершаясь в бесконечном цикле, проверяя его, и я предпочел бы избежать установки максимального времени выполнения.
Вопрос о бонусе: Можно ли определить количество циклов петли [...]
?
Я не знаю brainfuck, но если вы хотите обнаружить это во время компиляции, я думаю, что это невозможно в некоторых случаях (что эквивалентно проблеме остановки). – alain
@ IraBaxter Я не хотел говорить о важности статического анализа (на самом деле я думаю, что это сложная и очень интересная область), я просто не был уверен, знает ли лывист об ограничении. Теперь, когда я прочитал вопрос, который он связал, похоже, что он был. – alain
@alain: Er, в ретроспективе, я не собирался комментировать вас, я должен был оставить @ пустым: -} Я просто ехал в гвоздь, который вы начали: -} –