- PVSM.RU - https://www.pvsm.ru -
Автор материала рассказывает, как с помощью Google-таблиц создать виртуальную машину, которая генерирует числа Фибоначчи.
Недавно я заметил, что в Google Документах есть достаточно полнофункциональная система скриптов под названием Apps Script [1]. Она позволяет вам писать на JavaScript некоторые довольно полезные вещи:
Естественно, по этой причине мне пришлось создать что-нибудь интересное. Вот, смотрите: виртуальная машина в Google Таблицах, генерирующая числа Фибоначчи [2]!
У ВМ есть область памяти в 100 ячеек, пронумерованных от 0 до 99. Каждая ячейка может содержать команду или целое значение.
Также существует стек, который начинается в нижней части области памяти и растет вверх.
Вот так выглядит лист ВМ, когда он пуст:
Обратите внимание на следующее:
Чтобы запустить команду, Apps Script проверяет значение RI в фоновом режиме, чтобы понять, какая команда должна выполняться следующей. Она считывает команду в ячейке, на которую указывает RI, и анализирует ее.
Существуют команды для перемещения данных между памятью и регистрами, управления стеком или выполнения условных команд.
После выполнения команды значение RI увеличивается, чтобы указывать на следующую ячейку в памяти.
Существует специальное меню под названием «Компьютер» (Computer) с некоторыми функциями, которые используются для управления ВМ:
Существует несколько реализованных команд:
Общие
Математические
Операции со стеком
Переходы и условные команды
Функции
Прочее
Операнды в приведенных выше командах могут принимать несколько форм:
Immediates — это литеральные значения, встроенные в команду. Примеры: 7 и123. Например, чтобы скопировать значение 7 в регистр ra:
mov ra 7
Registers ссылаются на регистры по имени. Примеры: ra, rb, rc. Чтобы скопировать значение из rc в rb:
mov rb rc
Memory ссылается на значение внутри ячейки области памяти. Примеры: $0, $10, $99. Чтобы скопировать значение из ra в первую ячейку памяти:
mov $0 ra
Чтобы скопировать значение из последней ячейки памяти в rd:
mov rd $99
Indirect ссылается на значение, на которое указывает ячейка памяти. Примеры: @15, @50. Поэтому, если ячейка памяти 10 содержит значение 20, а ячейка памяти 20 содержит значение 30, вы можете скопировать значение 30 в ra следующим образом:
mov ra @10
Он проверяет ячейку памяти 10, чтобы найти значение 20. Затем он обращается к ячейке памяти 20, чтобы найти значение 30, и копирует это значение в ra.
Вы можете использовать стек и команды call и ret для выполнения рекурсивных вызовов. Вот пример, который использует рекурсию для генерации факториала числа 5:
Код, начинающийся с jl ra 2 50, является функцией, которая принимает вводное значение в ra и возвращает результат в rd. Она вызывает себя рекурсивно для вычисления факториала значения в ra.
Если вы хотите поиграться с ней самостоятельно, то можете сделать ее копию здесь [3].
Вы можете увидеть код Apps Script, выбрав «Инструменты» (Tools), а затем «Редактор скриптов» (Script Editor).
Автор: PayOnline
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/260608
Ссылки в тексте:
[1] Apps Script: https://developers.google.com/apps-script/
[2] числа Фибоначчи: https://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%B0_%D0%A4%D0%B8%D0%B1%D0%BE%D0%BD%D0%B0%D1%87%D1%87%D0%B8
[3] здесь: https://docs.google.com/spreadsheets/d/1385V2Mu2yZOMSJcSz9JrV6r8X0_JGzHZZRdPhaAdwWY/edit?usp=sharing
[4] Image: http://payonline.ru/?utm_source=habrahabr&utm_medium=referral&utm_campaign=webpayments-main
[5] Источник: https://habrahabr.ru/post/319754/
Нажмите здесь для печати.