Публикации сообщества

Михаил Семионенков • 25 июля 2021

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

 

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

Предыстория


Несколько лет назад я занимался переводом и редактированием перевода Блокли (Блокли, в частности, предлагает набор игр для юных программистов), продвигал Блокли, по мере сил, в русскоязычном пространстве. С появлением микро:бита я практически полностью переключился на популяризацию системы MakeCode (на начальной стадии разработки MakeCode Блокли использовался в качестве библиотеки, то есть, я как бы не изменял своему "крестнику"). 

И вот недавно, взглянув на подрастающего внука, я решил, что пора бы уже задуматься о его приобщении к программированию. Понял я, что MakeCode, с целевой аудиторий 12+, мне не помощник, и вспомнил про старого доброго знакомого - Блокли. 

Первая игра Блокли - Лабиринт по идее, как раз должна служить для первого знакомства с базовыми идеями программирования. Но при свежем взгляде и конкретной задаче меня в Лабиринте уже не всё устроило.

Во-первых, сама идея начинать программировать сразу на компьютере: электроники в мире дошколят и без этого полно, плюс стоимость и порог вхождения пользователя. А оторвать программирование блоками (не только для Блокли) от компьютера практически невозможно: сделать, скажем, картонные блоки не получится, поскольку блоки могут вмещать в себя несколько блоков, их размер меняется. Опять же, рисованием блоки заменить трудно, а текст просто противоречит идее упрощения языка для начинающих
Во-вторых - привязка блоков к естественному языку. А если детсадовский орёл ещё читать не научился - ему и попрограммировать нельзя? 

Словом, по мотивам Лабиринта (и Черепашки) родилась концепция языка Путник с вариантом для программирования движения на клетчатой плоскости.
Класс задач, на самом деле, можно выбрать и другой, сохраняя предлагаемый синтаксис, стилистику и управляющие структуры языка (об этом позже).

Синтаксис я постарался сделать максимально простым, безжалостно отсекая всё лишнее из традиционных текстовых языков программирования. Сначала показалось, что задача - "на один присест", но, с увеличением числа конструкций, стало ясно, что нужно искать баланс между полнотой, простотой и строгостью. 

Получился довольно лаконичный язык, который можно использовать без компьютера Правда ли он подходит для детсадовцев и младших школьников? Пока сказать трудно: нужны эксперименты. Ещё труднее предсказать реакцию взрослых: если они сочтут язык слишком абстрактным, то до детей он просто не дойдёт..

И всё-таки я надеюсь, что найдутся энтузиасты, чтобы попробовать что-то новенькое. Опять же, инструмент можно попробовать и с детьми несколько старше, поскольку язык позволяет решать и довольно нетривиальные задачи, как будет показано в конце.

Замечание: лексика языка разрабатывалась под ручное письмо, передача её в тексте с клавиатуры затруднена, Для первого наброска я позволил себе не гнаться за натурализмом и ввёл в тексте ряд замен. Надеюсь, эти замены не заслонят задумку.

Теперь - к делу.

Язык Путник


Концепция

  1. Создание программы: программа пишется на бумаге (или собирается из картонных квадратов с изображением символов языка). Лексемы языка - максимально простые значки или их небольшие группы, которые легко написать и легко интерпретировать.
  2. Исполнение программы: Исполнителем выступают сами дети.
  3. Поле исполнения программы (для варианта с движением по плоскости): клетчая плоскость, где могут быть стенки. Клетки могут быть окрашены в различные цвета. Полем может служить асфальтированный двор, разрисованный в клеточку, пол из крупной плитки, а также настольная реализация.

Навыки, требуемые от программиста

 

  1. Знание право-лево
  2. Знание цифр и умение считать до 10
  3. Различение основных цветов

Этих навыков достаточно для составления программы из картонных квадратиков. Программу можно также писать на бумаге, тогда от юного программиста потребуется ещё владение карандашом (авторучкой) для изображения цифр и простых символов.

Составляющие языка

  • команды - атомарные операции, исполняемые программой
  • условия - условия используются в управляющих конструкциях - условных операторах и циклах, завершающихся по условию
  • управляющие конструкции - циклы и условные операторы

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

Команды

Команды для движения на клетчатой плоскости:

команда изображение комментарий
шаг вперёд Λ Лямбда, "шагающие ноги"
повернуть налево  стрелка влево
повернуть направо  стрелка вправо
закрасить клетку указанным цветом квадрат данного цвета. Замена - первая буква цвета  Ограничимся К, Ж, З - цветами светофора

 

Строка программы может содержать произвольное число команд

Пример:

  • Движение "лесенкой":ΛΛΛ
Путник2
Движение "лесенкой"


Циклы, выполняемые определённое число раз

вид цикла изображение комментарий
выполнение команды определённое число раз цифра 2-9 исполняет команду справа
выполнение группы команды определённое число раз цифра 2-9 с пробелом исполняет группу команд от пробела до конца строки

 

Примеры.

  • 5 шагов вперёд:: 
  • развернуться и сделать 3 шага: 23Λ
  • обойти квадрат со стороной 3 шага против часовой стрелки: 4 3Λ
  • "4 ступеньки": ΛΛ
Путник4
"4 ступеньки"

 

Условия и логические операции

Условия обозначаются кружком. Содержание кружка определяет само условие: это значок или цвет круга. Кружок можно интерпретировать как "вид в подзорную трубу" Символ в круге заменён в тексте комбинацией \<символ>. 

Вместо слово "условие" можно использовать "случай".

логическое выражение изображение комментарий
Путник находится на клетке заданного цвета? круг, закрашенный данным цветом, замена
\К
\Ж
\З
 
Есть проход влево? \  
Есть проход вправо? \  
Есть проход вперёд?  
Проход вперёд закрыт? (перед Путником стенка?)
  \V
буква V, "перевёрнутые ноги"
логическя операция   расширение языка для более сложных программ
ИЛИ \<условие1>\...\<условиеN> идущие подряд условия объединяются операцией ИЛИ
И \<условие1>...<условиеN> несколько условий в одном круге объединяются операцией И

 

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

 

Цикл "идти до"

 

- шаги вперёд выполняются. пока условие цикла не станет истинным

цикл изображение комментарий
"идти до" Λ>\...

Выполняется шаг вперёд, пока условие не станет истинным

Знак > (или Лямбда, повернутая на 90 градусов по часовой стрелке) -  направлен на цель движения. 

     

 

Примеры:

  • "Шагать до финиша". В этом примере и ряде последующих мы будем считать, что финиш - это красная клетка. 

Λ>\К

Путник3
"шагать до финиша (до красной клетки)"

 

  • "Маршрут с левым поворотом": Λ>\VΛ>\К

 

 

путник5
"Маршрут с левым поворотом"

 

  • "Лево руля": 5 Λ>\V
путник6
"Лево руля"

 

 

  • "Право руля": 5 Λ>\V
путник7
"Право руля"

 

Как будет показано ниже, цикл "идти до" является избыточным в языке, и он может быть заменён более универсальной формой цикла "выполнять до". Смысл введения этой конструкции - в облегчении перехода к более абстрактной универсальной конструкции, "идти до", состоящая из 3-х символов, хорошо ложится на естественный язык:

Λ - шагать впелёд

> - до

\К - красной клетки

 

Цикл "выполнять до"

- группа действий выполняется. пока условие цикла не станет истинным.

"Выполнять до" - обобщение предыдущей конструкции, позволяющее выполнять произвольную группу действий.
Синтаксис этой конструкции отличается: она начинается с условия завершения цикла, за которым стоят выполняемые действия. Все действия после условия и до конца строки являются телом цикла.

цикл изображение комментарий
"выполнять до" ><условие><действия>
 


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

Примеры. 

  • "Шагать до финиша" (смотри выше). >\КΛ
  • "Лево руля" (смотри выше) : >\КΛ>\V
  • "Право руля" (смотри выше): >\КΛ>\V

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

Условные операторы

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

Условный оператор не допускает вложенности: внутри него нельзя использовать другой условный оператор. Внутри любой ветки условного оператора можно использовать циклы, если конец цикл "идти до", а также цикл "выполнять до", для которого конец цикла должен совпадать с концом ветки. Условный оператор можно употреблять внутри цикла (за вычетом случая, когда цикл уже находится внутри условного оператора, при этом конец условного оператора не обязан совпадать с концом цикла, поскольку конец условного оператора обозначен пробелом.

условный оператор изображение комментарий
если \<условие><действия><пробел> пробел обязателен, если конец конструкции не совпадает с концом строки
если-,,,иначе если \<условие1><действия>...\<условиеN><действия><пробел> Пробел внутри конструкции НЕ употребляется
если -иначе \<условие><действия>\X<действия><пробел> Х в кружочке означает "все остальные случаи"
если-,,,иначе если -иначе \<условие1><действия>...\<условиеN><действия>\X<действия><пробел>  

 

Примеры:

  • "Лево руля" (смотри выше) : >\КΛ\←←
  • "Право руля" (смотри выше) : >\КΛ\→→
  • "Извилистый маршрут без развилок": >\КΛ\→→\←←
путник8
"Извилистый маршрут без развилок"​​​

 

В довершении, для иллюстрации программирования достаточно сложной логики: классические правила обхода лабиринтов без петель.

  • "Правило правой руки": >\К\ΛΛ \→→Λ \Λ\\X
  • "Правило левой руки": >\К\ΛΛ \←←Λ \Λ\\X

Эти правила приложимы к заключительному из Лабиринтов:

путник10
Лабиринт № 10

 

Вот аналог одного из вариантов программы на Блокли:

правило левой руки
"Правило левой руки"

 

"А напоследок я скажу"

Так уж получалисось, что все примеры пришлись на Лабиринт, и ничего на Черепашку. С Черепашкой нужно подумать о включении опускания-поднятия пера. Закраска клетки в текущем варианте - это, скорее, заготовка под более сложные лабиринты с петлями, где при прохождении некоторых развилок нужно ставить пометки.

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

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

Язык при желании нетрудно расширить процедурами.

Собственно язык - это первый шаг: нужны поля для исполнения программ, упражнения, сюжеты игр, а также переносы на другие классы задач. Всё это может реализоваться только как плод коллективных усилий.

Собираюсь создать группу на Фейсбуке.

Завершу идеей одной игры:

Игра Кладоискатели

На поле (лабиринт с несколькими входами?) разложены клады.

Есть стопка ("колода") карточек с символами языка.

Каждый игрок получает получает в начале несколько карточек  Ходы исполняются по очереди. При ходе игрок получает из стопки ещё одну карточку и по выбору либо составляет из всех или части карточек программу передвижения на другое поле, либо пропускает ход в надежде собрать более удачный набор карточек позже.

При исполнении программы игрок забирает все сокровища, через которые прошёл маршрут

Игра завершается, когда все сокровища будут собраны.

Отмечу, что одну и ту же карточку > ("до") можно использовать и как "шагающие ноги" и как "перевёрнутые шагающие ноги". Окружность, используемую для условий, можно сделать съёмной и получаемой по требованию без ограничений. Это позволит двояко использовать команды, графически совпадающие с условиями (так уж получилось :-)).

========================================

Буду благодарен за отзывы и идеи.

До встречи на просторах!

 

Использованы скриншоты из игры Блокли Лабиринт.

 

 

Кол-во комментариев: (11)

Лора Кравченко
Михаил, мне кажется, идея стоящая. Требуется, конечно, апробация, т к маленькие дети очень любят яркие игры, мало того, они сейчас просто завалены крутым красочным контентом. И насколько увлеченно они будут программировать, используя только знаки на бумаге, пока не ясно. Но я с малышами никогда не работала. Пороговый возраст был 5 класс и мы начинали каждое занятие с тетради, а потом переходили за компьютер. Так вот вторую часть ждали с огромным нетерпением. Словом, верю, что у Путника есть свой путь и будущее))
  • Войдите или зарегистрируйтесь, чтобы оставлять комментарии
  • Максим Пхидо
    Михаил Семионенковв общих чертах, есть лабиринт, вход и выход. Два заезда. Первый обучающий, бот исследует лабиринт. Второй заезд, бот проходит лабиринт оптимальным образом.
  • Войдите или зарегистрируйтесь, чтобы оставлять комментарии
  • Михаил Семионенков
    Максим Пхидо, спасибо. Правда, классики не дремлют, вот старинный пример. http://robogames.net/rules/maze.php Более современный подход - лабиринты изображают на плоскости, без стенок, просто езда по линии. Задача известная. Если есть желание своих орлов приобщить к таким соревнованиям, готов помочь с железом и программированием.
  • Войдите или зарегистрируйтесь, чтобы оставлять комментарии
  • Михаил Семионенков
    Ольга Тузова , спасибо большое за ссылку. Не уверен, что видел конкретно эту игрушку, но что-то когда-то встречал. В основе у меня те же принципы, только подход обобщён, с идеей инструментария для разных задач. А для внука надо это или что-то подобное готовое приобрести :-)
  • Войдите или зарегистрируйтесь, чтобы оставлять комментарии