-
Notifications
You must be signed in to change notification settings - Fork 3
Description
Нужно сделать язык 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 другой стороны слишком большой набор встроенных инструкуций приведет к более долгому поиску решения, наверное (проверить это).