В этой заметке предлагается концепция языка программирования без компьютера и одна из возможных реализаций этой концепции. Язык изначально задумывался как средство для приобщения к программированию самых маденьких, но аудиторию определит практика. Материал для всех, кто интересуется обучением программированию..
Предыстория
Несколько лет назад я занимался переводом и редактированием перевода Блокли (Блокли, в частности, предлагает набор игр для юных программистов), продвигал Блокли, по мере сил, в русскоязычном пространстве. С появлением микро:бита я практически полностью переключился на популяризацию системы MakeCode (на начальной стадии разработки MakeCode Блокли использовался в качестве библиотеки, то есть, я как бы не изменял своему "крестнику").
И вот недавно, взглянув на подрастающего внука, я решил, что пора бы уже задуматься о его приобщении к программированию. Понял я, что MakeCode, с целевой аудиторий 12+, мне не помощник, и вспомнил про старого доброго знакомого - Блокли.
Первая игра Блокли - Лабиринт по идее, как раз должна служить для первого знакомства с базовыми идеями программирования. Но при свежем взгляде и конкретной задаче меня в Лабиринте уже не всё устроило.
Во-первых, сама идея начинать программировать сразу на компьютере: электроники в мире дошколят и без этого полно, плюс стоимость и порог вхождения пользователя. А оторвать программирование блоками (не только для Блокли) от компьютера практически невозможно: сделать, скажем, картонные блоки не получится, поскольку блоки могут вмещать в себя несколько блоков, их размер меняется. Опять же, рисованием блоки заменить трудно, а текст просто противоречит идее упрощения языка для начинающих
Во-вторых - привязка блоков к естественному языку. А если детсадовский орёл ещё читать не научился - ему и попрограммировать нельзя?
Словом, по мотивам Лабиринта (и Черепашки) родилась концепция языка Путник с вариантом для программирования движения на клетчатой плоскости.
Класс задач, на самом деле, можно выбрать и другой, сохраняя предлагаемый синтаксис, стилистику и управляющие структуры языка (об этом позже).
Синтаксис я постарался сделать максимально простым, безжалостно отсекая всё лишнее из традиционных текстовых языков программирования. Сначала показалось, что задача - "на один присест", но, с увеличением числа конструкций, стало ясно, что нужно искать баланс между полнотой, простотой и строгостью.
Получился довольно лаконичный язык, который можно использовать без компьютера Правда ли он подходит для детсадовцев и младших школьников? Пока сказать трудно: нужны эксперименты. Ещё труднее предсказать реакцию взрослых: если они сочтут язык слишком абстрактным, то до детей он просто не дойдёт..
И всё-таки я надеюсь, что найдутся энтузиасты, чтобы попробовать что-то новенькое. Опять же, инструмент можно попробовать и с детьми несколько старше, поскольку язык позволяет решать и довольно нетривиальные задачи, как будет показано в конце.
Замечание: лексика языка разрабатывалась под ручное письмо, передача её в тексте с клавиатуры затруднена, Для первого наброска я позволил себе не гнаться за натурализмом и ввёл в тексте ряд замен. Надеюсь, эти замены не заслонят задумку.
Теперь - к делу.
Язык Путник
Концепция
- Создание программы: программа пишется на бумаге (или собирается из картонных квадратов с изображением символов языка). Лексемы языка - максимально простые значки или их небольшие группы, которые легко написать и легко интерпретировать.
- Исполнение программы: Исполнителем выступают сами дети.
- Поле исполнения программы (для варианта с движением по плоскости): клетчая плоскость, где могут быть стенки. Клетки могут быть окрашены в различные цвета. Полем может служить асфальтированный двор, разрисованный в клеточку, пол из крупной плитки, а также настольная реализация.
Навыки, требуемые от программиста
- Знание право-лево
- Знание цифр и умение считать до 10
- Различение основных цветов
Этих навыков достаточно для составления программы из картонных квадратиков. Программу можно также писать на бумаге, тогда от юного программиста потребуется ещё владение карандашом (авторучкой) для изображения цифр и простых символов.
Составляющие языка
- команды - атомарные операции, исполняемые программой
- условия - условия используются в управляющих конструкциях - условных операторах и циклах, завершающихся по условию
- управляющие конструкции - циклы и условные операторы
Собственно язык предствлен управляющими конструкциями, а команды и условия можно подбирать для каждого класса задач отдельно.
Команды
Команды для движения на клетчатой плоскости:
команда | изображение | комментарий |
шаг вперёд | Λ | Лямбда, "шагающие ноги" |
повернуть налево | ← | стрелка влево |
повернуть направо | → | стрелка вправо |
закрасить клетку указанным цветом | квадрат данного цвета. Замена - первая буква цвета | Ограничимся К, Ж, З - цветами светофора |
Строка программы может содержать произвольное число команд
Пример:
- Движение "лесенкой":Λ←Λ→Λ
Циклы, выполняемые определённое число раз
вид цикла | изображение | комментарий |
выполнение команды определённое число раз | цифра 2-9 | исполняет команду справа |
выполнение группы команды определённое число раз | цифра 2-9 с пробелом | исполняет группу команд от пробела до конца строки |
Примеры.
- 5 шагов вперёд:: 5Λ
- развернуться и сделать 3 шага: 2→3Λ
- обойти квадрат со стороной 3 шага против часовой стрелки: 4 3Λ←
- "4 ступеньки": 4 Λ←Λ→
Условия и логические операции
Условия обозначаются кружком. Содержание кружка определяет само условие: это значок или цвет круга. Кружок можно интерпретировать как "вид в подзорную трубу" Символ в круге заменён в тексте комбинацией \<символ>.
Вместо слово "условие" можно использовать "случай".
логическое выражение | изображение | комментарий | |||
Путник находится на клетке заданного цвета? | круг, закрашенный данным цветом, замена
|
||||
Есть проход влево? | \← | ||||
Есть проход вправо? | \→ | ||||
Есть проход вперёд? | \Λ | ||||
Проход вперёд закрыт? (перед Путником стенка?) |
|
буква V, "перевёрнутые ноги" | |||
логическя операция | расширение языка для более сложных программ | ||||
ИЛИ | \<условие1>\...\<условиеN> | идущие подряд условия объединяются операцией ИЛИ | |||
И | \<условие1>...<условиеN> | несколько условий в одном круге объединяются операцией И |
Условия используются в условном операторе и цикле, завершающемся по условию. Для удобства изложения начнём с циклов.
Цикл "идти до"
- шаги вперёд выполняются. пока условие цикла не станет истинным
цикл | изображение | комментарий |
"идти до" | Λ>\... |
Выполняется шаг вперёд, пока условие не станет истинным Знак > (или Лямбда, повернутая на 90 градусов по часовой стрелке) - направлен на цель движения. |
Примеры:
- "Шагать до финиша". В этом примере и ряде последующих мы будем считать, что финиш - это красная клетка.
Λ>\К
- "Маршрут с левым поворотом": Λ>\V←Λ>\К
- "Лево руля": 5 Λ>\V←
- "Право руля": 5 Λ>\V→
Как будет показано ниже, цикл "идти до" является избыточным в языке, и он может быть заменён более универсальной формой цикла "выполнять до". Смысл введения этой конструкции - в облегчении перехода к более абстрактной универсальной конструкции, "идти до", состоящая из 3-х символов, хорошо ложится на естественный язык:
Λ - шагать впелёд
> - до
\К - красной клетки
Цикл "выполнять до"
- группа действий выполняется. пока условие цикла не станет истинным.
"Выполнять до" - обобщение предыдущей конструкции, позволяющее выполнять произвольную группу действий.
Синтаксис этой конструкции отличается: она начинается с условия завершения цикла, за которым стоят выполняемые действия. Все действия после условия и до конца строки являются телом цикла.
цикл | изображение | комментарий |
"выполнять до" | ><условие><действия> |
Эта конструкция поднимает язык на новый уровень абстракции и позволяет, в частности, решить ряд уже рассмотренных задач более общим способом.
Примеры.
- "Шагать до финиша" (смотри выше). >\КΛ
- "Лево руля" (смотри выше) : >\КΛ>\V←
- "Право руля" (смотри выше): >\КΛ>\V→
Ограничения: у конструкции нет закрывающего разделителя, и она может быть вложена в другой цикл только при условии, что после неё до конца строки нет других действий в охватывающем цикле.
Условные операторы
Синтаксически наиболее сложная конструкция, которая имеет собственный разделитель, отличный от конца строки - пробел. Пробел предназначен для завершения условного оператора внутри строки. Внутри условного оператора условия одновременно закрывают предыдущую ветку и открывают новую
Условный оператор не допускает вложенности: внутри него нельзя использовать другой условный оператор. Внутри любой ветки условного оператора можно использовать циклы, если конец цикл "идти до", а также цикл "выполнять до", для которого конец цикла должен совпадать с концом ветки. Условный оператор можно употреблять внутри цикла (за вычетом случая, когда цикл уже находится внутри условного оператора, при этом конец условного оператора не обязан совпадать с концом цикла, поскольку конец условного оператора обозначен пробелом.
условный оператор | изображение | комментарий |
если | \<условие><действия><пробел> | пробел обязателен, если конец конструкции не совпадает с концом строки |
если-,,,иначе если | \<условие1><действия>...\<условиеN><действия><пробел> | Пробел внутри конструкции НЕ употребляется |
если -иначе | \<условие><действия>\X<действия><пробел> | Х в кружочке означает "все остальные случаи" |
если-,,,иначе если -иначе | \<условие1><действия>...\<условиеN><действия>\X<действия><пробел> |
Примеры:
- "Лево руля" (смотри выше) : >\КΛ\←←
- "Право руля" (смотри выше) : >\КΛ\→→
- "Извилистый маршрут без развилок": >\КΛ\→→\←←
В довершении, для иллюстрации программирования достаточно сложной логики: классические правила обхода лабиринтов без петель.
- "Правило правой руки": >\К\ΛΛ \→→Λ \Λ\→\X←
- "Правило левой руки": >\К\ΛΛ \←←Λ \Λ\←\X→
Эти правила приложимы к заключительному из Лабиринтов:
Вот аналог одного из вариантов программы на Блокли:
"А напоследок я скажу"
Так уж получалисось, что все примеры пришлись на Лабиринт, и ничего на Черепашку. С Черепашкой нужно подумать о включении опускания-поднятия пера. Закраска клетки в текущем варианте - это, скорее, заготовка под более сложные лабиринты с петлями, где при прохождении некоторых развилок нужно ставить пометки.
Все примеры укладываются в одну строку - посто не было нужды разбивать программу. В принципе можно писать программы из нескольких строк, но есть ограничение: все конструкции закрываются внутри строки, нельзя создать конструкцию из нескольких строк. Это одно из ограничений, принятых для упрощения синтаксиса, как и некоторые другие, упомянутые выше в тексте.
Несмотря на ограничения, возможности яхыка представляются вполне достаточными для начального обучения программированию и разработке алгоритмов.
Язык при желании нетрудно расширить процедурами.
Собственно язык - это первый шаг: нужны поля для исполнения программ, упражнения, сюжеты игр, а также переносы на другие классы задач. Всё это может реализоваться только как плод коллективных усилий.
Собираюсь создать группу на Фейсбуке.
Завершу идеей одной игры:
Игра Кладоискатели
На поле (лабиринт с несколькими входами?) разложены клады.
Есть стопка ("колода") карточек с символами языка.
Каждый игрок получает получает в начале несколько карточек Ходы исполняются по очереди. При ходе игрок получает из стопки ещё одну карточку и по выбору либо составляет из всех или части карточек программу передвижения на другое поле, либо пропускает ход в надежде собрать более удачный набор карточек позже.
При исполнении программы игрок забирает все сокровища, через которые прошёл маршрут
Игра завершается, когда все сокровища будут собраны.
Отмечу, что одну и ту же карточку > ("до") можно использовать и как "шагающие ноги" и как "перевёрнутые шагающие ноги". Окружность, используемую для условий, можно сделать съёмной и получаемой по требованию без ограничений. Это позволит двояко использовать команды, графически совпадающие с условиями (так уж получилось :-)).
========================================
Буду благодарен за отзывы и идеи.
До встречи на просторах!
Использованы скриншоты из игры Блокли Лабиринт.