Какая архитектура лежит в основе блоков программирования Scratch?

Мне нужно создать мини-версию программных блоков, которые используются в Scratch или более поздней версии! или открытые блоки.

Код во всех них большой и трудный для понимания, особенно в Scratch, который написан в некотором подмножестве SmallTalk, которого я не знаю.

Где я могу найти алгоритм, который они все используют для анализа блоков и преобразования его в набор инструкций, которые работают с чем-то, например, анимацией или играми, как в Scratch?

Я действительно заинтересован в алгоритмическом или архитектуре, лежащей в основе концепции блоков программирования.

1 ответ

Решение

Это будет просто по-настоящему общее объяснение, и вам решать конкретику.

Определение блока

E сть Block класс, от которого наследуются все блоки. Они инициализируются с их меткой (именем), формой и ссылкой на метод. Когда они запускаются / вызываются, соответствующему методу передаются текущий контекст (спрайт) и аргументы.

Точные реализации различаются между версиями. Например, в Scratch 1.x методы принимали аргументы, соответствующие аргументам блока, и контекст (this или же self) это спрайт. В 2.0 им передается единственный аргумент, содержащий все аргументы блока и контекст. Щелчок! Кажется, следует за методом 1.x.

Стек (команда) блоков ничего не возвращает; блоки репортера делают.

толкования

Переводчик работает примерно так. Каждый блок содержит ссылку на следующий и любые подпрограммы (репортерные блоки в аргументах; командные блоки в C-слоте).

Во-первых, все аргументы разрешены. Репортеры вызываются, а их возвращаемая стоимость сохраняется. Это делается рекурсивно для множества блоков Reporter внутри друг друга.

Затем сама команда выполняется. В идеале это простая команда (например, перемещение). Метод вызывается, сцена обновляется.

Продолжить со следующим блоком.

Блоки С

С блоки имеют немного другую процедуру. Эти if <> стиль, а repeat <> из них. В дополнение к своим обычным аргументам они ссылаются на свою подпрограмму "минискрипт".

Для простого if/else Блок C, просто выполните подпрограмму как обычно, если это применимо.

Однако при работе с циклами вы должны убедиться, что потоки выполняются правильно, и ждать других сценариев.

События

С событиями нажатия / нажатия клавиш можно справиться достаточно легко. Просто выполните их по нажатию клавиши / клику.

Нечто подобное вещанию можно выполнить, выполнив шляпу при запуске стека вещания.

Другие мероприятия вам придётся решать самостоятельно.

Блоки ожидания

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

Надеюсь, это поможет!

Другие вопросы по тегам