1

Я написал собственный переводчик 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? Очевидно, не завершаясь в бесконечном цикле, проверяя его, и я предпочел бы избежать установки максимального времени выполнения.

Вопрос о бонусе: Можно ли определить количество циклов петли [...]?

+1

Я не знаю brainfuck, но если вы хотите обнаружить это во время компиляции, я думаю, что это невозможно в некоторых случаях (что эквивалентно проблеме остановки). – alain

+0

@ IraBaxter Я не хотел говорить о важности статического анализа (на самом деле я думаю, что это сложная и очень интересная область), я просто не был уверен, знает ли лывист об ограничении. Теперь, когда я прочитал вопрос, который он связал, похоже, что он был. – alain

+0

@alain: Er, в ретроспективе, я не собирался комментировать вас, я должен был оставить @ пустым: -} Я просто ехал в гвоздь, который вы начали: -} –

ответ

2

BF обладает способностью к Тьюрингу. Если вы используете его для вычисления индекса, то вы не можете определить вообще, если индекс имеет определенное значение (например, 30001) из-за проблемы с остановкой. Так что в общем случае вы не можете обнаружить вне доступа. Однако вы можете обнаружить это для многих отдельных программ; поэтому статические анализаторы строятся и используются, несмотря на то, что они теоретически бесполезны.

Что касается количества циклов отключения: Конструкция цикла работает в зависимости от того, является ли переменная нулевой или нет. BF, являющийся способностью Тьюринга, означает, что в общем случае вы не можете знать, равна ли переменная нулевой или нет в какой-либо конкретной точке. Следствием этого является то, что вы не можете знать количество раз, когда работает контур цикла. Опять же, вы можете понять это для многих отдельных программ.

Для некоторых программ с простыми корпусами вы можете легко реализовать свои проверки. В общем, для проведения такого рода статических анализов требуется довольно много механизмов.

 Смежные вопросы

  • Нет связанных вопросов^_^