Приложение A. Рекомендации по программированию
В начало страницы
В этой главе описываются следующие сервисные программы:
* fot
* hdrstrip.f90
* sequnf.f90
* tryblk.f90
fot
Обращение к fot:
fot [file1] [file2]
fot есть программа, которая конвертирует файлы, созданные программой LF95 и
открытые как CARRIAGECONTROL='FORTRAN', в форму, удобную для печати.
fot интерпретирует каждый первый символ каждой строки файла file1 как
используемый для печати символ Fortran управления кареткой и выдает файл
file2 в формате Linux. Первый символ каждой строки файла file1 претерпевает
следующие изменения:
пусто: символ убирается, что приводит к печати строки с простым шагом
(single spacing). Строка из всех пустышек конвертируется в строку без символов.
0: Символ заменяется символом новой строки, что вызывает печать
строки с двойным шагом.
1: Символ заменяется на символ новой страницы, что приводит к печати
строки с начала новой страницы.
+: Если это первая строка файла, символ убирается. В противном случае
он заменяется символом возврата каретки, что приводит к печати строки поверх
предыдущей.
Примеры
1. fot < infile > outfile
2. a.out | fot | lpr
3. fot infile outfile
В начало страницы
Если первый символ строки отличен от всех, перечисленных выше, то строка
остается без изменений. После завершения команды выдается диагностическое
сообщение в стандартный файл ошибок, указывающее количество строк, не
содержащих правильные Fortran-символы управления кареткой. Например:
invalid n lines carriage control conventions in file1 (нарушено соглашение
об управлении кареткой в n строках файла file1)
hdrstrip.f90
hdrstrip.f90 есть исходный файл Fortran, который можно компилировать,
компоновать и выполнять с помощью LF95. Он конвертирует файлы прямого доступа
LF90 к стилю LF95.
sequnf.f90
sequnf.f90 есть исходный файл Fortran, который можно компилировать,
компоновать и исполнять с LF95. Он конвертирует неформатированные
последовательные файлы LF90 к стилю LF95.
tryblk.f90
tryblk.f90 есть исходный файл Fortran, который можно построить с LF95.
Он проверяет диапазон BLOCKSIZE и выдает требуемое время для каждого случая.
Результаты можно использовать для определения оптимального значения для
вашей системы, указываемого в ваших программах. Заметим, что некоторый
BLOCKSIZE может не быть хорошим для других систем.
В начало страницы
Это приложение содержит информацию, которая может помочь создавать улучшенные
программы на LF95.
В начало страницы
В большинстве случаев наиболее эффективным решением задачи программирования
является то, которое просто и естественно. Редко приходится приносить в жертву
ясность и элегантность, чтобы сделать программу более эффективной.
Следующие наблюдения, которые неприложимы к другим реализациям, можно принимать
во внимание, когда эффективность программы критична:
* Для фиктивных аргументов используйте в качестве нижней границы измерений
ноль (а не единицу, которая устанавливается по умолчанию). Так, объявляйте
массив A как A(0:99), а не как A(100).
* Одномерные массивы более эффективны, чем двумерные, двумерные более
эффективны чем трехмерные, и т.д.
* Выбирайте длину записи файла прямого доступа равной степени двойки.
* Неформатированный ввод/вывод для чисел работает быстрее.
* Форматированный символьный ввод/вывод работает ,быстрее при
CHARACTER*256 C
чем при
CHARACTER*1 C(256)
В начало страницы
В LF95 аргументы передаются в подпрограммы по адресу, и подпрограммы
ссылаются на эти аргументы так, как они определены в вызванной подпрограмме.
Из-за способа передачи аргументов могут появиться следующие побочные
эффекты:
* Объявление фиктивных аргументов с числовым типом, отличным от типа,
объявленного в вызывающей программной единице может привести к непредсказуемым
результатам и абортированию по ошибке NDP.
* Объявление фиктивных аргументов в вызываемой программной единице более
обширными (larger) чем в вызывающей программной единице может привести к
модификации кода в других переменных и частях программы и к непредсказуемым
результатам.
* Если некоторая переменная фигурирует дважды как фактический аргумент
в отдельном операторе CALL или ссылке на функцию, то соответствующие фиктивные
аргументы в подпрограмме будут ссылаться на одну и ту же ячейку. При каждом
изменении одного из этих фиктивных аргументов будет изменяться и другой.
В соответствии со стандартами Fortran, компилятор и/или исполнительная
программа во время исполнения не должны замечать такие изменения; это
разрешает производить оптимизацию (например, держать второй фиктивный аргумент,
или его элементы, в регистрах).
* Аргументы функций передаются таким же самым образом, как аргументы
подрутин, так что изменение какого-нибудь фиктивного аргумента в функции
будет также изменять соответствующий аргумент при вызове функции:
y = x + f(x)
Результат приведенного выше оператора будет неопределенным, если функция f
изменяет фиктивный аргумент x.
В начало страницы
Файлы, управляемые форматированными последовательными операторами ввода/вывода,
имеют записи неопределенной длины. Одна запись Fortran соответствует одной
логической записи. Длина записи формата с неопределенной длиной зависит от
обрабатываемой записи Fortran. Максимальная длина может быть определена
в операторе OPEN в RECL= specifier. Символ перехода к новой
строке оканчивает логическую запись. Описатели редактирования $ или \
для формата указаны в форматирующем последовательном операторе вывода,
запись Fortran не содержит символа продвижения строки.
В начало страницы
Файлы, обрабатываемые с использованием неформатированных последовательных
операторов ввода/вывода, имеют формат с записями
неопределенной длины. Одна запись Fortran соответствует одной логической
записи. Длина такой записи зависит от длины записи Fortran. Запись Fortran
включает 4 байта, добавленные к началу и концу логической записи.
Максимальная длина может быть указана в операторе OPEN с RECL= specifier.
Начальная область используется, когда исполняется бесформатный последовательный
оператор READ. Конечная область используется оператором BACKSPACE.
В начало страницы
Файлы, обрабатываемые форматированными прямыми операторами ввода/вывода, имеют
формат с записями фиксированной длины. Одна запись Fortran соответствует
одной логической записи. Длина логической записи определяется оператором OPEN
в RECL= specifier. Если запись Fortran короче чем логическая запись,
оставшаяся часть заполняется пробелами. Длина записи Fortran не должна
превышать длину логической записи. Такой формат записи фиксированной длины
единствен в Fortran.
В начало страницы
Файлы, обрабатываемые бесформатными операторами ввода/вывода прямого доступа,
имеют записи фиксированной длины. Одна запись Fortran может соответствовать
более чем одной логической записи. Длина записи должна определяться в
операторе OPEN с RECL= specifier. Если запись Fortran оканчивается внутри
логической записи, оставшаяся часть заполняется двоичными нулями. Если длина
записи Fortran превышает длину логической записи, оставшиеся данные переходят
в следующую запись.
В начало страницы
Файлы, открытые с FORM='BINARY' (или ACCESS='TRANSPARENT'), обрабатываются
как поток байтов без разделителей записей. Хотя файлы любого формата могут
обрабатываться как двоичные, нужно знать их формат для правильной обработки.
Заметим, что хотя ACCESS='TRANSPARENT' поддерживается в LF95, FORM='BINARY'
есть предпочтительный метод открывать такие файлы. Заметим также, что
эти спецификаторы в настоящее время не входят в стандарт Fortran и могут
изменяться от одного компилятора к другому; однако, это может измениться в
будущих версиях стандартов Fortran.
В начало страницы
Запись endfile должна быть последней записью последовательного файла.
Такая запись не имеет атрибута длины. Оператор ENDFILE записывает ее в
последовательный файл. После по крайней мере, одного исполнения оператора
WRITE запись конца файла производится при следующих условиях:
* Выполнен оператор REWIND.
* Выполнен оператор BACKSPACE.
* Выполнен оператор CLOSE.
В начало страницы
Бесформатные файлы, созданные на других платформах, могут адаптироваться с
помощь некоторых параметров времени исполнения. Числовые данные с порядком
байтов, начиная со старшего ("big-endian format") (целые, логические и IEEE
с плавающей точкой) могут адаптироваться с параметром времени исполнения T и
числа с плавающей точкой в формате IBM370 могут адаптироваться с параметрами
времени исполнения C и M (см. "Параметры времени исполнения на стр. 111).
По умолчанию LF95 читает и пишет числовые данные в "little-endian" формате
(начиная с младшего байта).
В начало страницы
Если файл открывается без указания его имени, предполагается, что он получает
имя fort.unit, где unit есть номер устройства, указанного в операторе OPEN.
Если файл открывается как STATUS='SCRATCH' и FILE= не указано, то файлу
присваивается случайное имя и он создается во временном каталоге системы. Если же
FILE= указано, то файл создается в текущем рабочем каталоге. В обоих случаях
файл уничтожается после окончания программы, даже если он закрывается с
STATUS='KEEP' (см. "Промежуточные файлы" на стр. 11).
При нормальном завершении программы все файлы закрываются.
В начало страницы
Можно сократить время компоновки, сократив количество именованных блоков
COMMON. Вместо кода:
common /a1/ i
common /a2/ j
common /a3/ k
...
common /a1000/ k1000
пишите:
common /a/ i,j,k, ..., k1000
В начало страницы
Проблема "Год 2000" возникает, когда компьютерная программа использует только
две цифры для представления текущего года и предполагает, что текущий век
есть 1900. Компилятор может искать признаки того, что это может случиться
в программе и выдавать предостережение, но он не может предвидеть все случаи
этой проблемы. В конечном счете, это -- обязанность программиста исправить
положение модификацией программы. Наиболее вероятный источник трудностей
в программах на Fortran состоит в использовании устаревшей подрутины DATE().
Хотя LF95 компилирует и компонует программы, использующие DATE(), такие
действия крайне нежелательны; рекомендуется использовать вместо нее подрутину
DATE_AND_TIME(), которая возвращает четыре цифры.
LF95 может быть настроен на выдачу предупреждений во время исполнения при
вызовах DATE(). Это можно сделать, использовав параметры времени исполнения
-Wl,Ry,li, например:
myprog.exe -Wl,-Ry,-li
Дополнительную информацию о параметрах времени исполнения см. в " Параметры
времени исполнения" на стр. 113.
В начало страницы
Таблица 11: Пределы в операциях LF95
.........................................................................
Объект Maximum
..........................................................................
Размер программы Доступное количество памяти (включая
виртуальную), но не более 4 Гигабайт.
Колич. одновременно открытых файлов Зависит от системы (см пределы команд
csh; нужно вычесть три из системных
пределов для устройств Fortran 0, 5
и 6)
Длина данных типа CHARACTER 65,000 байт
Размер блока в I/O 65,000 байт
Длина записи в I/O 2,147,483,647 байт
Размер файла I/O 2,147,483,647 байт
Макс. количество I/O записей 2,147,483,647 разделить на значение
(файлы прямого доступа ) RECL= спецификатор
Глубина вложения функций, секций
массивов, элементов массивов и 255
ссылок на подцепочки
Глубина вложений DO, CASE и
операторов IF 50
Глубина вложения неявных циклов DO 25
Глубина вложения файлов INCLUDE 16
Количество измерений массивов 7
..............................................................................
T, где абсолютное значение T, полученное
по приведенной ниже формулы, не должно
превышать 2147483647:
n i
i
Размер массива T = l1xs + Е {lix{П(dm-1)xs}}
% & -
i=2 m=2
)
Здесь:
н + $
,
(
n: номер измерения
s: длина элемента массива
l: нижние границы измерений
d: размеры измерений
T: размер массива согласно определению
(Русская буква Е означает сумму по i от 2 до n)
..............................................................................