Compiler construction 是否可以确定在Brainfuck程序中访问内存阵列是否超出范围?

Compiler construction 是否可以确定在Brainfuck程序中访问内存阵列是否超出范围?,compiler-construction,brainfuck,turing-complete,halting-problem,Compiler Construction,Brainfuck,Turing Complete,Halting Problem,我已经用自己的BF解释器在汇编中编写了,现在我正在用Java编写一个BF编译器,编译成汇编代码 我想实现一个很好的功能,检测内存单元数组是否超出范围。数组的传统限制是让索引位于[0,30000)中,否则也通常使用[0,inf)。另一个选项是内存被包装,因此在第一种情况下,访问索引30000意味着访问索引0 在我的编译器中,这种检测将在传统编译器的语义分析阶段进行,因此我们已经从语法分析阶段获得了AST(抽象语法树) 经过一段时间的尝试,我发现一个BF程序与BF的Wikipedia页面一起使用as

我已经用自己的BF解释器在汇编中编写了,现在我正在用Java编写一个BF编译器,编译成汇编代码

我想实现一个很好的功能,检测内存单元数组是否超出范围。数组的传统限制是让索引位于
[0,30000)
中,否则也通常使用
[0,inf)
。另一个选项是内存被包装,因此在第一种情况下,访问索引30000意味着访问索引0

在我的编译器中,这种检测将在传统编译器的语义分析阶段进行,因此我们已经从语法分析阶段获得了AST(抽象语法树)

经过一段时间的尝试,我发现一个BF程序与BF的Wikipedia页面一起使用as内存数组
[0,inf)
类似于一个图灵机

因此,我的问题是,对于
[0,max)
[0,inf)
两种情况,是否可以检测内存指针是否低于零,在前一种情况下是否低于max?显然,在检查它时不会以无限循环结束,我宁愿避免设置最大执行时间


附加问题:是否可以检测循环构造的次数
[…]
循环?

BF具有图灵功能。如果使用它计算索引,则通常无法确定索引是否具有特定值(例如30001)由于暂停问题。因此,通常情况下,您无法检测到越界访问。但是,对于许多单独的程序,您可能能够检测到这一点;这就是为什么静态分析器在理论上毫无用处的情况下仍被构建和使用的原因

关于循环跳闸计数:循环构造基于变量是否恰好为零进行操作。BF具有图灵功能意味着通常您无法知道变量在任何特定点是否为零。这意味着您无法知道循环构造的工作次数。同样,您可能能够对于许多单独的程序来说,这是不可能的


对于一些具有简单情况的程序,您可能能够轻松地实现检查。一般来说,进行此类静态分析需要相当多的机器。

我不知道brainfuck,但如果您想在编译时检测到这一点,我认为在某些情况下是不可能的(相当于停止问题)@IraBaxter我不想贬低静态分析的重要性(事实上,我认为这是一个具有挑战性且非常有趣的领域),我只是不确定skiwi是否意识到限制。现在我已经阅读了他链接的问题,看起来他是。@alain:呃,现在回想起来,我的评论不是针对你的,我应该留下@blank:-}我只是在钉你开始的钉子:-}