Основы вычислительных систем
Однако следует отметить, что проблема удобства и простоты некоторого ЯП для создания программ "с нуля" сегодня менее актуальна. Уже написаны программы для решения такого количества задач (некоторые из них по много раз на различных ЯП и в разных программных средах), что следует только в соответствии с поставленной задачей отобрать необходимые компоненты (программы), настроить их и проинтегрировать, т. е. объединить в одну систему. Такие действия адекватны технологии крупноблочного проектирования, в основе которой лежит понятие компонентной объектной среды (КОС). КОС – это современный фундамент для накопления и использования знаний. Она базируется на компонентной объектной модели и включает готовые компоненты и инструментальное окружение, позволяющее выбирать необходимые компоненты, настраивать их и связывать между собой, создавая необходимое приложение.
КОС обладает всеми свойствами, присущими объектно-ориентированному подходу:
· инкапсуляция объектных компонент скрывает от пользователя сложности их реализации, делая видимым лишь предоставляемый интерфейс;
· наследование позволяет совершенствовать компоненты, не нарушая целостности объектной оболочки;
· полиморфизм, по сути, позволяет группировать объекты, характеристики которых в некотором плане можно считать сходными.
Что касается языков параллельного программирования, то к ним могут быть предъявлены дополнительные требования. В частности, ЯПП должен:
· иметь средства максимального выражения в программе присущего данной задаче естественного параллелизма;
· быть независимым от структуры конкретного компьютера, в частности от числа процессоров, доступных для программ, от времени выполнения отдельных ветвей программы и т. д.;
· обладать простотой диспетчеризации параллельных программ, записанных на нем;
· обеспечить простоту записи (преобразования) программ на ЯПП по заданным последовательным алгоритмам.
При расширении последовательных ЯП обычно используются операторы for-join, parbegin-parend, cobegin-coend – аналог операторных скобок в обычных ЯП, окаймляющих фрагменты параллельного выполнения.
Типичным примером расширения возможностей последовательных ЯП служит дополнение языков АЛГОЛ-60 и ФОРТРАН операторами типа fork < список меток > и join < список меток >. Оператор fork открывает участок параллельности в заданной программе, а оператор join закрывает его. После выполнения каждой ветви с заданной в операторе fork меткой управление передается оператору join. Последний не передает управление на продолжение программы до тех пор, пока управление от всех сегментов, метки которых указаны в операторе join, ему не переданы.
Чтобы ЯП АЛГОЛ-60 обладал необходимыми свойствами языка параллельного программирования, его можно дополнить (кроме fork и join) операторами типа:
terminate < список меток > – оператор блокировки фрагментов программы (если он предшествует оператору join, то блокируется выполнение фрагментов программы с общими у обоих операторов метками);
obtain < список переменных >, который блокирует использование переменных, участвующих в вычислительном процессе;
release < список переменных >, снимающего блокировку с указанных в нем переменных.
Если, например, нам в программе встретилась запись
k) join S1, S2, S7
k + 1) for i = 1 step 1 until N do,
то управление от оператора k будет передано оператору k + 1 только в том случае, если выполнятся фрагменты с метками S1, S2, S7. Если, например, необходимо одновременно выполнить целый массив параллельных ветвей, то в параллельном ЯП следует организовать некоторый специальный цикл. Синтаксически он напоминает обычный цикл в ЯП.
Если, например, в последовательном ЯП определен цикл
for i = L step 1 until N do R(i),
который задает последовательное выполнение вычислений
R(L), R(L + 1), ... , R(N),
то их одновременная обработка требует конфигурации
for i = L step 1 until N do par R(i),
задающей параллельное выполнение этих же вычислений. В связи с тем что понятие параллельного выполнения может быть трактовано по-разному, можно принять в общем случае следующее описание параллельного цикла:
for i = < индексное множество > do < тип параллельности >,
где < индексное множество > задает цикл типа арифметической прогрессии, перечисления, логического выражения и т. д., а < тип параллельности > определяет семантику оператора, например ориентацию на асинхронные ВС с общей памятью, с разделенной памятью, ВС с единым потоком команд ОКМД, возможность синхронизации ветвей с обменом или без обмена информации т. д.
Непосредственное дизассемблирование защищенных таким способом программ, как правило, не дает нужных результатов. В последнее время в связи с широким распространением локальных и глобальных компьютерных сетей необычайно остро встала проблема защиты информации при передаче или хранении в сети.