1

어셈블리에서 자체 BF 인터프리터로 작성했으며 현재 어셈블리 코드로 컴파일하는 Java에서 BF 컴파일러를 작성하고 있습니다.Brainf ** k 프로그램에서 메모리 배열이 경계 밖으로 액세스되는지 확인할 수 있습니까?

메모리 셀 배열이 범위를 벗어난 경우 감지 된 조금 좋은 기능을 구현하고 싶습니다. 배열의 일반적인 제한 사항은 인덱스를 [0, 30000)으로 설정하는 것입니다. 그렇지 않으면 [0, inf)도 일반적으로 사용됩니다. 또 다른 옵션은 메모리가 싸여 있다는 것입니다. 첫 번째 경우에는 인덱스 30000에 액세스하면 인덱스 0에 액세스한다는 의미입니다.

제 컴파일러에서이 감지는 일반적인 컴파일러의 의미 분석 단계에서 수행 될 것이므로 구문 분석 단계에서 AST (Abstract Syntax Tree)를 이미 확보했습니다.

BF의 위키 피 디아 페이지와 함께 Detecting infinite loop in brainfuck program을 찾았는데 잠깐 동안 구조를 만들려고 시도한 후에 메모리 배열이 [0, inf) 인 BF 프로그램이 Turing Machine과 비슷하다는 것을 알게되었습니다.

제 질문은 [0, max)[0, inf)의 경우 메모리 포인터가 0보다 아래로 떨어지는 지 감지 할 수 있습니까? 분명히 그것을 확인하는 동안 무한 루프에 끝나지 않고, 나는 최대 실행 시간을 설정하는 것을 피하는 편이 낫다.

보너스 질문 : 루프가 [...] 루프 반복되는 횟수를 감지 할 수 있습니까?

+1

나는 brainfuck을 모른다. 그러나 이것을 컴파일 타임에 감지하고 싶다면 어떤 경우에는 불가능하다고 생각한다. (정지 문제와 동일하다.) – alain

+0

@IraBaxter 나는 정적 분석의 중요성에 대해 이야기하고 싶지 않았습니다. (사실 저는 도전적이고 흥미로운 분야라고 생각합니다.) 스키 위가 한계를 알고 있는지 확실하지 않았습니다. 이제 내가 링크 한 질문을 읽었으니 그가 그랬던 것처럼 보입니다. – alain

+0

@alain : Er : 되돌아 보면, 나는 당신에게 코멘트를 목표로하고 있지 않았다. 나는 빈칸을 남겨 두어야 만했다 : - 나는 네가 시작한 못을 운전하고 있었다. -} –

답변

2

BF는 튜링 가능합니다. 이것을 사용하여 색인을 계산하면 중지 문제로 인해 색인에 특정 값 (예 : 30001)이 있는지 일반적으로 판단 할 수 없습니다. 따라서 일반적으로 바운드 액세스는 감지 할 수 없습니다. 그러나 많은 개별 프로그램에서이를 감지 할 수 있습니다. 이것이 정적 분석기가 이론적으로 쓸모가 없어도 만들어지고 사용되는 이유입니다.

루프 반복 횟수 관련 : 루프 구성은 변수가 0인지 아닌지에 따라 작동합니다. BF가 Turing이 가능하다는 것은 일반적으로 특정 지점에서 변수가 0인지 아닌지를 알 수 없음을 의미합니다. 그 의미는 루프 구조가 작동하는 횟수를 알 수 없다는 것입니다. 다시 말하지만, 당신은 많은 개별 프로그램에 대해 이것을 파악할 수있을 것입니다.

간단한 사례가있는 일부 프로그램의 경우 수표를 쉽게 구현할 수 있습니다. 일반적으로 이러한 종류의 정적 분석을 수행하는 것은 오히려 많은 기계를 사용합니다.