Перейти на главную страницу
Сегодня наука и технология развиваются столь стремительно, что образование зачастую не успевает за ними. Например, для того, чтобы успешно выступать на Российских олимпиадах по информатике (читай — по программированию), надо серьёзно заниматься хотя бы с седьмого, а ещё лучше — с шестого или даже пятого класса. Ведущие вузы и фирмы, работающие в области информационных технологий, — МГУ, МФТИ, МИФИ, Intel и др. — стараются привлечь школьников к научной деятельности, причём со всё более раннего возраста. Для этого проводятся конкурсы, викторины, олимпиады и другие мероприятия. Наш опыт в подготовке детей к такой работе показывает, что начиная с некоторого момента (совпадающего приблизительно с 4–5 классом) интересы ребят претерпевают существенные изменения и у большинства из них сильно удаляются от учебной деятельности вообще и научно-познавательной — в частности. Это можно объяснить разными причинами (что и делают психологи и педагоги), но одной из наиболее серьёзных таких причин, несомненно, является неуспешность наших детей в учебной деятельности или боязнь такой неуспешности. Как показывают исследования психологов, боязнь потерпеть неудачу в школе дети ставят на второе место (по силе стресса), сразу после смерти родителей (сведения получены на семинаре М. А. Холодной). В такой ситуации одной из важнейших задач педагогов следует считать создание комфортной учебно-воспитательной среды, в которой возможна наиболее полная самореализация ребёнка. При этом хотелось бы избежать другой крайности и не превратить российское обязательное образование в «школу радости», в которой радости, безусловно, много, а вот знаний практически нет.
Другой причиной снижения интереса учеников, имеющей отношение собственно к информатике, является очень небольшое количество часов, предусмотренное федеральными образовательными стандартами на изучение данного предмета. Более того, стандарты второго поколения вообще не включают дисциплину «Информатика», заменяя её «Информационными технологиями». Основной акцент предполагается сделать на приобретении учениками информационной грамотности, подразумевающей общие навыки обработки информации различных видов. Теоретическая же подготовка по информатике вынесена во внеучебную деятельность и, таким образом, носит факультативный характер.
Интерес авторов некоторое время лежит в сфере изучения возможных подходов к организации проектной внеучебной образовательной деятельности по информатике в средней школе. Наш опыт свидетельствует, что такая деятельность позволяет, с одной стороны, организовать среду для самореализации и самоутверждения учеников, и, с другой стороны, сформировать у них тягу к творчеству и знаниям и дать подходящие средства её реализации. В настоящей работе в качестве дидактического примера мы рассмотрим пропедевтику элементов (идей) параллельного программирования на первой и второй ступенях средней общеобразовательной школы (соответственно, 1 4 и 5 9 классы) при помощи языка программирования Scratch. Интерес именно к параллельному программированию вызван, во-первых, широким распространением этой технологии, а во-вторых, — наличием подходящего инструмента для изучения соответствующих техник.
Обсуждение
Среда Scratch разработана и поддерживается группой MIT Media Lab из Массачусетского института технологии (http://scratch.mit.edu). Scratch является бесплатным продуктом, что немаловажно для российских школ. Его разработка ведётся на языке Squeak, одном из наследников Smalltalk. Алан Кей, стоящий у истоков Smalltalk, а значит и у самых корней объектно-ориентированных технологий вообще, очень заинтересованно относится к развитию мышления и креативности детей. Причём Кей считает, что такое развитие должно начинаться как можно раньше: «…the media that powerfully shape our ways of thinking must be made accessible as early in life as possible». Среда (и язык) программирования Scratch, по задумке его создателей, является как раз тем средством, которое способно формировать «способы мышления».
Одной из главных концепций языка Scratch, является развитие собственных задумок с первой идеи до конечного программного продукта. Для этого в Scratch имеются все необходимые средства:
Одной из важнейших особенностей проекта Scratch является большое постоянно действующее сообщество пользователей. Собственные разработки можно выкладывать в Интернет и затем просматривать их на любом компьютере, где установлена Java (или сам Scratch). В настоящее время актуальной является версия Scratch 1.3, поддерживающая кириллицу (и несколько десятков других языков).
Уже в начальной школе дети легко могут освоить такие понятия как «параллельность» и «синхронизация». При этом важным является не «знание» терминологии, но понимание взаимной связи выполняющихся потоков.
Пример того, как можно вводить данные понятия рассмотрим на конкретных задачах. Оговоримся прежде, что для плодотворной работы в Scratch, дети уже должны быть знакомы с такими понятиями как система координат и случайное число.
Вначале организуем простейшую анимацию за счёт последовательной смены костюмов через равные промежутки времени в бесконечном цикле. В результате Пчела, стоя на месте, будет махать крыльями. Далее объясняем детям, что теперь нужно, чтобы Пчела не просто махала крыльями, но ещё и плавно перемещалась в случайную точку на экране. Как правило, дети сами придумывают такой вариант решения: в уже имеющуюся конструкцию добавить дополнительный блок скольжения.
Запуск программы показывает, что Пчела действительно летает случайным образом, однако взмахи крыльями у неё происходят только в момент смены направления, а не в процессе полёта. Тогда мы предлагаем завести ещё один бесконечный цикл «всегда» и вынести в него скольжение Пчелы в случайную точку. И поскольку оба бесконечных цикла — взмахи крыльями и случайные скольжения должны выполняться одновременно (параллельно), обе конструкции должны приводиться в действие по нажатию на зелёный флажок. В результате один объект «Пчела» будет выполнять одновременно два потока:
всегда
ждать 0,1 секунд
конец
всегда
x: [случайное число от -235 до 235]
y: [случайное число от -175 до 175]
конец
Для решения этой задачи необходимо, чтобы дети умели работать с переменными.
Обработку касания будет производить Лошадь в бесконечном цикле. Если Лошадь касается Пиццы, то она передаёт последней сообщение об этом и начисляет себе одно очко. Пицца, получив сообщение, исчезает, передаёт сообщение «Появись» и сама же обрабатывает это сообщение, в результате чего появляется в новом месте экрана.
Запуск программы показывает, однако, некорректное начисление очков: вместо одного Лошадь успевает начислить себе два (и более) очка за одну Пиццу. Здесь нужно объяснить детям, что пока Пицца обрабатывает полученное сообщение, Лошадь успевает проверить момент касания несколько раз, а значит несколько раз начислить себе по очку. Чтобы избавиться от этого недостатка необходимо вместо команды передать использовать передать_и_ждать. В результате получаем корректно работающую программу и неявно вводим понятие синхронизации.
поставить [очки] в 0 всегда
если [касается [Пицца]] передать [исчезни] и ждать изменить [очки] на 1 конец
|
когда я получу [Исчезни] спрятаться передать [появись]
показаться установить x в [случ. число от -230 до 230] установить y в [случ. число от -170 до 170] |
Листинг основного скрипта Лошади |
Листинг скриптов Пицца |
Описанные задачи являются частями одного игрового проекта, в котором Пчела жалит Лошадь, в результате этого Лошадь теряет жизни, но должна съест определённое количество Пиццы, после чего игра заканчивается или переходит на новый уровень.
При дальнейшем изучении программирования на Scratch можно начинать систематически изучать более абстрактные технологии. В 5 6 классах ученики уже вполне способны воспринимать такие понятия как «многопоточность», «синхронизация», «голодание», «взаимная блокировка», «мьютекс», «семафор» и др. Даже если до сих пор эти термины не звучали на занятиях, основные идеи уже подхвачены и усвоены большинством ребят — иначе не написать ни одной сколько-нибудь серьёзной программы.
Задача синхронизации возникает в любой параллельной программе, где потоки работают с общими ресурсами. Большинство ребят, занимающихся Scratch с первого класса хорошо знакомы с проблемами синхронизации потоков и имеют в запасе несколько приёмов решения таких проблем. Теперь самое время систематизировать полученные знания. В качестве иллюстрации возможностей Scratch в области преподавания основ параллельного программирования рассмотрим две задачи: (3) о синхронизации потоков при помощи установки барьера и (4) об использовании мьютекса для организации критических секций.
Поскольку движение случайное (по абсолютной величине скорости), то рассчитать заранее время начала совместного движения невозможно: оно должно начаться, как только последний (самый медленный) объект придёт в точку встречи. Одним из стандартных подходов к решению таких задач является механизм барьеров. Scratch не имеет для этого функций, аналогичных содержащимся в библиотеке pthreads, поэтому нам придётся позаботиться и о написании «системного» кода. С методической точки зрения это очень кстати, так как, с одной стороны, не составляет особого труда, а с другой — позволяет яснее представить себе внутренние, системные механизмы изучаемой технологии.
«Системные» функции возложим на Дерево. Его задачей будет дать команду к началу движения и вести счётчик прибывших объектов. Как только счётчик станет равен трём, дать команду к общему движению.
Каждый из трёх движущихся объектов имеет практически одинаковый набор из трёх скриптов, представляющих собой различные потоки. Первый скрипт задаёт начальное положение спрайта и ориентацию на Дерево. Второй скрипт описывает неравномерное движение спрайта до касания Дерева. После этого касания объект останавливается и посылает сообщение о своём прибытии. Третий скрипт — плавное скольжение совместно с остальными объектами до конечной точки.
when I receive [I’m here!] change n by 1 if n=3 broadcast [Go together] |
when I receive [Start!] repeat until [touching Palmtree?] ……. end
broadcast [I’m here] |
Листинг основного скрипта Дерева |
Листинг основного скрипта объекта |
Легко видеть, что небольшой и вполне наглядный код позволяет не только продемонстрировать синхронизацию потоков, но и дать представление о работе системных механизмов.
Здесь «критической секцией» будет процедура совершения прыжка. То есть нужно обеспечить объекту возможность (а) добраться до критической секции и (б) находиться в ней одному. В Scratch нет функций типа send() и receive(), так что пересылку адресных сообщений будем выполнять при помощи всё тех же broadcast и broadcast_and_wait, которые обрабатывает только тот объект, которому они предназначены.
«Системные» функции возложим на объект Фон (stage). Он будет поддерживать работу с мьютексом. Сам мьютекс будет переменной, принимающей значение «ноль» если прыгать можно и «один» — если нельзя. Другими словами, мьютекс показывает количество объектов, находящихся в данный момент в «критической секции».
Рассмотрим в качестве примера объект Кот. Доступ в критическую секцию организуется при помощи простого скрипта:
forever
broadcast [cat_mutex_lock] and wait
broadcast [mutex_unlock]
end
Первое сообщение запрашивает мьютекс и дожидается его освобождения. Второе сообщение посылается в том случае, когда получено «невидимое» сообщение от Фона, что мьютекс освободился и передан объекту (осуществляется командой broadcast_and_wait); это сообщение запускает процедуру прыжка (здесь не рассматривается). Третье сообщение освобождает мьютекс. Самым сложным для понимания моментом является необходимость вызова broadcast_and_wait для передачи первого адресного сообщения и возможность использования broadcast для передачи третьего безадресного (общего) сообщения.
Фон должен обрабатывать первое и третье сообщения. В первом обработчике мы ждём, пока мьютекс освободится и затем захватываем его. Важно понимать, что пока Фон дожидается освобождения мьютекса (в цикле wait until mutex=0), объект тоже ждёт освобождения мьютекса, так как для захвата использовался broadcast_and_wait. Освобождение мьютекса Фоном сводится к обнулению соответствующей переменной.
when I receive [cat_mutex_lock] wait until mutex=0 set mutex to 1 end
|
when I receive [mutex_unlock] set mutex to 0 end
|
Листинг основных скриптов Фона |
Разумеется, рассмотренная программа является только первым приближением. Очень легко добавляется:
Выводы
Одним из самых известных неформальных способов организации ВУ является метод проектов. Мы долгое время искали подходящий инструмент для организации такой деятельности и остановились на среде Scratch. Овладев минимальным набором операций, даже неискушённый программист может создавать законченные проекты и делиться ими с большим и дружелюбным сообществом.
При этом хотелось бы избежать другой крайности и не превратить российское обязательное образование в «школу радости», в которой радости, безусловно, много, а вот знаний практически
27 09 2014
1 стр.
Работа предлагает постановку задачи оценки параллельного программирования. Рассматривается ряд подходов к оценке сложности параллельных программ
15 12 2014
1 стр.
Для каждого из параллельных процессов обычно используется отдельный процессор. Язык разработан в Англии специально для транспьютеров, но может быть использован и для параллельног
14 10 2014
1 стр.
Терморегулятор предназначен для поддержания заданной температуры среды путем коммутации нагревательных элементов в режиме обогрева или вентиляторов в режиме охлаждения среды. Регул
13 10 2014
1 стр.
Мы задумались над тем, какими проблемами живёт современная молодёжь, которая учится в средней школе. Большинство литературы занимается проблематикой молодёжи, а не её проблемами
15 09 2014
1 стр.
Ате смены парадигмы образования в средней школе
13 10 2014
1 стр.
В настоящее время в области научно-технических расчетов превалируют три модели параллельного программирования: модель передачи сообщений (мпс), модель с общей памятью
14 12 2014
15 стр.
При переходе из одной среды в другую свет испытывает преломление, направление распространения света меняется. Количественно это явление описывается законом Декарта-Снеллиуса (1637
07 10 2014
1 стр.