2014-11-16 1 views
3

Существует extended version of bf, который содержит инструкцию goto, ?.Инструкция GOTO в Brainf ***

Я знаю, что теоретически должно быть возможно смоделировать goto в классической версии 8 команд bf. Как я могу это сделать на практике? Есть existing bf goto pattern or algorithm? Есть ли способ преобразовать инструкцию goto ? в версию bf без goto ? инструкция?

ответ

1

Существует нет простых или тривиальных способов сделать это, о котором я знаю. Это одна из основных проблем при составлении языка в Brainfuck.

Это, конечно, возможно в теории, как вы сказали, но это требует, чтобы вы структурировали свой код очень дисциплинированным образом, реализуя стек или кучу или какую-то подобную структуру данных.

Проект C2BF является частичным компилятором от C до Brainfuck, который выполняет именно это. Он эмулирует стек путем интерпретации клетки Brainfuck в повторяющийся узор из пяти, а именно,

1) Стек
2) вороха
3) Стек расположение маркера/верхний маркер
4) Прогулка
5) Носите

Если вы заинтересованы в более конкретных деталей реализации делать такого рода вещи, вы можете быть заинтересованы в поиске в этом описании BrainFix, в котором описывается более подробно, как сделать простой п низкий и память.

+0

Спасибо, компилятор для BF - это именно то, что я имел в виду. Чтобы реализовать не только goto, но и рекурсию общего назначения и указатель на функции, мне понадобится инструкция goto. – vz0

0

На самом деле это не так сложно. Псевдокод вы хотите сделать это:

goflg := 1 
while goflg do begin 

    // repeat this for each section 
    if goflg <> 0 then begin 
    goflg := goflg - 1 
    end else begin 
    // run your code in here and at the end 
    // set goflg to get to the section you want next. 
    end 
    // to here 

    // repeat this for each section 
    if goflg <> 0 then begin 
    goflg := goflg - 1 
    end else begin 
    // run your code in here and at the end 
    // set goflg to get to the section you want next. 
    end 
    // to here 


end 

Вы должны добавить флаг, чтобы сделать ELSE часть, а другой, если вы хотите сделать, если часть without a copy но это вполне выполнимо.

0

Единственный способ, о котором я могу думать, - использовать интерпретатор brainfuck, написанный в brainfuck для запуска программы (например, dbfi). С некоторыми изменениями вы можете добавить новые инструкции, такие как LBL и GOTO.

Проблема только в том, что она будет очень медленной. Другая проблема заключается в том, что вам нужно будет сохранить настоящую программу brainfuck на ленте памяти (самый простой способ сделать это - ввести программу, как это делает dbfi). Для более «чистого» способа сделать это вам придется сделать программу brainfuck, которая поместит фактическую программу на ленту памяти, таким образом, чтобы интерпретатор мог ее читать и запускать.

Это, конечно, не очень элегантный метод, но я думаю, что на самом деле это может работать очень хорошо, хотя это, безусловно, будет очень медленным.