1
Конспекты лекций по курсу
«Введение в информатику и системы программирования», 1 семестр
С.А. Немнюгин, направление «Прикладные математика и физика»)
Лекция 15
Модели программирования
Идея Флинна
SISD-архитектура
Алгоритм можно представить в виде диаграммы информационного графа. Информационный граф описывает последовательность выполнения операций и взаимную зависимость между различными операциями или блоками операций.
Узлами информационного графа являются операции, а однонаправленными дугами каналы обмена данными.
Понятие операции может трактоваться расширенно. Это может быть оператор языка, но может быть и более крупный блок программы.
2
Последовательный алгоритм
Параллельный алгоритм
3
Модели программирования
Совокупность приемов программирования, структур данных, отвечающих архитектуре гипотетического компьютера, предназначенного для выполнения определенного класса алгоритмов, называется моделью программирования
Традиционной считается последовательная модель программирования.
В этом случае в любой момент времени выполняется только одна операция и только над одним элементом данных. Последовательная модель универсальна. Ее основными чертами являются применение стандартных языков программирования (для решения вычислительных задач это, обычно, Fortran и С/С++), хорошая переносимость программ и невысокая производительность.
Основными особенностями модели параллельного программирования являются более высокая производительность программ, применение специальных приемов программирования и, как следствие, более высокая трудоемкость программирования, проблемы с переносимостью программ. Параллельная модель не обладает свойством универсальности.
В параллельной модели программирования появляются проблемы, непривычные для программиста, привыкшего заниматься последовательным программированием. Среди них: управление работой множества процессоров, организация межпроцессорных пересылок данных и другие.
Последовательную модель программирования характеризуют:
невысокая производительность;
применение стандартных языков программирования;
хорошая переносимость.
Параллельную модель программирования характеризуют:
возможность добиться более высокой производительности;
применение специальных приемов и инструментов программирования;
повышенная трудоемкость программирования;
проблемы с переносимостью программ.
Требования к параллельным программам:
достаточная степень параллелизма;
хорошая масштабируемость;
детерминизм;
эффективность.
Повышенная трудоёмкость параллельного программирования связана с тем, что программист должен заботиться:
об управлении работой множества процессов;
об организации межпроцессных пересылок данных;
о вероятности тупиковых ситуаций (взаимных блокировках);
о нелокальном и динамическом характере ошибок;
о возможной утрате детерминизма («гонки за данными»);
о масштабируемости;
о сбалансированной загрузке вычислительных узлов.
4
Параллельная модель программирования
Две парадигмы параллельного программирования
1.параллелизм данных;
2.параллелизм задач.
Параллелизм данных
Параллелизм данных характеризуется тем, что:
одна операция применяется сразу к нескольким элементам массива данных. Различные фрагменты такого массива обрабатываются на векторном процессоре или на разных процессорах параллельной машины;
обработкой данных управляет одна программа;
пространство имен является глобальным;
параллельные операции над элементами массива выполняются одновременно на всех доступных данной программе процессорах.
От программиста требуется:
задание опций векторной или параллельной оптимизации транслятору;
задание директив параллельной компиляции;
использование специализированных языков параллельных вычислений, а также библиотек подпрограмм, специально разработанных с учетом конкретной архитектуры компьютера и оптимизированных для этой архитектуры.
Параллелизм задач
Параллелизм данных характеризуется тем, что:
вычислительная задача разбивается на несколько относительно самостоятельных подзадач. Каждая подзадача выполняется на своем процессоре (ориентация на архитектуру MIMD);
для каждой подзадачи пишется своя собственная программа на обычном языке программирования (чаще всего это Fortran или С);
подзадачи должны обмениваться результатами своей работы, получать исходные данные. Практически такой обмен осуществляется вызовом процедур специализированной библиотеки. Программист при этом может контролировать распределение данных между различными процессорами и различными подзадачами, а также обмен данными.
Достоинства подхода:
большая гибкость и большая свобода, предоставляемая программисту в разработке программы, эффективно использующей ресурсы параллельного компьютера;
возможность достижения максимального быстродействия.
Языки программирования
Уровни абстракции при описании алгоритма:
высокий;
низкий.
Язык программирования - формальная знаковая система, предназначенная для описания алгоритмов в форме, которая удобна для исполнителя.
Язык программирования определяет набор лексических, синтаксических и семантических правил, используемых при составлении компьютерной программы.
Лексика определяет совокупность слов того или иного языка и их значения.
5
Синтаксис - сторона языка программирования, которая описывает структуру программ как наборов символов.
Каждый язык программирования имеет синтаксическое описание (нотация Бэкуса-Наура).
Семантика - система правил определения поведения отдельных языковых конструкций. Семантика определяет смысловое значение предложений алгоритмического языка.
Семантика языка программирования - совокупность правил, определяющих смысл чисел, переменных, выражений, операторов, процедур и других элементов и предложений данного языка программирования
Язык программирования высокого уровня ориентирован на запись алгоритмов,
сформулированных на высоком уровне абстракции, и использует смысловых конструкции, кратко описывающие такие структуры данных и операции над ними, описания которых на языке машинных команд очень длинны и сложны для понимания.
Программы, написанные на языках высокого уровня, проще для понимания программистом, но менее эффективны, чем их аналоги, создаваемые при помощи низкоуровневых языков. Одним из следствий этого стало добавление поддержки того или иного языка низкого уровня (язык ассемблера) в ряд современных профессиональных высокоуровневых языков программирования.
Наиболее распространёнными языками подобного типа являются C++, Visual Basic, Java, Python, Ruby, Perl, Delphi (Pascal), PHP.
Первым языком программирования высокого уровня считается компьютерный язык Plankalkul разработанный немецким инженером Конрадом Цузе ещё в период 1942-1946 гг. Широкое применение высокоуровневых языков началось с возникновением Фортрана и созданием компилятора для этого языка (1957).
Язык программирования низкого уровня - язык программирования, близкий к программированию непосредственно в машинных кодах.
Использует особенности конкретного семейства процессоров. Пример низкоуровнего языка - язык ассемблера. Также к языкам низкого уровня можно причислить MSIL (Microsoft Intermediate Language ), применяемый в платформе Microsoft .NET.
Семантический разрыв между языком машинных команд и языками высокого уровня увеличивается.
Основные понятия и принципы процедурных языков программирования
Процедурное программирование - это парадигма программирования, основанная на концепции вызова процедуры. Процедуры, также известны как подпрограммы, методы или функции
Алфавит языка - набор символов, которые можно использовать в программе.
Из символов алфавита составляются лексемы, играющие роль слов минимальных смысловых элементов языка.
В число лексем входят специальные слова, имена различных объектов программы (например, имена переменных).
6
Специальные слова имеют специальное назначение. Из них составляются, например, операторы, которые описывают некоторое законченное действие.
Специальные слова бывают двух видов. Существуют зарезервированные слова, имеющие вполне определенный смысл и определенное назначение.
Назначение зарезервированных слов определяется спецификацией или стандартом языка. Зарезервированные слова нельзя изменять: любая неточность в их написании является серьезной ошибкой.
Назначение ключевых слов зависит от контекста, то есть от места в программе, где эти слова используются.
ВPascal есть зарезервированные слова, а ключевыми словами, например, являются имена типов переменных.
ВФортране все специальные слова являются ключевыми.
Главными элементами любой программы являются переменные, константы и операторы.
Переменная — это одна или несколько физических ячеек оперативной памяти компьютера. Такой набор физических ячеек называют абстрактной ячейкой памяти.
Переменной сопоставляется набор атрибутов.
Одним из основных атрибутов является имя переменной.
В правилах назначения имен переменным следует обратить внимание на то, какие символы можно использовать в именах, какова максимальная длина имени, различается ли регистр букв.
Второй характеристикой переменной является ее значение («правое» значение переменной, r- value).
Содержимое ячейки памяти, связанной с переменной, может изменяться в ходе выполнения программы, поэтому переменная и называется переменной.
Вид информации, содержащейся в ячейке, набор преобразований, которые можно выполнять над этой информацией, и множество допустимых значений определяются типом переменной.
Одной важнейшей характеристикой переменной является ее адрес («левое» значение, l-value).
В линейной модели памяти это порядковый номер первой физической ячейки памяти, входящей в состав абстрактной ячейки памяти для переменной. В линейной модели памяти считается, что ячейки памяти расположены в линию. Последовательно расположенные ячейки группируются в сегменты размером 64 Кбайт каждый.
Область видимости множество операторов программы, в которых данную переменную можно использовать.
Глобальные переменные «видны» во всей программе, а локальные — только в отдельных ее компонентах.
В параллельном программировании область видимости получает дополнительное измерение – видимость переменной из разных потоков (тредов).
Константа отличается от переменной тем, что ее значение фиксировано и не может быть изменено в ходе выполнения программы.
7
Константы бывают двух видов:
1.буквальные;
2.именованные.
Буквальные константы представляют собой значения, которые воспринимаются в программе в точности так, как они изображены (буквально). Значения могут быть числовыми, символьными или другими.
Примеры буквальных констант:
2008 целое число;
1.9274 вещественное число в формате с фиксированной точкой;
1.2e-3 вещественное число в формате с плавающей точкой;
'A' символьная константа;
‘PMF forever!' строковая константа.
На именованные константы ссылаются, указывая их имя.
Имя назначается обычно по тем же правилам, что и имена переменных. Пример встроенной именованной константы в Turbo Pascal Pi.
Операторы задают действия, которые должна выполнять программа.
Существуют операторы, которые позволяют описать свойства переменных и других объектов, используемых в программе. Они называются предложениями описания или декларативными операторами.
Операторы, управляющие ходом выполнения программы называются управляющими операторами.
Управляющие операторы реализуют основные алгоритмические конструкции, такие как ветвления (условные операторы и операторы выбора) и циклы. Имеются операторы ввода и вывода информации и другие
Программой могут называть разные вещи. Это может быть исходный текст программы — обычный текстовый файл, содержащий запись операторов программы на языке программирования.
Исходный текст компилируется (транслируется), то есть переводится на язык машинных команд, понятный компьютеру. В этом случае создается исполняемый файл.
Программа представляет собой последовательность операторов и других элементов языка, построенную в соответствии с определенными правилами и предназначенную для решения определенной задачи.
Правила, определяющие, какие последовательности символов можно использовать в программе, называются синтаксисом языка программирования. Нарушение этих правил приводит к синтаксическим ошибкам. Эти ошибки выявляются на этапе трансляции программы.
Языки низкого уровня используются для очень подробного и детального описания операций, настолько детального, что при этом учитывается архитектура компьютера, устройство его центрального процессора (прежде всего, набор его регистров). Такие языки называются машинными кодами и ассемблерами. Ассемблер дает несколько более удобный способ записи программ в машинных кодах.
8
Программа на ассемблере получается длинной, -> увеличивается вероятность появления ошибок. Для составления такой программы требуется знание архитектуры компьютера, это увеличивает трудоемкость программирования. Программа оказывается привязанной к конкретной архитектуре.
Это недостатки программирования на языках низкого уровня. Преимуществом является возможность «выжать» из компьютера все что можно, и прежде всего — максимум быстродействия.
Языки программирования высокого уровня были созданы для того, чтобы преодолеть недостатки низкоуровневого программирования. Они позволяют использовать различные операции, не заботясь о деталях их реализации на конкретной архитектуре. Программы при этом оказываются более короткими, надежными и универсальными, а процесс их составления сокращается. Программы на языках высокого уровня легче читать, в них проще разобраться.
Языки высокого уровня бывают:
1.императивные (процедурные);
2.функциональные;
3.логические;
4.объектно-ориентированные.
Научные приложения
Первые цифровые компьютеры использовались в основном для научных целей. Краткая характеристика научных приложений:
имеют дело с простыми структурами данных и значительным количеством арифметических вычислений, выполняемых над числами с плавающей точкой;
наиболее часто употребляемыми структурами данных являются массивы и матрицы;
из управляющих структур чаще других используются циклы со счетчиком и условные операторы.
Для языков программирования высокого уровня, созданные для применения в научных исследованиях, главное - эффективность.
9
Искусственный интеллект
Искусственный интеллект - обширная область применения компьютеров, отличающаяся использованием символьных, а не числовых вычислений. Под символьными вычислениями подразумевается манипулирование не с числами, а с символами. Кроме того, символьные вычисления удобнее производить с использованием связных списков данных, а не массивов. Символьные вычисления иногда требуют большей гибкости, чем другие области программирования. Например, в некоторых приложениях искусственного интеллекта очень удобно иметь возможность создавать и реализовывать фрагменты программы в процессе ее выполнения.
Первым широко используемым языком программирования, созданным для применения в области искусственного интеллекта, был язык функционального программирования LISP, появившийся в 1959 году. Большинство программ в этой области были написаны именно на языке LISP или на одном из родственных языков. В начале 1970-х годов возник альтернативный подход к решению этих задач - язык логического программирования Prolog.
Системное программирование
Операционные системы и все инструменты программной поддержки компьютерных систем называются системным программным обеспечением. Оно используется практически повсеместно и, следовательно, должно эффективно функционировать. В связи с этим языки программирования, применяемые в этой области, должны:
обеспечивать быстрое выполнение программ;
должны иметь низкоуровневые свойства, позволяющие писать программы, осуществляющие взаимодействие с внешними устройствами.
Языки подготовки сценариев
Программы на этих языках представляют собой исполняемые файлы, называемые сценариями, которые содержат перечень команд. Первым из таких языков был язык sh (shell - оболочка), первоначально состоявший из небольшого набора команд, интерпретируемых как вызовы системных подпрограмм, выполнявших служебные функции, например, управление файлами и их простую фильтрацию. Затем к этой основе были добавлены переменные, операторы потока управления, функции и многие другие возможности, и в результате получился завершенный язык программирования.
Язык подготовки сценариев, awk вначале предназначался для генерации отчетов, но позже стал универсальным.
Расширяемый язык подготовки сценариев tcl был разработан в университете штата Калифорния в Беркли Джоном Остераутом. Сейчас язык tcl объединен с языком tk, позволяющим создавать приложения в системе X Window.
Язык Perl сначала представлял собой комбинацию языков sh и awk. После этого он получил значительное развитие и сейчас является мощным, хотя и несколько примитивным, языком программирования. Этот язык часто продолжают называть языком подготовки сценариев, но он сейчас уже - вполне завершенный язык программирования. С появлением World Wide Web популярность языка Perl резко возросла.
Специализированные языки программирования
В их число входит язык RPG, используемый для генерации деловых отчетов, язык APT, созданный для управления программируемыми устройствами, язык GPSS, разработанный для моделирования систем.
С языками программирования иногда путают такие языки разметки, как HTML и Postscript. Однако эти языки не описывают вычислений - они всего лишь задают общий вид документа.
« » ( . . , « »)
1..
2.. –
.
3.. Ethernet.
4., . OSI.
TCP/IP. (FTP, HTTP, SMTP, TELNET, SSH).
5.! . IP . " .#$ . . URL.
6.%. % $ .
. % & . %- .
%. '
' ( , $ $ #
, , $ , , #
, , #).
7.( %. )- . ! $ . *. % - & .
8.! +. , , - , &.
9., ( - ,
, ).
10. - - $ . 11. . : ( , &- ,
/ ), & . $ &-
.
12. . . . - & .
13.. ( 0. SISD, SIMD, MISD MIMD
.
14.+ . * &
. , , RISC, CISC VLIW, . .
15.1 . . ( Hyperthreading.
Intel, Sun, IBM (Cell), AMD. ( Intel Dual Core.
16., .
, & . !
$ $ # . 2 $ .
17.& . , $
. " . "
.
18.& / . IEEE 754/854. 0 , & . +
/ . . $ . & &
. . $ .
19.# & . #
& . $ &- .
. * /.
20.0 . (ASCII, Win 1251, KOI-8, Unicode).
21.+ (.). ( ., . ($ , 3 .. %
- . * . –
, $/ .
22.. - ,
$ , $ .
23.. - ,
( , ), $ . ( ).
24. . .. 0. 0 . 0 FAT, NTFS.
25.0 . UNIX. . $ . * . 0
s5fs, ffs, ext2fs, ext3fs. 2 &.
26.MS Windows. , , . !$
, # . .
.
27.UNIX. . !$ ,
# . . .
28.*$ . .
.
29.!. . , , $ .
( , 2, & ,
).
. .
30.: , . % . .
31.' . . .
.
32.$ . ,
, . .. .
1.+ .!., TURBO PASCAL.
(- $ ). 2- , " ", - $ , 2003.
2.4 ., & 1., 1 ., . 5. " Computer Science". " +BHV", - $ , 2003.
3.$ *$ -. . . .: , 2001.
4., «2$ ».
« », . www.phys.spbu.ru
5.. http://www.cph.phys.spbu.ru/documents/First/books/pravovye_aspekty_PO.pdf
Список литературы и ссылок на Интернет-ресурсы по курсу
«Введение в информатику и системы программирования», 1 семестр
С.А. Немнюгин, направление «Прикладные математика и физика»)
1.Немнюгин С.А., TURBO PASCAL. Программирование на языке высокого уровня
(Учебник). 2-е издание, "Питер", Санкт-Петербург, 2003.
2.Немнюгин С.А., TURBO PASCAL. Практикум. 2-е издание, "Питер", СанктПетербург, 2003.
3.Немнюгин С., Чаунин М., Комолкин А., Эффективная работа:UNIX. "Питер", Санкт-Петербург, 2001.
4.Немнюгин С., Стесик О., Параллельное программирование для многопроцессорных вычислительных систем. "БХВ", Санкт-Петербург, 2002.
5.Хамахер К., Вранешич З., Заки С., Организация ЭВМ. Серия "Классика
Computer Science". "Питер+BHV", Санкт-Петербург, 2003.
6.Олифер В., Олифер Н., Компьютерные сети. Принципы, технологии, протоколы: Учебник для вузов. 3-е изд. "Питер", 2007.
7.«Интернет-университет информационных технологий» http://www.intuit.ru
8.Википедия, http://ru.wikipedia.org
