Аннотация
Доклад посвящен проблеме обучения параллельному программированию. Дана характеристика языков параллельного программирования, изучаемых в курсе “Парадигмы программирования” для студентов НГУ. Уделено вниманиепроблеме обучения параллельному программированию, актуальность которого возрастает на этапе перехода к многопроцессорным архитектурам. Возрастает актуальность обучения параллельному программированию, что требует развития языково-информационной поддержки введения в программирование. Предлагается проект языка начального обучения параллельному программированию (ЯНОП).
Введение
Мир программирования и его техническая основа претерпели значительные изменения за последние двадцать лет. Возрастает актуальность обучения параллельному программированию, что требует развития языково-информационной поддержки введения в программирование. Здесь прежде всего следует упомянуть бурное развитеие суперкомпьютеров и распределенных информационных систем, а также переход на многоядерные процессоры и широкое распространение графических процессоров. Для систематичной подготовки специалистов в области параллельного программирования необходима гибкая инструментально-языковая поддержка учебной практики, поддерживающая разные модели параллелизма. Однако, для многих языков высокого уровня характерно включение в семантику языка одной модели параллелизма. Поэтому становится актуальной проблема создания учебного языка параллельного программирования, предоставляющего основные модели параллелизма для обучения результативному представлению естественного параллелизма при решении важных задач.
При разработке ЯНОП рассмотрен ряд моделей параллелизма от уровня базовых средств управления взаимодействующими процессами до уровня разработки программ высокопроизводительных вычислений, предложенных в языках программирования Apl, Algol-68, Ada, Setl, Sisal, F# и др. Проанализированы требования к языковой и инструментальной поддержке процесса обучения параллельному программированию. Проект учебного языка параллельного программирования нацелен на ознакомление с основными моделями параллелизма, встречающимися в учебно-методических и научных материалах, языках высокого уровня, языках высокопроизводительного программирования и при организации сетевых информационных сервисов.
Определены уровни и цели начального (полгода в 10-12 лет) и допроизводственного (2 года с/к для старшеклассников и студентов) обучения в контексте истории языков программирвоания (Basic, Pascal, Logo, Grow, Робик, Рапира). Проанализированы текущие задачи разработки учебных языков программирования, дополняющих основные парадигмы программирования на ЯВУ (императивное, функциональное, логическое, объектно-ориентированное) средствами параллельного программирования (GPU, MPI, Open MP).
Сформулированы требования к языкам начального обучения параллельному программированию.
• Многовариантность лингвистической базы.
• Визуализация объектов и процессов при отладке.
• Концентричность или разложение понятий по уровням обучения.
• Представление и преобразование моделей управления процессами.
• Определение видов памяти с разной дисциплиной доступа.
• Настраивание на реалии производственных языков и систем.
• Выводимость оценки значимых характеристик производительности программ, таких как объем вычислений, надежность, безопасность и др.
В середине 1970-х годов активное исследование методов параллельного программирования рассматривалось как ведущее направление преодоления кризиса технологии программирования. Теперь рост интереса к параллельному программированию связан с переходом к массовому производству многоядерных архитектур. Роль параллелизма в современном программировании подробна рассмотрена в [3,5].
Проблемы определения языков параллельного программирования связаны с дистанцией между уровнем абстрактных понятий, в которых описываются решения сложных задач, и уровнем конкретных аппаратных средств и архитектурных принципов управления параллельными вычислениями (потактовая синхронизация, совмещение действий во VLIW-архитектурах, сигналы, семафоры критических участков, рандеву и т.п.)
С параллельными процессами студенты встречаются при работе на уровне ОС, при организации практики на базе суперкомпьютеров, при сетевой обработке данных, при компиляции учебных программ и т.п. Проблемы подготовки параллельных программ для всех столь разных работ обладают общностью, но есть и существенная специфика, требующая понимания разницы в критериях оценки программ и информационных систем для различных применений.
Сложившиеся в Новосибирском Государственном Университете традиции обучения программированию строится вокруг мировоззренческой ценности информатики, конструктивной роли программирования в процессах развития и применения информационных технологий, системного подхода к информатике обучения [2]. Разработанные в 1970-е годы учебные языки Робик и Рапира работали как предварительные ступени или лестница для перехода к производственным языкам и системам программирования [14,23]. При вполне убедительных успехах новосибирской системы обучения программированию [7,22], учебный потенциал ее раскрыт не полностью. В настоящее время возрастает актуальность обучения параллельному программированию, что требует доработки понятийной базы и языково-информационной поддержки системы обучения [6]. Разработан проект языка начального обучения параллельному программированию на базе языка Робик с учетом современных языков учебного программирования и методик обучения программированию взаимодействующих и параллельных процессов.
Отмечены проблемы реализации языка параллельного программирования допроизводственного уровня, решение которых предстоит найти в ближайшие годы.
• Общая сетевая модель параллельных процессов.
• Средства и методы типизации моделей управления процессами, спецификации многоуровневой памяти и межпроцессорных взаимодействий.
• Анализ и преобразование программ в соответствии с целевой архитектурой и моделями управления процессами.
• Программная поддержка кросс-компиляции, отладки и оптимизации программ (тесты, протоколы и сценарии).
• Интеграция императивных и функциональных моделей вычислений с производственными системами.
Ближайшие задачи: анализ и выбор решений
Языки параллельного программирования занимают видное место среди функциональных языков. Одна из причин заключается в том, что функциональные программы свободны от побочных эффектов и ошибок, зависящих от реального времени. Это существенно упрощает отладку. [6]
Для многих языков высокого уровня (ЯВУ) характерно включение в семантику языка одной модели параллелизма. Так в Algol-68 включено управление процессами в терминах семафоров для критических участков. В языке Ada предложен механизм «рандеву». APL нацеливает на обобщение скалярных операций до обработки однородных векторов произвольной размерности. SISAL предоставляет ряд средств формирования пространства итераций для параллельного исполнения циклов. Производственные инструменты MPI и Open MP также связаны определенными моделями параллелизма, поддержанными на уровне аппаратуры, что чревато известной проблемой переноса программ. [7,8]
Многие затруднения с параллельным программированием имеют отчасти образовательный характер. Концепции взаимодействующих процессов следовало бы осваивать при начальном знакомстве с информационными технологиями и программированием.
При проектировании языка начального обучения параллельному программированию (ЯНОП) учтены факторы успеха наиболее известных учебных языков программирования, таких как Basic, Pascal, Logo, Grow, с целью проявления их специфики и типовых свойств. Методически обусловлено введение программистских понятий в языке начального обучения программированию Робик. Тщательная проработка понятий в этом языке может служить базисом для любой профориентации учебного процесса по информатике, программированию и информационным технологиям. Ведущее понятие - «исполнитель», причем исполнителей может быть много, и они могут обладать разными системами команд. Такое понимание допускает естественное развитие в направлении моделирования асинхронных процессов.
Обычно учебные языки программирования обеспечивают быстрое получение первых успехов и обеспечивают переход от абстрактной алгоритмизации к практике отладки программ на производственных системах. Языки XXI века как правило поддерживают основные парадигмы программирования на ЯВУ – императивное, функциональное, логическое и объектно-ориентированное, что позволяет программировать решения задач с разным уровнем изученности в рамках единой языковой обстановки и получать навыки работы на всех фазах полного жизненного цикла программ. [10]
Первое требование к учебному языку программирования – обеспечить возможность отражения в его синтаксисе прогресса в обучении, овладении терминологией и приобретении навыков программирования в разных парадигмах. Для этого ЯНОП описывается многовариантной грамматикой, представляющей эквиваленты изучаемых конструкций. Похожий подход реализован в языках Cobol и Робик.
Учебные программы в ЯНОП строятся из действий, выполнение которых может быть обусловлено ожиданием времени (пауза) или другого сигнала, предикатом или вероятностью срабатывания. Последнее означает, что при исполнении ведется учет частоты выполнения вероятностных действий как в системах для разработки компьютерных игр. Можно объявить планируемую длительность выполнения действий.
При организации сложных данных и процессов используются общие структуры или средства композиции, такие как списки, множества и варианты, обеспечивающие представление отношений «после», «одновременно» и «взаимоисключение».
Представление циклов на ЯНОП учитывает решения языка Sisal, а именно, выделяются участки для формирования пространства распараллеливаемых итераций и для свертки полученных параллельно значений в общий результат.
Второе требование к учебному языку программирования в большей мере связано с параллелизмом. Нужна понятная визуализация взаимодействия процессов, включая демонстрацию зависимости от времени доступа к разным уровням памяти. Система визуализации для ЯНОП представляет собой иерархию классов объектов, изображаемых и перемещаемых на раскрашенной клетчатой доске, символизирующей обстановку для решения модельных задач.
Постановка учебной задачи формулируется в терминах команд исполнителю. Решение может быть получено как оперированием, так и программированием. При отладке решений можно задавать условное время показа отдельных действий. Кроме обычных команд по изменению обстановки, объектов, статуса исполнителя и меню допустимых команд, в ЯНОП имеются специальные команды для смены исполнителей и обстановок, а также для разрешения взаимодействий между исполнителями.
Реализация учебного языка параллельного программирования образует три уровня – элементарно-учебное ядро, технолого-прагматическое расширение и вводно-ознакомительная оболочка.
Ядро реализации ЯНОП составляют базовые средства уровня ОС – условия готовности и завершения процесса, очереди и серийная обработка, типичные для ОС UNIX и языка Java. Такие средства рассматриваются как основа для реализации схем управления, встречающихся в ЯВУ (критические участки и семафоры, рандеву, защищенные команды, конвейеры), навыки программирования и применения которых входят в задачу элементарно-учебного уровня.
Мультизначения, приоритеты процессов, просачивание скалярных операций на структуры данных, выстраивание пространства итераций, фильтры данных, сетевая синхронизация действий, оптимизирующие преобразования программ и распараллеливающие трансформации процессов – все это формируется как расширения ядра языка, выполняемые с целью достижения понимания реализационной семантики параллельного программирования для современных средств, что и является задачей технолого-прагматического уровня.
Задача вводно-ознакомительной оболочки – дать средства тексто-графической визуализации и моделирования примеров из жизни, а также создания простых игр, на которых можно показать и пронаблюдать модели аппаратных решений и связанные с их применением явления на уровне автоматов, описанных в книге Хоара [9]. Решение строится на основе идей и конструкций учебных языков Grow и Робик с учетом современных технологий разработки новых информационных систем.
Реальная практика
Первое знакомство с управлением процессами происходит на уровне операционной системы (ОС) и заключается в оперировании заданиями на передачу данных между устройствами и файлами [5,8,12]. Параллельное программирование на этом уровне выглядят как нечто среднее между программированием на макроассемблере и языках высокого уровня. Различие проявляется в понимании данных и команд:
- роль данных выполняют файлы, причем файлы могут быть доступны одновременно нескольким процессам;
- выполнение команды рассматривается как событие с успешным или неудачным исходом;
- реакция на событие программируется как обработчик события (реактивное программирование);
- программа процесса может быть нацелена на непрерывное обслуживание заданий;
- возможна синхронизация процессов и порождение подчиненных процессов;
- программа процесса создается как данное, которое может применяться равноправно с командами.
В результате разработка программ для организации взаимодействия процессов отличается от подготовки обычных последовательных программ на весьма глубоком уровне, что можно показать на модели интерпретирующего автомата для языка управления процессами. Обычно используется две модели - супервизор, контролирующий взаимодействие семейства процессов, или самовоспроизводящийся автомат, способный тиражировать себя при ветвлении процессов. Функционирование автомата сводится к бесконечному циклу анализа происходящих событий, появление которых влечет включение обработчиков, соответствующих событиям. Проблема остановки решается вне языка – на уровне базовых средств или внешним образом (через прерывания). Доступ к общим ресурсам регулируется с помощью очередей запросов на обслуживание на базе моно- и/или мульти-процессорных комплексов. Обслуживание носит асинхронный характер, формулируемый в терминах событий, что сближает технику программирования процессов с ООП. Основной критерий - возможность продолжить выполнение заданий без принципиальных потерь информации.
Появление информационных сервисов выплеснуло проблематику параллельных процессов на рядового пользователя. Это повышает роль такого критерия как понятность принципов сетевой обработки информации, что в значительной мере требует изучения механизмов взаимодействия процессов. Сложность перехода от навыков последовательного программирования к организации параллельных процессов в значительной мере обусловлена системой обучения, требующей все упорядочивать, выстраивать в однозначные, безальтернативные построения, без выражения зависимости принятых решений от выбора структур данных и последовательности действий по их обработке. В то же самое время (по мнению Т. Хоара) "параллельная композиция действий внешне не сложнее последовательного сочетания строк в языке программирования" [27]. Ситуацию мог бы смягчить переход к программированию на функциональных языках (Лисп, ML и т.д.), в основе которых - выделение списков с возможностью параллельной обработки элементов. Но непривычность функционального стиля мышления так и не была преодоленна за 40 с лишним лет после появления языка Лисп, хотя функциональные языки позволяют представить простые примеры для показа непривычных идей параллелизма, интуитивное понимание которых не требует напряжения [17,20].
Важная абстракция при моделировании процессов - исключение линейно-упорядоченного времени, ход которого соответствует причинно-зависимым связям событий, когда события происходят строго одно за другим. Это обеспечивается следующими договоренностями:
- элементарные действия исполняются мгновенно,
- составные действие всегда имеют пару событий - начало и конец,
- нет точной привязки действий к моменту системного времени,
- для событий определены отношения "зависимости", "одновременности", "независимости",
- зависимые события подчинены отношению "раньше-позже",
- одновременность событий понимается как отношение синхронизация,
- независимые события не имеют причинно-следственной связи и могут случится в любом порядке.
Обычно для решения конкретной задачи в терминах событий вводится специальный объект - автомат, способный реагировать на заданное множество событий в зависимости от состояния автомата. Поведение объекта, который способен действовать, описывается в виде системы правил, внешне похожих на уравнения. Решением такой системы уравнений являются процессы, которые может выполнить автомат. Такая формализация позволяет разделить описание процесса на уровень спецификации и реализации.
Реализация процесса - функция, определяющая ход процесса по начальному событию. Таким событием может быть готовность данных. Функциональная модель представления процессов позволяет легко описывать взаимодействие процессов в виде функционалов, т.е. функций над процессами, представленными как функциональные переменные. При определении взаимодействий используется понятие "протокол". Протокол - это правила для корректной последовательности событий. Важное направление анализа протоколов - проверка соответствия спецификации процесса протоколу.
Функциональный подход к параллельному программированию ценен возможностью унификации понятий, различие которых мало существенно с точки зрения их реализации. При необходимости можно одинаково работать с процессами, объектами, системами и контекстом. Все это определенные структуры данных с заданной схемой взаимодействия и разными предписанными ролями в более общем процессе информационной обработки. При необходимости взаимодействие процессов может быть пошагово синхронизовано. Взаимодействия процессов естественно могут быть заданы как взаимосвязанные функции (сопрограммы).
Языки параллельного программирования
Проблема второго языка программирования - это интеллектуальные, психологические и технологические затруднения, которые испытывает программист при необходимости перейти с привычного ему "первого" языка программирования на новый для него "второй" язык. Само существование этой проблемы объясняет, почему достаточно распространен подход к параллельному программированию через добавление средств параллелизма в популярные языки программирования, такие как Fortran, Pascal, Ada и др. [4,9]. Существуют версии ряда стандартных языков императивного программирования, приспособленные к выражению взаимодействия последовательных процессов в предположении, что в каждый момент времени существует лишь один процесс. При таком подходе в программе выделяются критические интервалы, учет которых полезен при распараллеливании программ [25]. Многие традиционные языки программирования (FORTRAN в частности) приспособлены к выражению параллелизма с помощью специальных расширений или библиотечных функций, обеспечивающих выделение участков с независимыми действиями, пригодными для распараллеливания компилятором. Популярен подход MPI, в котором специальная библиотека обеспечивает параллельную работу экземпляров одной и той же программы, написанной на традиционном последовательном языке (C или FORTRAN), при котором каждый экземпляр обрабатывает свою часть данных, а взаимодействие обеспечивается через посылку сообщений между экземплярами.
Применение параллельных архитектур повышает производительность при решении задач, явно сводимых к обработке векторов. Но автоматичекие методы распараллеливания редко способны обеспечить значительное ускорение вычислений. Более успешным может быть выражение языковыми средствами параллелизма на уровне постановки задачи. В таком случае при оптимизирующей компиляции возможен аккуратный выбор эффективной схемы параллелизма.
Независимая разработка специализированных языков параллельного программирования и языков управления процессами дала ряд интересных идей по представлению и масштабированию параллельных вычислений, с которыми можно ознакомиться в материалах о языках APL, Sisal, БАРС и др. [13,17,20]. Характерна профилактика «комбинаторного взрыва» при сборке программ из компонентов, адаптированных к полному пространству независимо программируемых решений.
Исторически первое предложение по организации языка высокого уровня для параллельных вычислений было сделано в 1962 году Айверсоном в виде языка APL [20]. Был предложен интересный механизм реализации многомерных векторов, приспособленный к расширению и распараллеливанию обработки. Сложные данные представляются как пара из последовательности скаляров и паспорта, согласно которому эта последовательность структурируется. В результате любое определение функции над скалярами автоматически распространяется на произвольные структуры данных из однотипных скаляров.
И в настоящее время для большинства специализированных языков параллельного программирования типично, что сложные построения факторизуются с учетом особенностей структуры данных так, что выделяются несложные отображающие функции, "просачиваемые" по структуре данных с помощью функций более высокого порядка - функционалов. В результате можно независимо варьировать структуры данных, функционалы (функции высших порядков), методы сборки полного результата отображения и набор отображаемых множеств. Целенаправленно выделяются конвейерные процессы, приспособленные к минимизации хранения промежуточных результатов [13,17,20].
Языки параллельного программирования занимают видное место среди функциональных языков. Довольно известен язык функционального программирования Sisal. Название языка расшифровывется как “Streams and Iterations in a Single Assignment Language”. Sisal представляет собой результат развития языка VAL, известного в середине 70-х годов. Среди целей разработки языка Sisal следует отметить наиболее характерные, связанные с функциональным стилем программирования [13]:
- создание параллельного функционального языка и внедрение функционального стиля программирования для больших научных программ,
- разработка техники оптимизации для достижение эффективности исполнения, сравнимой с последовательными императивными языками типа Fortran и C.
Отметим, что функциональные языки способствуют разработке корректных параллельных программ. Одна из причин заключается в том, что функциональные программы свободны от побочных эффектов и ошибок, зависящих от реального времени. Это существенно упрощает отладку. Функциональные программы переносимы на разные архитектуры, операционные системы или инструментальные окружения. В отличие от императивных языков, функциональные языки ближе к языкам спецификаций (Рефал и ML, например, изначально задумывались как языки спецификаций, а не языки программирования), поэтому использование функциональных языков в проектах упрощает кодирование, статический анализ информационных потоков и схем управления.
Функциональную программу, которая является безусловно параллельной, легче написать и отладить, освободившись от большинства сложностей, связанных с выражением частичных отношений порядка между отдельными операциями уровня аппаратуры. Поэтому Sisal позволяет разработчику сконцентрироваться на конструировании алгоритмов и разработке программ в терминах крупноблочных и регулярно организованных построений, опираясь на естественный параллелизм уровня постановки задачи.
Как и свойственно языкам функционального программирования, язык Sisal математически правилен - функции отображают аргументы в результаты без побочных эффектов, и программа строится как выражение, вырабатывающее значение. Форма параллельного цикла включает в себя три части: генератор пространства итераций, тело цикла и формирователь результата. Такая форма, дополненная требованием однократности присваиваний в любом блоке, хорошо приспособлена к распараллеливанию при компиляции.
Sisal-программа представляет собой набор функций, допускающих частичное применение, т.е. вычисление при неполном наборе аргументов. В таком случае по исходному определению функции строятся его проекции, зависящие от остальных аргументов, что позволяет оперативно использовать эффекты смешанных вычислений и определять специальные оптимизации программ, связанные с разнообразием используемых конструкций и реализационных вариантов параллельных вычислений.
Основные идеи языков параллельного программирования APL и VAL, предшественника языка Sisal, были развиты и обогащены в языке БАРС [17] в трех направлениях:
1) в качестве базовой структуры данных были выбраны мультимножества (размеченные множеств с кратностью элементов);
2) описание элементов памяти сопровождается предписанием дисциплины доступа к памяти,
3) средства управления асинхронными процессами включали механизм синхросетей, координирующих работу независимо созданных функциональных фрагментов.
Процедуры в таком языке приспособлены к варьированию дисциплины доступа к данным и схемы управления процессами обработки комплексов. Синхросети позволяют независимые описания процессов связывать в терминах разметки. Узлы с одинаковой разметкой срабатывают одновременно. Полное представление об асинхронных процессах, их эффективности и проблемах организации дают работы по сетям Петри.
Перспективно применение "новых" универсальных языков сверх высокого уровня (таких как Setl, Python, Cw и т.п.), абстрагирование данных и процессов в которых приспособлено к гибкому и строгому структурированию, удобному для доказательных построений [6]. В этом плане представляет интерес эксперимент по развитию теоретико-множественной семантики языка Setl, в котором весьма общее построение формул с кванторами над множествами погружено в обычную схему последовательного управления процессами. Реализация языка Setl характеризуется богатым полиморфизмом. Для представления множеств используется около двадцати разных структур данных, выбор которых осуществляется системой программирования в зависимости от динамики операций над множествами. В результате программируемые функции не могут зависеть от реализационной структуры данных.
В практике управления процессами используется понимание команд как позиций независимого порождения процессов. Такое понимание естественно согласуется с идеями теории множеств о независимости элементов множеств. Не исключено, что принятая в языке Sisal схема управления процессами может успешно заменить фортрановский стиль, принятый в языке Setl.
Учебные языки программирования
Прежде чем описать проект учебного языка параллельного программирования, рассмотрим наиболее известные учебные языки программирования с целью проявления их специфики и типовых свойств.
Возникший как удобное диалоговое средство быстрого программирования небольших расчетов язык Basic, оказался столь удобным для массового продвижения непрофессионалов в программирование, что в середине 1980-ых годов оказался серьезным кандидатом как учебный язык и рассматривался как медиум для интеграции информационных ресурсов. [10]
Разработанный специально для университетской системы обучения программированию язык Pascal в конце 1970-х неожиданно перерос в язык системного программирования. На его основе созданы образцы не только высокоэффективной компиляции программ, но и прецедент непревзойденного по качеству стиля самодокументирования систем программирования [9,15].
Универсальный язык детского программирования и самообучения Logo, стал базисом для международных проектов ЮНЕСКО по развитию и поощрению творческой информатики в разных странах в форме конструирования Logo-миров и программистских конкурсов [12].
Ряд интересных идей предложено в калифорнийском проекте Grow, вводящем школьников в мир программирования через разработку компьютерных игр. Так, например, трудное для восприятия младшими школьниками понятие условного оператора заменено понятием вероятностного действия [30].
Наиболее методически обусловлено введение программистских понятий в языке начального обучения программированию Робик. Тщательная проработка понятий в этом языке может служить базисом для любой профориентации учебного процесса по информатике, программированию и информационным технологиям. Ведущее понятие - «исполнитель», причем исполнителей может быть много и они могут обладать разными системами команд. Такое понимание допускает естественное развитие в направлении моделирования асинхронных процессов [8]. При записи программ используются варианты лингвистических форм, по разному обеспечивающие удобочитаемость в зависимости от уровня обучения , что позволяет язык оперативно приспосабливать к исходному лексикону аудитории с тем, чтобы в процессе обучения нормализовать терминологию. Учебная демонстрация взаимодействующих процессов может быть показана на примере исполнителей “Муравей” и “Машинист” языка начального обучения программированию Робик [23].
Язык учебно-производственного программирования Рапира был реализован с эргономичным интерфейсом работы с процедурами. В качестве основной структуры данных используются многоуровневые кортежи произвольной размерности. Нет чрезмерного напряжения вокруг проблемы типизации переменных. Языковые конструкции нацелены на гладкий переход к программированию на основных языках производственного программирования, характерных для конца 1970-ых годов [14]. С начала 1980-х появилось много интересных предложений в области учебных языков программирования, по уровню весьма близких языку Рапира, - A++, ECL, Elan, Karel [29,31,34,36].
Во многих странах в качестве учебных ЯП успешно используются Lisp, Scheme, ML (и его параллельный вариант CaML), Prolog в которых четко выделены и красиво описаны учебные подъязыки, приспособленные к полноценному программированию интересных задач на базе ограниченного свода средств, что делает учебную практику увлекательным занятием [18,21,28,33]. Языки REX и Forth также часто относят к учебным [37]. По видимому и F# может быть успешно применен на этом же поприще.
Обычно учебные языки программирования обеспечивают быстрое получение первых успехов. Языки XXI века как правило поддерживают все четыре основные парадигмы программирования на языках высокого уровня (ЯВУ) – императивное, функциональное, логическое и объектно-ориентированное, что позволяет учащимся программировать решения задач с разным уровнем изученности в рамках единой языковой обстановки и получать навыки работы на всех фазах полного жизненного цикла программ [16,31].
Проект учебного языка параллельного программирования
Разрабатываемый при обучении студентов ФИТ НГУ учебный язык параллельного программирования представлен как три уровня или, следуя терминологии Г.А. Звенигородского, концентра – элементарно-учебный, технологично-прагматический и вводно-ознакомительный.
Ядро языка составляют базовые средства уровня ОС – условия готовности и завершения процесса, очереди и серийная обработка, типичные для ОС UNIX и языка Java [32,35]. Такие средства рассматриваются как основа для реализации схем управления, встречающихся в ЯВУ (критические участки и семафоры, рандеву, защищенные команды, конвейеры), навыки программирования и применения которых входят в задачу элементарно-учебного уровня [4,11,27].
Мультизначения, приоритеты процессов, просачивание скалярных операций на структуры данных, выстраивание пространства итераций, фильтры данных, сетевая синхронизация действий, оптимизирующие преобразования программ и распараллеливающие трансформации процессов – все это формируется как расширения ядра языка, выполняемые с целью достижения понимания реализационной семантики параллельного программирования для современных средств, что и является задачей технологично-прагматического уровня. [13,20,26]
Задача вводно-ознакомительного концентра – дать средства тексто-графической визуализации и моделирования примеров из жизни, а также создания простых игр, на которых можно показать и пронаблюдать модели аппаратных решений и связанные с их применением явления на уровне автоматов, описанных в книге Хоара [27]. Решение строится на основе идей и конструкций языков Grow и Робик [8,14,30] с учетом современных технологий разработки новых информационных систем [16].
Заключение
Парадигмы параллельного программирования можно характеризовать сочетанием низкоуровневых средств управления процессами обработки событий (семафоры, рандеву) и высокоуровневых методов представления иерархии данных (вектора, структуры и размеченные объединения) с просачиваемыми по такой иерархии действиями в стиле объектно-ориентированного программирования, дополненным механизмами сверхвысокого уровня, допускающими или обеспечивающими формирование сложных комплексов из независимо программируемых компонент.
В последние годы созрело понимание целесообразности раннего обучения параллельному программированию [5,6]. На новосибирских Летних школах юных программистов традиционно проводятся лекции, знакомящие школьников с проблемами параллелизма. При проведении экспериментов по моделированию параллельных процессов учащимися 6-х классов не было замечено затруднений в понимании задачи [22]. Концептуальный подход к обучению программированию позволяет быстро вникнуть в существо основных понятий. Акцент на приобретение практических навыков работы на весьма различных системах обеспечивал профилактику привыкания к первому языку, системе, машине, создавал предпосылки успешного самообучения и освоения новых средств.
В работах ИСИ СО РАН им. А.П. Ершова по исследованию и классификации компьютерных языков, нацеленных на реализацию идей А.П. Ершова и С.С. Лаврова о создании лексикона программирования, заметное место занимает исследование парадигм программирования и особо – парадигм параллельного программирования, обладающих большим разнообразием вычислительных моделей и подходов к аппаратной поддержке высокопроизводительных вычислений. Для систематичной подготовки специалистов (инженеров-проектировщиков и исследователей), способных использовать возможности параллельного программирования, необходима инструментально-языковая поддержка учебной практики, опережающей навыки последовательного программирования, преодоление которых чревато значительными трудозатратами. Пусть параллельное программирование станет столь же легким и приятным как привычное для большинства императивное последовательное программирование.
Литература
1. Андреева Т.А., Ануреев И.С., Бодин Е.В., Городняя Л.В., Марчук А.Г., Мурзин Ф.А., Шилов Н.В.. Компьютерные языки как форма и средство представления, порождения и анализа научных и профессиональных знаний. //Труды XV Всероссийской научно-методической конференции "Телематика-2008", Санкт-Петербург. 2008, с. 77-78
2. Андрей Петрович Ершов - ученый и человек. /Отв. ред. А.Г.Марчук; Ин-т сист. информатики им. А.П.Ершова. Новосибирск: Изд-во СО РАН, 2006. - 504 с. (Наука Сибири в лицах)
3. Андрианов А.Н., Задыхайло И.Б., Мямлин А.Н., Поддерюгина Н.В., Поздняков Л.А. тенденции в развитии супер-ЭВМ. Внешнее окружение и языковые проблемы. // Прикладная информатика. Вып 2 (7) Сб.статей под ред. В.М. Савинкова. М.: "Финансы и статистика", 1984, с. 187-199
4. Вегнер П. Программирование на языке Ада. - М.: "Мир". 1983. 239 с.
5. Воеводин В.В., Воеводин Вл.В Параллельные вычисления. - СПб.: БХВ-Петербург, 2002
6. Городняя Л.В. "Парадигмы параллельного программирования в университетских образовательных программах и специализации" //Всероссийская научная конференция "Научный сервис в сети Интернет: решение больших задач". Новороссийск-Москва. 2008, с. 180-184
7. Городняя Л.В., Лаврентьев М.М., Марчук А.Г., Чурина Т.Г. Восстановление системы раннего отбора кадров для непрерывной подготовки специалистов по критическим технологиям // Пятая международная конференция памяти А.П. Ершова "Перспективы систем информатики". Секция "Информатика образования". Доклады и тезисы. Новосибирск, 2003. – С. 16–17.
8. Городняя Л.В., Тихонова Т.И О перспективе применения языка Робик для обучения параллельному программированию. //в сб. Программные системы. Новосибирск: Ин-т систем информатики СО РАН, 1996. С. 37-45
9. Грогоно П. Программирование на языке Паскаль. - М.: "Мир". 1982. 382 с.
10. Громов Г.Р. Национальные информационные ресурсы: проблемы промышленной эксплуатации. – М., 1984.
11. Дейкстра Э. Дисциплина программирования. - М. «Мир», 1978. - 275 с.
12. Дьяконов В.П. Язык программирования Лого. - М.: Радио и связь, 1991. - 145 с.
13. Евстигнеев В.А., Городняя Л.В., Густокашина Ю.В. "Язык функционального программирования SISAL", // Интеллектуализация и качество программного обеспечения, Новосибирск, 1994, с. 21-42
14. Звенигородский Г. А.. Основные операторы учебно-производственного языка Рапира. — Квант, 1980, № 1, с.52-55.
15. Зуев Е.А. Программирование на языке Turbo - Pascal 6.0 -7.0. М.: Веста, Радио и связь, 1993.
16. Йодан Э. Смертельный марш или трудно выполнимая миссия
17. Котов В.Е. МАРС: архитектуры и языки для реализации параллелизма. с.174-194 Системная информатика. Вып 1. Проблемы современного программирования. - Новосибирск: Наука. Сиб. отд-ние, 1991. - 293 с.
18. Лавров С.С., Городняя Л.В. Функциональное программирование. Интерпретатор языка Лисп. //Компьютерные инструменты в образовании. С-Пб. 2002, N5.
19. Левин М.П. Параллельное программирование с использованием OpenMP . - http://www.intuit.ru
20. Магариу Н.А. Язык программирования АПЛ. - М. “Радио и связь”, 96 с.
21. Малпас Дж. Реляционный язык Пролог и его применение.- М.: "Наука", 1990, 463с.
22. Марчук А.Г., Тихонова Т.И.,. Городняя Л.В. Новосибирская школа юных программистов. //Материалы международной конференции «Развитие вычислительной техники в России и странах бывшего СССР: история и перспективы». – Петрозаводск, 2006. – часть 2, с. 117-124
23. Налимов Е. В. Язык Робик и его реализация в системе «Школьница». — Проблемы школьной информатики, ВЦ СО АН СССР, Новосибирск, 1986, с. 46-51.
24. Немнюгин С.А. Основы параллельного программирования с использованием MPI. - http://www.intuit.ru
25. Пересмотренное сообщение об АЛГОЛЕ 68 / Под ред. А. П. Ершова. М.: Мир, 1979
26. Таненбаум Э., ван Стеен М. Распределенные системы. Принципы и парадигмы. - СПб.: Питер, 2003. – 877 с.
27. Хоар Ч. Взаимодействующие последовательные процессы. М.: Мир, 264 с.
28. Graham P. ANSI Common Lisp. //Prentice Hall,1996. - 432p
29. Hommel G., J¨ackel J., Jähnichen S., Kleine K., Koch W., Koster C.H.A. Akademische Verlagsgesellschaft, Wiesbaden 1979, ISBN 3-400-00384-0.
30. Levinsky J.L. The Grow Book. Computer Systems Design Group, San Diego, California, 1980
31. Loczewski G. P. A++ - The Smallest Programming Language in the World. Frankfurt, Germany, 2005, 256 p.
32. Lindholm T., YellinF. The Java Virtual Machine specification, second edition. Addison-Wesley, 1999.
33. McCarthy J. LISP 1.5 Programming Mannual.- The MIT Press., Cambridge, 1963, 106p.
34. Pattis R.E. Karel The Robot: A Gentle Introduction to the Art of Programming. John Wiley & Sons, 1981
35. Ritchie D.M., Tompson K. The UNIX Time-Sharing System, Bell System Technical Journal, v.57, N 6, 1978, pp. 1905-1929.
36. Wegbreit B. "Studies in extensible programming languages." Technical Report ESD-TR-70-297. Harvard University, Cambridge, Massachusetts, May 1970.
37. http://en.wikipedia.org/wiki/Category:Educational_programming_languages
На: О ЯЗЫКЕ НАЧАЛЬНОГО ОБУЧЕНИЯ ПАРАЛЛЕЛЬНОМУ ПРОГРАММИРОВАНИЮ
С уважением, Антонина Александровна
На: О ЯЗЫКЕ НАЧАЛЬНОГО ОБУЧЕНИЯ ПАРАЛЛЕЛЬНОМУ ПРОГРАММИРОВАНИЮ
Антонина Александровна, спасибо за внимание!
Может быть, у наших коллег есть вопросы к автору размещенных здесь материалов.
Мы попросим Лидию Васильевну ответить на них "в прямом эфире"