ПО, ЭВМ и АСУ из Таможенного Союза

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



машина Поста

Сообщений 1 страница 5 из 5

1

Что если ассемблер делать для машины Поста?
Красота же - минимальный набор инструкций, независимость от конкретной аппаратуры (переносимость).

Машина Поста состоит из разбитой на ячейки бесконечной в обе стороны ленты (но в принципе и в одну сторону бесконечности достаточно),
ячейка ленты может быть 0 или 1.

И каретки (т.е. считывающей и записывающей головки),
за такт работы каретка может:
0) записать символ 0
1) записать символ 1
2) сдвинуться на одну позицию влево
3) сдвинуться на одну позицию вправо
4) считать символ в своей текущей позиции

Программа для машины Поста состоит из пронумерованных строк вида
[i] K [j]
i — номер команды, K — действие каретки, j — номер следующей команды
если j не указано, то выполняется следующая по порядку команда

команды есть:
- четыре команды для каретки
- команда безусловного перехода (на строку j)
- команда условного перехода (на строку j, если под кареткой 1)
- команда останова

Итого 7 штук, можно ещё добавить (чтобы было 8 штук, с целью закодировать в 3 бита):
- команда условного перехода (на строку j, если под кареткой 0)

Например:

000 - останов
001 - безусловный переход
010 - перейти если 0
011 - перейти если 1

100 - записать 0
101 - сдвинуть каретку вправо
110 - сдвинуть каретку влево
111 - записать 1

Тут неясно, как будет кодироваться номер строки программы (сколькими битами),
ну, пусть 64-3 = 61 бит на номер строки программы

Можно придумать мнемоники для команд:

СТОП
ПЕРЕХОД 0000000000
ЕСЛИНОЛЬ 0000000000
ЕСЛИОДИН  0000000000
НОЛЬ
ВЛЕВО 0000000000
ВПРАВО 0000000000
ОДИН

Ну и теперь можно написать ассемблер, интерпретатор

затем на ассемблере можно будет писать программы,
например если в команде СТОП параметром указывать, сколько первых битов записать в стандартный вывод в качестве результата работы.

в начале работы ленту считывать из стандартного ввода.

И тогда можно будет переписать ассемблер на самом себе.

ну, ещё сделать метки, пример команд с меткой:
                      ПЕРЕХОД МеткаКонца
МеткаКонца: СТОП 000001000000

меня только смущает, как оно без регистра аппаратного стека работает. Но ведь работает как-то?

Отредактировано Лис (2022-05-29 11:27:07)

0

2

Почему машина Поста вообще будет работать? Потому что интерпретатор возьмёт на себя три задачи:
1) операцию чтения из потока стандартного ввода поставит в соответствие заполнению начального состояния ленты
2) операцию записи в поток стандартного вывода поставит в соответствие сохранению конечного состояния ленты
3) операциям машины Поста поставит в соответствии инструкции аппаратного процессора (неважно какого, неважно какие)

Что-нибудь поменяется, если вместо машины Поста будет какая-нибудь другая виртуальная машина, с более сложным внутренним устройством? Нет.

Похоже, как-то так появились Форт-машины. Туда добавили стек. Надо про них по подробнее почитать.

Можно ли аналогично наращиванию функциональности языков вставить в план наращивает функциональности виртуальных машин?
Что это даст с точки зрения анализа кода?

0

3

Лис написал(а):

... операциям виртуальной машины поставит в соответствии инструкции аппаратного процессора ...

Если иметь возможность реализовывать новые функции аппаратно (прошивать в FPGA например),
то можно будет расширять операции виртуальной машины на ходу по необходимости.

Загонять, так сказать, на подсознательный уровень. А то Уткин всё хотел синус на лямбдах, и чтобы работал быстро. Вот - это путь.

См. также Скорость прорастания

Отредактировано Лис (2022-05-29 18:20:13)

0

4

Лис написал(а):

Что если ассемблер делать для машины Поста?

Brainfuck
Язык программирования Брэйнфак (половое сношение головного мозга)
изобрели в 1993 году.
Пишите код на нём, только в путь.

0

5

NuShaman написал(а):

Язык программирования Брэйнфак

Да, по количеству команд совпадает, но у него лента более сложная, не битовая, а из символов. Т.е. не машиной Поста они вдохновлялись.
А в этом случае, раз уж усложнять, то можно было бы добавить регистр стека, например (про Forth я уже писал выше).
Всё равно это ничего концептуально не меняет.

В КуМир-е (=Школьный Алгоритмический Язык, ШАЯ) тоже есть виртуальная машина, код которой компилируется в команды процессора через LLVM.

0