Сейчас растут потребности в программах, использующих преимущества современных многоядерных и параллельных систем. Университет Иллинойса (США) выступил с инициативой разработки версии языка Java с поддержкой параллельных вычислений, после чего был запущен проект с целью реализации детерминистского параллельного языка Java (Deterministic Parallel Java, DPJ), который финансируют Национальный научный фонд США, Intel и Microsoft.
В пресс-релизе, посвященном новой технологии, представитель Исследовательского центра по универсальным технологиям параллельных компьютерных вычислений (Universal Parallel Computing Research Center, UPCRC) при университете Чери Хелреджел пишет, что новый параллельный язык первым гарантировал детерминистскую семантику для объектно-ориентированных программ общего назначения без проверки во время исполнения. Кроме того, это первый язык, использующий проверку во время компиляции типов для параллельных операций на массивах ссылок (указателей) на объекты, и первый, в котором применяются регионы и эффекты для гибких вложенных структур данных.
Профессор Иллинойского университета Викрам Адве и студент Роберт Боччино решили “упростить параллелизм” и создали группу, сосредоточившую внимание на потребностях разработчиков. Они стремились создать язык, поддерживающий различные стили программирования, которые лучше всего знакомы разработчикам и которые те считают наиболее продуктивными, например основные объектно-ориентированные языки.
На сайте UPCRC, посвященном детерминистскому параллельному языку Java, говорится следующее: “Общая цель нашего проекта состоит в том, чтобы обеспечить детерминистские по умолчанию семантики для объектно-ориентированного императивного параллельного языка, используя главным образом проверку во время компилирования. “Детерминистский” означает, что при одних и тех же данных на входе программа при любом запуске порождает один и тот же зримый результат на выходе. “По умолчанию” означает, что гарантируется детерминистское поведение, пока программист эксплицитно не потребует недетерминистского. В этом состоит отличие от нынешних моделей программирования с использованием общей памяти (например, нитей и блокировок), которые являются недетерминистскими по своей природе и в которых может возникать даже скрытая конкуренция по поводу данных”.
Итоговая реализация DPJ представляет собой надежный параллельный язык, помогающий разработчикам портировать части последовательно написанных Java-приложений для исполнения на многоядерных системах. Кроме того, он помогает разработчикам переписывать части параллельных Java-приложений для упрощения отладки кода, тестирования и долговременного обслуживания. Портированный на DPJ параллельный код может сосуществовать с обычным кодом Java в рамках одного приложения. Поэтому программы можно портировать на DPJ по частям, заявил UPCRC.
Более того, DPJ упрощает отладку и тестирование параллельного ПО, поскольку любая возможная конкуренция по поводу данных исключается на этапе компилирования, говорится в пресс-релизе UPCRC. Так как программы на DPJ обладают очевидной последовательной семантикой, отладка и тестирование кода DPJ может целиком производиться, в сущности, так же, как отладка последовательно написанных программ. Обслуживание упрощается, поскольку DPJ записывает в виде аннотаций знания программиста в области структур параллельного доступа к данным. В результате проще становятся понимание, модификация и расширение параллельно написанных DPJ-программ.
А поскольку DPJ содержит такие же аннотации к программам, любую функцию или класс можно понять и превратить в параллельный модуль, не зная подробностей внутреннего параллелизма или синхронизации других функций либо классов. Исследователи из университета Иллинойса считают это особенно важным, так как модульность играет решающую роль для создания крупномасштабных приложений. Однако, по их словам, при использовании современных популярных моделей программирования с общей памятью модульность приносится в жертву.
Адве и его группа работают совместно с Intel над определением сходного набора расширений языка C++ (DPC++), которые можно было бы использовать для проверки аналогичных качеств моделей программирования, таких как Cilk, OpenMP и Threading Building Blocks (TBB).
UPCRC, со своей стороны, различает конкурентное и параллельное программирование. На посвященной программированию странице веб-сайта UPCRC говорится:
“Мы проводим различие между конкурентным программированием, сосредоточенным на проблемах, для которых конкурентность является частью спецификации (реактивный программный код, как в операционной системе, пользовательских интерфейсах, онлайновой обработке транзакций и т. д.), и параллельным программированием, которое ориентировано на те случаи, когда конкурентное исполнение используется только для повышения производительности преобразующего кода. Широкое распространение многоядерных платформ не увеличивает потребности в конкурентном программировании и не усложняет его. Оно предъявляет повышенный спрос на параллельное программирование. Мы утверждаем, что по сравнению с конкурентным параллельное программирование гораздо проще, в частности, оно редко требует использования недетерминистского кода”.