Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Современный Fortran на практике

Покупка
Артикул: 644417.02.99
К покупке доступен более свежий выпуск Перейти
Язык программирования Fortran изначально был предназначен для математических вычислений с максимальной производительностью. В последний стандарт Fortran 2008 включено множество современных функциональных возможностей: средства объектно-ориентированного программирования, специализированные операции с массивами, типы, определяемые пользователем и поддержка параллельных вычислений. Данное учебное руководство поможет программистам на языке Fortran научиться применять все вышеперечисленные функциональные возможности в соответствии с современными требованиями: модульность, лаконичность, объектно-ориентированный подход и рациональное использование ресурсов, а также организация работы с учётом наличия нескольких процессоров. В книге рассматриваются практические примеры взаимодействия с программами, написанными на языке С, управления памятью, применения графики и графических пользовательских интерфейсов, параллельные вычисления с использованием библиотек MPI, ОрепМР и комассивов (coarrays). Кроме того, автор анализирует некоторые числовые алгоритмы и их реализации, а также показывает, как можно применить некоторые библиотеки с открытыми исходными кодами.
Арьен, М. Маркус, А. Современный Fortran на практике / Арьен Маркус ; пер. с англ. А.В. Снастина. - Москва : ДМК Пресс, 2015. - 308 с. - ISBN 978-5-97060-302-4. - Текст : электронный. - URL: https://znanium.com/catalog/product/1027794 (дата обращения: 19.04.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
Арьен Маркус

Современный  

Fortran  

на практике

Modern Fortran 
in Practice

Arjen MArkus 
with Foreword by MichAel MetcAlF

Москва, 2015

Арьен МАркус 
с предисловиеМ МАйклА МеткАлфА

Современный Fortran  
на практике

УДК     004.438Fortran
ББК      32.973.22
M27

V27     Арьен Маркус
Современный Fortran на практике / пер. с англ. Снастин А. В. – 
М.: ДМК Пресс, 2015. – 308 с.: ил.

             ISBN 978-5-97060-302-4

Язык программирования Fortran изначально был предназначен для 
математических вычислений с максимальной производительностью. 
В последний стандарт Fortran 2008 включено множество современных 
функциональных возможностей: средства объектно-ориентированного 
программирования, специализированные операции с массивами, типы, 
определяемые пользователем и поддержка параллельных вычислений.
Данное учебное руководство поможет программистам на языке 
Fortran научиться применять все вышеперечисленные функциональные возможности в соответствии с современными требованиями: 
модульность, лаконичность, объектно-ориентированный подход и 
рациональное использование ресурсов, а также организация работы 
с учётом наличия нескольких процессоров. В книге рассматриваются 
практические примеры взаимодействия с программами, написанными 
на языке C, управления памятью, применения графики и графических 
пользовательских интерфейсов, параллельные вычисления с использованием библиотек MPI, OpenMP и комассивов (coarrays). Кроме того, 
автор анализирует некоторые числовые алгоритмы и их реализации, а 
также показывает, как можно применить некоторые библиотеки с открытыми исходными кодами.

Original English language edition published by Cambridge University Press, 32 
Avenue of the Americas, New York, NY 10013-2473, USA. © Arjen Markus 2012. 
Russian-language edition copyright © 2015 by DMK Press. All rights reserved.

Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без 
письменного разрешения владельцев авторских прав.
Материал, изложенный в данной книге, многократно проверен. Но, поскольку вероятность технических ошибок все равно существует, издательство 
не может гарантировать абсолютную точность и правильность приводимых 
сведений. В связи с этим издательство не несет ответственности за возможные 
ошибки, связанные с использованием книги.

ISBN 978-1-107-01790-0 (англ.)                     © Arjen Markus, 2012 
ISBN 978-5-97060-302-4 (рус.)                       © Оформление, перевод на русский язык 

      ДМК Пресс, 2015

 «Eadem mutata resurgo»

(вольный перевод: «изменяясь, я вновь воскресаю»)
Надпись на могиле Якоба Бернулли, 
изначально относящаяся к логарифмической спирали

Посвящается памяти моего отца.

Мои родители научили меня любознательности.
Моя жена и мои дети всё время учат меня другим 
важным вещам.

оглавление

Предисловие Майкла Меткалфа.......................... 11

Предисловие автора ......................................... 15

Глава 1. Введение в современный Fortran ............. 17
1.1. особенности современного Fortran .................................. 17
1.2. Fortran 90 .......................................................................... 21
1.3. Fortran 95 .......................................................................... 25
1.4. Fortran 2003 ...................................................................... 26
1.5. Fortran 2008 ...................................................................... 28
1.6. Что осталось неизменным ................................................. 29

Глава 2. Функции для работы с массивами ............ 32
2.1. передача массивов в аргументах ...................................... 33
производительность при использовании функций обработки 
массивов ........................................................................................35
2.2. Элементные функции и автоматическое  
перераспределение памяти .................................................... 36

2.3. два более сложных примера ............................................. 38
дистанционирование иррациональных чисел .................................38
Быстрая сортировка Quicksort ........................................................40
2.4. компактный стиль ............................................................. 41

Глава 3. Математические абстракции .................. 44
3.1. Автоматическое дифференцирование .............................. 44
проблемы при вычислениях ...........................................................49
3.2. дискретное программирование ........................................ 50
управление памятью ......................................................................51
3.3. перечислимое множество решений диофантовых 
уравнений ............................................................................... 53

3.4. отложенные или ленивые вычисления .............................. 56

Оглавление

Глава 4. Управление памятью ............................. 60
4.1. динамически изменяемые массивы .................................. 60

4.2. утечки памяти при использовании указателей .................. 61
4.3. увеличение размера массива ........................................... 62
4.4. строки символов с изменяемой длиной ............................ 63
4.5. сочетание автоматических и динамических массивов ...... 66
4.6. производительность массивов разных типов .................... 67
4.7. параметризованные производные типы ........................... 69

4.8. Утечки памяти в производных типах ................................ 71
4.9. производительность и доступ к памяти ............................. 76

Глава 5. Проблема интерфейса ........................... 80
5.1. подстановка параметров .................................................. 82
5.2. использование пула данных .............................................. 84
данные в модулях ...........................................................................85
внутренние подпрограммы ............................................................88
5.3. передача дополнительных аргументов ............................. 89
Массив параметров ........................................................................89
использование функции transfer() ..................................................90
процедуры, связанные с типом ......................................................91
указатели на процедуры .................................................................93
5.4. управляющие конструкции ............................................... 95
Библиотека openMP .....................................................................100
5.5. работа с числовыми значениями различной точности ..... 102
5.6. резюме ........................................................................... 103

Глава 6. Взаимодействие с программами  
на языке C на примере работы с СУБД SQLite ...... 105
6.1. соответствие типов данных ............................................ 106
6.2. передача аргументов между подпрограммами, 
написанными на c и на Fortran ............................................... 109
6.3. соглашения об именовании и вызовах функций .............. 110
6.4. работа с производными типами ...................................... 113
6.5. создание интерфейса к суБд sQlite .............................. 116

Глава 7. Графика, GUI и Интернет ...................... 124
7.1. вывод результатов в графическом виде .......................... 125
7.2. Графические пользовательские интерфейсы (Gui) ......... 131

Оглавление

7.3. интернет ......................................................................... 139
7.4. работа с XMl-файлами ................................................... 143

Глава 8. Модульное тестирование ..................... 148
8.1. инструментальные средства тестирования ..................... 148
8.2. пример: обработка трёхдиагональной матрицы .............. 149
8.3. проектирование и реализация ........................................ 153
8.4. Заключительные замечания ............................................ 155

Глава 9. Просмотр и рецензирование исходного  
кода ............................................................. 157
9.1. соблюдать определённость и однозначность ................. 158
используйте явные объявления переменных и констант ...............158
используйте предусловия ............................................................160
переменные, сохраняющие свои значения между вызовами ........161
видимость интерфейса к подпрограмме или функции ..................161
доступность переменных и подпрограмм .....................................161
вариант default в блоке select и ветвь else в блоке if ......................162
информативные сообщения об ошибках ......................................162
9.2. избегать излишней сложности и запутанности ............... 164
9.3. избегать «ловушек» ........................................................ 169
правильная обработка ошибок .....................................................169
сравнение вещественных чисел ...................................................169
смешанная точность ....................................................................171
неожиданные результаты при работе с отрицательными  
числами ........................................................................................171
Автоматические массивы .............................................................172
ошибки могут возникать не только при работе с числами .............173
9.4. писать простой и понятный код ...................................... 173

Глава 10. Устойчивая к ошибкам реализация 
нескольких простых алгоритмов ....................... 178
10.1. обзор существующих подобных методик ...................... 179
10.2. линейная интерполяция ................................................ 181
10.3. простые статистические методы и характеристики ....... 187
10.4. поиск корней уравнения ............................................... 195

Глава 11. Объектно-ориентированное 
программирование ......................................... 209
11.1. расширение типов и процедуры, связанные с типами ... 209
передача объекта в другом аргументе ..........................................211

Оглавление

расширение до трёх измерений ...................................................212
пример: случайные перемещения в двух и в трёх измерениях ......215
определение динамического типа ................................................217
наблюдение за частицами ............................................................217
11.2. интерфейсы как контракты ........................................... 221
Аппроксимация множественного наследования ...........................225
11.3. использование прототипирования ................................ 226
пример: моделирование поведения рыб ......................................229
11.4. Абстрактные типы данных и обобщённое 
программирование ............................................................... 232

11.5. изменение поведения типа данных ............................... 235
11.6. Шаблоны проектирования ............................................. 237
Шаблон проектирования Factory...................................................238
Шаблон проектирования наблюдатель .........................................241

Глава 12. Параллельное программирование ....... 245
12.1. простые числа .............................................................. 246
Библиотека openMP .....................................................................248
интерфейс MPi .............................................................................251
комассивы ...................................................................................255
12.2. декомпозиция по доменам ........................................... 259
openMP ........................................................................................261
MPi ...............................................................................................265
комассивы ...................................................................................266
12.3. другие методики параллельного программирования .... 268
12.4. резюме ......................................................................... 270

Приложение А. Инструментальные средства для 
разработки и сопровождения ........................... 271
А.1. компиляторы .................................................................. 271
А.2. средства сборки программ ............................................ 272
А.3. интегрированные среды разработки .............................. 275
А.4. средства проверки во время выполнения ....................... 276
А.5. системы управления версиями ...................................... 278
А.6. документирование исходного кода ................................. 279
А.7. охват кода тестированием и статический анализ ............ 281

Приложение Б. Некоторые нюансы  
использования Fortran ..................................... 285

Оглавление

Б.1. особенности стандарта .................................................. 285
вычисление логических выражений по короткой схеме ................285
сохранение значений локальных переменных ..............................286
ещё об инициализации .................................................................287
двойная точность и вычисление правой части выражений ............287
передача одного и того же аргумента дважды ..............................288
reAl(4) .........................................................................................290
признак конца файла (eoF), вывод на экран и т. п. ........................290
внешние и внутренние (встроенные) подпрограммы ....................291
несовпадения в интерфейсах: предполагаемая форма и явная 
форма массивов ...........................................................................292
инициализация генератора случайных чисел ...............................293
открытие одного и того же файла дважды ....................................294
Б.2. Массивы ......................................................................... 294
использование автоматических и временных массивов может 
привести к переполнению стека ...................................................294
Границы массивов с начальным индексом меньше 1 ....................296
объявления массивов: dimension(:) и dimension(*) .......................296
Б.3. динамические библиотеки ............................................. 297
открытие файла в программе и использование его в dll  
и наоборот ....................................................................................297
выделение памяти в dll и освобождение этой памяти  
в программе и наоборот ...............................................................298
Аргументы командной строки недоступны в dll ...........................298
подпрограммы или данные из основной программы,  
используемые в dll .....................................................................298

Приложение В. Зарегистрированные товарные  
знаки, упоминаемые в данной книге ..................... 300

Список литературы ......................................... 302

Предметный указатель .................................... 309

Предисловие 
Майкла Меткалфа

Эпоха, когда прикладные программы создавались на языке Fortran, 
почти полностью совпадает с периодом существования компьютеров общего назначения. Это удивительный факт, и с учётом того, что 
многие другие языки программирования высокого уровня прекратили своё существование, трудно понять, почему получилось именно 
так. Возможно, исходные принципы проектирования Джона Бэкуса 
(John Backus) – простота использования и эффективность выполнения – стали двумя решающими факторами. Возможно, сыграла роль 
преданность языку Fortran сообщества его пользователей, которые 
всегда старались не отставать от новейших разработок в области технологии программирования и адаптировать язык к постоянно расширяющемуся кругу требований.
В течение нескольких десятилетий Fortran считался вымирающим 
языком, но, несмотря на все предсказания, оказался на удивление 
живучим. Более того, в последние годы возобновилась его стандартизация, и последний стандарт Fortran 2008 должен снова продлить 
жизнь этому языку. С учётом этих нововведений очень жаль, что 
продолжают существовать старые версии Fortran, как в форме давно устаревших курсов, читаемых неисправимо упрямыми преподавателями, так и в виде вышедших из употребления концепций, о 
которых постоянно твердят его критики. Современный Fortran – это 
процедурный, императивный, компилируемый язык с синтаксисом, 
соответствующим точному представлению математических формул. 
Независимые процедуры могут компилироваться отдельно или объединяться в модули, что упрощает создание крупномасштабных программ и библиотек процедур. В язык включены функциональные 
возможности для обработки массивов, абстрактные типы данных, динамические структуры данных, средства объектно-ориентированного 
программирования и параллельной обработки. Fortran способен без 
затруднений взаимодействовать с C. Таким образом, современный 

Предисловие

Fortran, начиная с версии Fortran 95 (так теперь стали обозначаться версии стандарта) – это мощный инструмент. Он в полной мере 
поддерживает структурное программирование, а средства объектноориентированного программирования, появившиеся в стандарте 
Fortran 2003, стали самым значительным усовершенствованием языка, его главным нововведением. Большинство из упомянутых новых 
функциональных возможностей описано в данной книге.
Но ни один стандарт до Fortran 2003 включительно не содержал 
никаких средств, специально предназначенных для поддержки параллельного программирования. Такая поддержка осуществлялась опосредованно, с привлечением вспомогательных стандартов, в частности 
HPF (High-Performance Fortran), MPI (Message Passing Interface), 
OpenMP и Posix Threads (Pthreads). Использование библиотек MPI 
и OpenMP стало массовым явлением, но HPF в конечном счёте не 
имел особого успеха. Сейчас, после принятия стандарта Fortran 2008 
одним из самых сильных свойств современного языка Fortran является непосредственная поддержка параллельного программирования, 
благодаря введению чрезвычайно востребованного средства: комассивов (coarrays).
Директивы HPF имели форму строк комментариев и распознавались только HPF-процессором. Например, существовала возможность выравнивания трёх совпадающих по форме массивов по 
четвёртому с обеспечением локальности ссылок. Другие директивы 
позволяли распределить обработку выравниваемых массивов по нескольким процессорам. С другой стороны, MPI представляет собой 
универсальную библиотеку процедур для передачи сообщений, а 
библиотека OpenMP, поддерживающая независимое от платформы параллельное программирование с совместным использованием 
памяти, состоит из набора директив компилятора, библиотечных 
подпрограмм и переменных среды, которые определяют поведение 
программы во время выполнения. Posix Threads – это стандарт, определяющий спецификацию библиотеки для поддержки многопоточности.
В отличие от всех перечисленных средств, главной целью введения 
комассивов является предоставление синтаксиса, минимально влияющего на внешний вид программы и позволяющего распределить 
по нескольким процессорам не только данные, как в модели «одна 
инструкция, много данных» (Single Instruction Multiple Data, SIMD), 
но и работу в соответствии с моделью «одна программа, много данных» (Single Program Multiple Data, SPMD). От программиста требу
Предисловие

ется знание лишь небольшого набора новых правил. Работа с комассивами – это самое важное новшество в стандарте Fortran 2008, но 
кроме него была введена новая форма управляющей конструкции do 
concurrent как способ распараллеливания циклов. Вполне очевидно, что появилась возможность обеспечения полноценного режима 
параллельного выполнения, не выходя за рамки языка. Всё это также 
рассматривается и сравнивается в данной книге.
Другие важные нововведения в стандарте Fortran 2008: подмодули 
(submodules), более удобный доступ к объектам данных, усовершенствованные средства ввода/вывода и управления выполнением, дополнительные внутренние процедуры, в частности, для работы с битами. Fortran 2008 был опубликован в 2010 году, и в настоящее время 
является действующим стандартом. Будущее языка Fortran определяет его способность обеспечить высокую производительность вычислений, таким образом, комассивы становятся важнейшим инструментом языка.
Но языку программирования трудно выжить, если о нём мало что 
известно. Причём должны существовать не только учебники по его 
синтаксису и семантике, но и книги о практическом применении языка для решения реальных задач. Опыт работы, конкретные методики, 
а также способы наиболее оптимального использования новых функциональных возможностей должны передаваться новому поколению 
программистов. В наше время, когда языки программирования не являются «вещью в себе», а всё чаще используются совместно друг с 
другом или в сочетании с разнообразными инструментальными средствами, необходима именно такая книга как «Современный Fortran 
на практике».
Автор этой книги постоянно сотрудничает с информационным 
бюллетенем ACM Fortran Forum и является активным участником 
группы новостей comp.lang.fortran, где публикует множество полезных советов. Его опыт научного программирования приносит пользу 
сообществу не только в Нидерландах, где он проживает, но и во всём 
мире, а статьи по обобщённому программированию и использованию 
шаблонов проектирования в Fortran содержат много свежих идей. Таким образом, квалификация автора вполне позволяет ему написать 
книгу, подобную этой.
Но «Современный Fortran на практике» – это не просто сборник 
предыдущих публикаций. Она содержит логически связное изложение основ, и собственные материалы автора по параллельному 
программированию на Fortran с использованием библиотек MPI, 

Предисловие

OpenMP и комассивов (в кратком изложении), а также описывает 
использование Fortran для создания графических приложений и для 
взаимодействия с графическими пользовательскими интерфейсами. 
В книге много подробных примеров кода, на которые читатель может 
опираться при создании собственных программ.
Эта книга весьма полезна, и я рекомендую её всем программистам, 
использующим Fortran. Все мы уже убедились в том, что Fortran продолжает существовать и у него есть будущее.

Майкл Меткалф (Michael Metcalf)
Токио, октябрь 2011 г.

Предисловие автора

Я программирую на языке Fortran уже более 25 лет, сначала на 
FORTRAN IV, немного позже на FORTRAN 77. В последнее десятилетие прошлого века я и несколько моих коллег прослушали 
курс по Fortran 90, прочитанный Яном ван Оостервийком (Jan van 
Oosterwijk) в Техническом университете Делфта. Приблизительно в 
это же время я присоединился к группе новостей comp.lang.fortran, и 
многому научился в этом дружелюбном сообществе.
В определённом смысле я обычный программист на языке Fortran. 
Моя основная специальность – физика, а программирование я начал осваивать ещё во время учёбы, но большую часть практического 
опыта приобрёл во время работы. Я стал программистом по производственной необходимости, а не из-за особого интереса к всё более 
изощрённым возможностям программирования вообще и к перспективам их применения в Fortran. Позже я начал писать статьи для информационного бюллетеня ACM Fortran Forum, которые стали отправной точкой для данной книги.
Эта книга не научит вас программированию на языке Fortran. Для 
этого существует множество специальных учебников ([22], [65]). 
Цель данной книги – показать, как можно использовать современный Fortran для решения задач, существующих в настоящее время, 
продемонстрировать, например, что методики, широко распространённые в мире объектно-ориентированных языков, таких как Java и 
C++, вполне применимы в последней версии Fortran. Более того, в 
книге описываются некоторые приемы решения задач программирования, которые не так-то просто реализовать с помощью других 
языков.
Если вы знакомы с языком в основном по старым его версиям, 
существовавшим до появления Fortran 90, несколько первых глав 
постепенно познакомят вас с операциями над массивами, с перегружаемыми операциями и с некоторыми другими функциональными 
возможностями, введёнными в этом стандарте. Кроме того, вы увидите, что при использовании Fortran появилась возможность приме
К покупке доступен более свежий выпуск Перейти