Skip to content

DOS language improvements #67

@tmptrash

Description

@tmptrash

Нужно сделать язык DOS Тюринг полным. Список требований к полноте. Так же, есть машина Поста, очень похожая на машину Тьюринга.
Вот формальные правила:

  • Конечность (нет бесконечных символьных множеств и пр.).
  • Фиксированное описание (формальность[1]).
  • Всегда достаточный объём доступной памяти — в идеале здесь имеется в виду неограниченная память, однако физические рамки не позволяют сделать память ЭВМ бесконечной, поэтому она просто должна быть "always big enough".
  • Неограниченность времени выполнения — любая программа в должна иметь возможность работать до тех пор, пока не завершится.
  • Возможность функциональной композиции (вызов одной функции из другой, рекурсия).
  • Наличие циклов while с прерыванием или эквивалентных им конструкций.
  • Возможность останавливать выполнение (halt) или каким-то образом подавать сигнал о результатах выполнения.
  • Представление множества натуральных чисел, понятие нуля и следующего числа. Возможны другие подобные системы.
  • Поддержка входных и выходных данных (I/O), причём без формальных ограничений в объёме. Очевидно, что если любая программа, написанная на каком-то языке программирования, принимает на вход не более фиксированного n бит данных и возвращает не более n бит, этот язык не может быть Тьюринг-полным.

Это важно, так как язык должен иметь возможность решать все типы задач.

  • Добавить поддержку функций в язык DOS. Нюансы:
    • продумать кроссовер. Он не должен (в идеале) ломать функции. Было бы хорошо, если бы организмы могли обмениваться функциями

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

    • нужно добавить фиксированный массив функций. Его значениями будут индексы в коде, где начинается функция. Этот массив должен заполняться каждый раз во время компиляции

    • все переменные будут передаваться в функцию. При выходе из функции (оператор return), нужно возвращать все локальные переменные в те же значения, которые в них были до ее вызова. Нужно использовать стек для этого.

    • добавить оператор return

    • return может вызываться из главного кода тоже. Он будет означать выйти из программы и начать заново. При этом должен вызываться VM._reset()

    • для закрывающейся скобки нужно использовать тот же механизм this._offsets, что сейчас используется для if и for. Его нужно обновить. Раньше, индекс закрывающейся скобки хранился в самом операторе if или for. Это плохо, так как при вставке\удалении строки внутри сдвигает все индексы всех закрывающихся скобок. Нужно сделать специальный оператор bracket. Он будет без параметров. Если в коде встретится лишний оператор bracket, то он просто игнорируется. Если не встретится совсем, то оператор закрывается сам на себе. Пример:

      if (vqr0 < var2)
      if (vqr1 < var2)
      var3 = 123
      bracket
      bracket
      

      в JavaScript выглядит как:

      if (vqr0 < var2)
        if (vqr1 < var2)
          var3 = 123
        }
      }
    • при вызове фу-ии нужно заносить в стек текущий номер строки + 1. Если после вызова функции не встретился оператор return, то после выполнения последней строки кода нужно извлечь последнюю запись в стеке и перейти по ней (по сути - это return)

    • если достигнут конец стека, то организм должен быть наказан уменьшением энергии (конфиг). В этом случае следующую функции будет нельзя вызвать - оператор вызова будет просто пропущен

    • если при выполнении встретится оператор начала функции, то весь код функции должен быть пропущен

  • Формат 32 бит вызова функции: 8bit - fn id, 8bit - fn index/name(config)
  • Формат оператора return: 8bit - return operator id
  • Добавить поддержку прерывания цикла оператором return. Он должен брать текущее смещение в this._offsets для определения номера строки закрывающейся фиг. скобки
  • Для полноты по Тюрингу нужно добавить возможность ввода данных в скрипт извне. Нужно подумать как это будет. Возможно ввод данных непосредственно в память или добавить специальный оператор для получения данных. Нужно подумать... Уже есть onCheckXXX() методы для этого
  • Нужно переделать оператор for на while(var op var). В этом случае можно делать более сложные условия в цикле и они будут более простые. Индекс закрывающейся скобки будет так же хранится в битах самого оператора и должен задаваться в конфиге (кол-во бит).
  • Нужно попробовать использовать больше готовых решений. Например больше математических операций или встроенных элементов языка, типов данных и т.д. Это должно ускорить эволюции программ. C другой стороны слишком большой набор встроенных инструкуций приведет к более долгому поиску решения, наверное (проверить это).

связано с #135 #90 #92 #117

Metadata

Metadata

Assignees

Labels

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions