2B (Дваб) - Printable Version +- Wake of Gods Forum | Форум Во Имя Богов (http://wforum.heroes35.net) +-- Forum: Общие Форумы (/forumdisplay.php?fid=100) +--- Forum: Софт и железо (/forumdisplay.php?fid=137) +---- Forum: Компьютерные игры (/forumdisplay.php?fid=175) +---- Thread: 2B (Дваб) (/showthread.php?tid=2315) |
2B (Дваб) - Berserker - 22.08.2010 19:23 Введение. Дваб предназначен для написания текстовых консольных игр и утилит. Код программы, записанный обычным текстом, транслируется в код виртуальной машины, на которой и выполняется. Виртуальная машина - это своего рода песочница, призванная защитить пользователя от возможных попыток взлома или нанесения вреда. Единственная внешняя информация, доступная программам, кроме ввода пользователя, это его ник на форуме (Guest, если гость). Виртуальная машина работает на компьютере пользователя и реализована средствами встроенного в бразуер языка обработки сценариев JavaScript. Структура виртуальной машины (ВМ). ВМ построена на стёковой основе. Стёк - это список элементов, над которым определено всего две операции: добавить элемент в конец списка и получить последний элемент списка, удалив его из структуры. Стёк не имеет размеров, точнее он ограничен лишь размерами оперативной памяти пользователя. Для того, чтобы поместить элемент в стёк, достаточно лишь назвать его: Code: 1 2 3 После выполнения кода стёк будет содержать элементы 1, 2, 3. Все команды ВМ получают аргументы с вершины стёка. Например, команда сложения чисел (а также объединения строк) "add" сперва достаёт с вершины два элемента, складывает их, а затем помещает результат в стёк. Также работает и большинство других команд. Code: 4 6 add После выполнения кода в стёке будет лишь одно число: 10. Переменные. В отличие от константных значений, коими являются строки ('5' или 'heh' или "привет"), числа (0, 6.777, -12), логические значения (true - истина, false - ложь) существует ещё ячейки памяти со своими собственными именами, чьи значения могут меняться по ходу выполнения программ. Такие ячейки памяти называются переменными. Code: 'МояПерваяПеременная' var Создаст в текущем контексте переменную с именем "МояПерваяПеременная" и начальным значением 0. Если бы в коде кавычки были опущены, то смысл был бы иной: положить значение переменной в стёк. Поток управления программы. Редко когда логика программы не содержит условий или циклов. В двабе управление потоков программы реализовано на низком уровне, близком к ассемблеру, при помощи условных переходов и меток. Рассмотри в начале объявление меток и переходы на них. Code: 1 Что окажется на вершине стёка после выполнения данного кода? Давайте посмотрим по шагам. 1 - положили единицу в стёк. 4 - положили 4 в стёк (стёк: 1, 4). "метка" - положили строку в стёк (стёк: 1, 4, "метка"). jmp - команда перехода на метку с указанным именем. С вершины стёка достаётся значение "метка", затем ВМ определяет её адрес и переходит прямо к позиции :метка, минуя "положить в стёк 6". Далее команда сложения достанет верхние аргументы (1, 4) и положит в стёк результат сложения (5). Вывод: для объявления метки необходимо поставить знак двоеточия, за которым незамедлительно написать имя метки без кавычек. Условные переходы. Допустим, мы хотим написать простую программу, определяющую, какое число ввёл пользователь (для простоты будем считать, что пользователь введёт корректное число). Программа должна возвратить: "положительное" - если число > 0, "отрицательное", если число < 0 и "нуль" - если число = 0. В примере ниже используются две функции работы с консолью: read - читает ввод пользователя и помещает его в стёк, write - выводит строку на экран. Функция dup помещает в стёк копию верхнего элемента. Code: clrscr; очищаем экран Циклы или повторяемые действия. Предположим, мы хотим вывести на экран числа 1..10. Вариант "в лоб" мы даже не рассматриваем (1 write 2 write 3 write...). Code: 'i' var; объявили переменную- счётчик цикла Подпрограммы и контексты. Линейный код рано или поздно разрастается и становится трудночитаем. На лицо необходимость разбить его на простые и понятные блоки - подпрограммы. Подпрограмму можно вызвать, передав её определённые параметры (через наш универсальный стёк). Она в свою очередь тоже может вернуть результат. Возврат из подпрограммы переводит поток управления на следующую команду после той, что вызвала подпрограмму. Важно свойство подпрограмм - то, что они обладают своим набором переменных. Все переменные, которые будут объявлены в подпрограмме, по возврату из неё будут уничтожены. Глобальными переменными называются те, которые были объявлены на самом высоком уровне. К ним есть доступ из любой подпрограммы. Однако если вы объявили глобальную переменную А, а потом локальную А, то все обращения к А в подпрограмме будут касаться только локальной переменной. Иными словами вы перекрыли область видимости переменной. Пример подпрограммы, сравнивающей два числа и возвращающей ("Больше", "Меньше" или "Равно") Code: 'start' jmp; переходим на начало программы, минуя блок подпрограмм RE: 2B (Дваб) - Berserker - 22.08.2010 20:31 Список комманд: Code: // Работа с переменными Список констант: Code: 'true': true, |