Всем доброго времени суток!
Я хочу поведать вам свою идею и услышать ваши коментарии.
Пришла как то в голову идея, а что если заставить наш контроллер выступить в роли интерпритатора.
Первая задача была самой сложной: Выбрать интерпретируемый язык. Долго я гулял по форумам и Википедии и свершилось чудо и звали это чудо Brainfuck. Это эзотерический язык программирования. Является полным по Тюренгу т.е на нем можно написать практически все что угодно. В арсинале у него всего 8 комманд это
> = Смещает укозатель ячейки на одну позицию вправо
< = Смещает укозатель ячейки на одну позицию влево
+ = Увеличивает значение текущей ячейки на 1
- = Уменьшает значение текущей ячейки на 1
. = Выводит значение текущей ячейки
, = Запрашивает ввод данных и записывает их в текущую ячейку
[ = Если значение текущей ячеки нуль то перейти на команду следующую за ]
] = Если значение текущей ячейки не ноуь перейти на соответствующий [
Сам принцип очень прост. Но вот программирование действительно может сломать мозг :-)
Вот немного теории. Предположим есть 5 ячеек по 8 бит каждая
изначально все они равны нулю и указатель стоит в нулевой позиции
0 0 0 0 0
^
И программа вида >>++++++<+
Результат: 0 1 6 0 0 0
По началу кажется что все это бесполезно и нудно. Но на самом деле это весьма занимательно : - ) Но каждый сам решает для себя.
Всю подробную информацию можно найти в интернете. А если ближе к делу то вот непосредственно код.
В массие char prog записана программа которая выведит в порт Hello почему без World? Просто было лень вписывать все это в массив :-)
Вот полная программа:
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++
.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.
------.--------.>+.>.
Код ардуино:
char prog[200] = {'>','+','+','+','+','+','+','+','+','+','[','<','+','+','+','+','+','+','+','+','>','-',']','<','.','>','+','+','+','+','+','+','+','[','<','+','+','+','+','>','-',']','<','+','.','+','+','+','+','+','+','+','.','.','+','+','+','.','[','-',']','>','+','+','+','+','+','+','+','+','[','<','+','+','+','+','>','-',']','<','.'};
//Массив содержит в себе код программы
int pos_prog = 0;//Хранит укозатель на номер комманды
int memory[200]; // Массив ячеек
int inc;//Укозатель на ячейку в памяти
void setup()
{
Serial.begin(9600);
Serial.print("Complit\n");
}
void loop()
{
for(;
{
switch (prog[pos_prog])
{
case '>':
inc++;
pos_prog++;
break;
case '<':
inc--;
pos_prog++;
break;
case '+':
memory[inc]++;
pos_prog++;
break;
case '-':
memory[inc]--;
pos_prog++;
break;
case '.':
Serial.print(memory[inc],BYTE);
pos_prog++;
break;
case '[':
if(memory[inc] == 0)
{
while (prog[pos_prog] != ']')
{
pos_prog++;
}
}
else
{
pos_prog++;
}
break;
case ']':
if(memory[inc] == 0)
{
pos_prog++;
}
else
{
while (prog[pos_prog] != '[')
{
pos_prog--;
}
}
break;
}
}
}
Ну вот и все. Хотелось бы все расписать поподробние но боюсь что интересно не будет..Но если вдруг понравилось идея пишите я постораюсь ответить на все вопросы..Хотя считаю что и все достаточно понятно..да и интернет всегда под рукой
Спасибо за внимание.
Раздел: Arduino