Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Аверянов Введение в оператсионные системы и основы программирования 2015

.pdf
Скачиваний:
4
Добавлен:
12.11.2022
Размер:
4.77 Mб
Скачать

gfortran hello.f95

В этом случае, если исходный файл hello.f95 не содержит ошибок, в текущей директории будет создан исполнимый файл с именем: a.out – если используется какой-либо коммандер, то это сразу будет видно в таблице; иначе придется воспользоваться командой операционной системы:

ls (для Linux)

dir (для Windows)

Для запуска файла из командной строки Linux необходимо явное указание на текущую директорию: – «./». При запуске из командной строки Windows в этом нет необходимости:

./a.out (для Linux)

a (для Windows)

После запуска, на экране появится текст:

HELLO, WORLD

Если в процессе компиляции обнаружится наличие ошибок в тексте программы, то необходимо их исправить, а затем повторить процесс компиляции.

Создание исполняемого файла с заданным именем. Наиболее часто возникает ситуация, когда исполняемому файлу программы требуется присвоить такое же имя, как и у исходного файла. Для этого у компилятора Gfortran имеется специальная опция «–o имя», важно не перепутать латинскую букву «о» с нулем! Эту опцию можно указать в любом месте списка параметров компилятора

Gfortran, например:

gfortran -o hello hello.f95

или

gfortran hello.f95 -o hello

Правильное выполнение этой команды приведет к созданию исполнимого файла с именем hello (или hello.exe), который затем можно запустить обычным образом:

131

./hello (для Linux)

hello или hello.exe (для Windows)

Типичной ошибкой, на которую стоит обратить внимание, является попытка запустить исходный файл вместо исполняемого файла, т.е. в командной строке набирают ./hello.f95 вместо ./hello и т.д.

Пример 3.16. Программные компоненты в одномфайле

program MESSAGE

! В файле hello.f95

call HELLO

 

end

 

subroutine HELLO!

! В файле hello.f95

print*, 'HELLO,^WORLD'

 

end

 

Исходный файл может содержать несколько программных компонент – одну основную программу подпрограмму или несколько. Основная программа MESSAGE (пример 3.16) вызывает подпрограмму HELLO, печатающую уже знакомое текстовое сообщение «HELLO, WORLD». Для вызова подпрограммы используется опе-

ратор CALL (см. п. 3.7).

Поскольку все программные компоненты находятся в одном файле, то в написании и трансляции программы ничего не изменяется – создается исходный файл, например: message.f95, в котором размещается главная программа MESSAGE и подпрограмма HELLO, а затем исходный файл компилируется точно так же, как исходный файл hello.f95 в предыдущих примерах:

gfortran -o message message.f95

или же

gfortran message.f95 -o message

3.2.3. Трансляция нескольких исходных файлов

Программныекомпоненты одной программы могут размещаться отдельно в нескольких исходных файлах. Основная программа

132

MESSAGE может размещаться в файле message.f95 (пример 3.17), а подпрограмма HELLO в файле hello.f95 (пример 3.18).

Пример 3.17. Файл message.f95

program MESSAGE ! В файле hello.f95 call HELLO

end

Пример 3.18. Файл hello.f95

subroutine HELLO ! В файле hello.f95 print*, 'HELLO,^WORLD'

end

Компиляция с созданием исполняемого файла. При трансля-

ции имена исходных файлов перечисляются в произвольном порядке, а опция «–о massage» определяет имя исполняемого файла:

gfortran -о massage hello.f95 message.f95

или

gfortran message.f95 hello.f95 -о massage

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

Компиляция с созданием объектных файлов. В ряде случаев интерес может представлять компиляция исходных файлов с их преобразованием в машинный код, без сборки исполняемого файла. Для этого компилятор gfortran необходимо запустить с опцией «–c», т.е. только компиляция. Файлы могут компилироваться по одному или по нескольку:

gfortran -c hello.f95

gfortran -c message.f95

или

133

gfortran -c hello.f95 message.f95

В любом случае результатом будет появление в текущей директории объектных файлов: hello.о и message.о, из которых затем можно осуществить сборку исполняемого файла так же, как из исходников:

gfortran -o massage hello.o message.o

Исходные файлы всегда сначала компилируются в объектные файлы, а уже затем из объектных файлов специальной программой, называемой редактором связей или линкером (линковщиком), осуществляется сборка исполняемого файла. Транслятор gfortran просто скрывает этот этап (если текста программ в исходных файлах достаточно для полного цикла генерации исполняемого файла).

При работе над большими проектами компиляция занимает значительное время, из-за чего постоянно перекомпилировать исходные файлы с уже отлаженным кодом нет никакого смысла, поэтому для сборки проекта удобнее пользоваться уже скомпилированными объектными файлами.

Компилятор gfortran поддерживает смешанную обработку исходных и объектных файлов, которые могут быть перечислены через пробел в любом порядке:

gfortran -o message hello.o message.f95

или

gfortran -o message hello.f95 message.o

Для получения более полных сведений о возможностях транслятора Gfortran следует воспользоваться опцией «--help»:

gfortran --help

134

3.2.4. Трансляция модулей

Исходный файл, содержащий модуль (пример 3.19), необходимо компилировать с опцией «-c» (только компиляция):

gfortran -c vector_arithmetic.f95

Успешное выполнение этой команды приведет к появлению в текущей директории специализированного файла структуры модуля

(vector_arithmetic.mod) и объектного файла (vector_arithmetic.o),

который затем необходимо транслировать вместе с использующей его программой (см. пример 3.19) по уже известным правилам трансляции программы, расположенной в нескольких файлах:

gfortran -o vector_test vector_test.f95 vector_arithmetic.o

или

gfortran -o vector_test vector_arithmetic.o vector_test.f95

Пример 3.19. Модуль – контейнервекторной арифметики module VECTOR_ARITHMETIC

type VECTOR real X, Y

end type VECTOR interface operator(+)

module procedure ADD_VECTORS end interface

contains

function ADD_VECTORS(A,B) type(VECTOR) ADD_VECTORS type(VECTOR), intent(in) :: A, B ADD_VECTORS%X = A%X +B%X ADD_VECTORS%Y = A%Y +B%Y end function ADD_VECTORS

end module VECTOR_ARITHMETIC

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

135

gfortran -o vector_test vector_arithmetic.f95 vector_test.f95

Дело в том, что компилятор обрабатывает файлы последовательно и для успешной компиляции файла vector_test.f95, использующего модуль, требуется наличие файла vector_arithmetic.mod, а он появляется только после обработки файла vector_arithmetic.f95. Поэтому если переставить файлы:

gfortran -o vector_test vector_test.f95 vector_arithmetic.f95

то возникает ошибка компилятора, связанная с невозможностью открыть файл модуля: vector_arithmetic.mod.

3.3.КОНЦЕПЦИЯ ДАННЫХ ЯЗЫКА ФОРТРАН

3.3.1.Имена (идентификаторы)

Императивные языки программирования, к числу которых относится Фортран (а также Паскаль, Си, Бейсик и др.), в различной степени являются абстракцией компьютерной архитектуры фон Неймана. Две основные компоненты этой архитектуры − память и процессор. Ячейки памяти служат для хранения данных и команд, а процессор – для изменения состояния памяти.

Простейшими абстракциями ячеек памяти компьютера в императивных языках программирования являются переменные и константы. По существу, переменные и константы – ячейки машинной памяти (машинными словами измеряемыми, как правило, в байтах), адресация которых в программе осуществляется не по физическому адресу, а через имя (идентификатор). При этом для константы существует ограничение, связанное с запретом изменения ее значения. Адресация таких более сложных конструкций, как массивы и структуры данных (по сути состоящих из переменных и констант), также осуществляется через их имена. Имеют свои названия типы данных и программные компоненты (главная программа подпрограммы и модули).

Имя объекта – это выстроенная по определенным правилам последовательность символов алфавита языка. В Фортране 90/95 действуют следующие правила записи имен.

136

1.Строчные и прописные (большие и маленькие) буквы в Фортране не различаются.

2.Символьная длина имени не должна превышать 31 символ.

3.Имя может состоять из алфавитно-цифровых символов (букв и цифр) и символа подчеркивания – «_».

4.Первым символом имени обязательно должна быть буква.

Допустимые имена:

X ALFA Beta2S This_Is_Very_Long_Name (допустимо в Фортране 90/95)

Недопустимые имена:

2SBETA (первый символ не буква);

AL&FA (содержит недопустимый символ: «&»);

IT IS Impossible (содержит пробелы).

В языке Фортран 77, который является подмножеством языка Фортран 90/95, не допускаются имена длиннее шести алфавитноцифровых (A-Z, a-z, 0-9) символов (никакие подчеркивания и иные специальные символы из алфавита Фортрана не допускаются). При этом первым символом обязана быть буква.

Для имен (идентификаторов) и связанных с ними объектами данных в Фортране существует правило неявного определения типов (п. 3.3.2). Если в программе используется именованный объект данных (скаляр или массив – пп. 3.3.5, 3.3.6), тип которого не определен явно, то объект данных считается:

1)целым (INTEGER), стандартной разновидности целого типа (п. 3.3.4), если первым символом его имени будет одна из букв: 'I', 'J', 'K','L','M' или 'N', например: J, IND, LSTREAM и т.д.;

2)вещественным (REAL), стандартной разновидности вещественного типа (п. 3.3.4), если первым символом его имени будет любая другая буква, например: X, DIN, EPSILON.

Умолчаний по неявному определению других типов в Фортране не существует.

137

Часто считают, что возможность неявного определения типов переменных и констант в Фортране является избыточным, бесполезным и даже вредным наследием ранних стандартов. Действительно, отсутствие строгого контроля типов может приводить к досадным ошибкам, например опечатка в имени переменной расценивается компилятором как появление в программе переменной с другим именем. Однако не следует забывать, что Фортран создавался как язык для научных расчетов – транслятор формул, позволяющий быстро и оперативно выполнять небольшие оценочные расчеты, без необходимости предварять их громоздкими описательными блоками. Такая возможность может существовать только при отсутствии строгого контроля типов.

Строгий контроль типов необходим при разработке конечного программного продукта, но излишне загромождает программу, и тормозит работу при выполнении небольших оценочных и предварительных расчетов. Неявное определение типов легко отключить при помощи инструкции IMPLICIT NONE (пример 3.20).

Пример 3.20. Инициализация именованных констант с запретом неявного определения типа

program CONSTINIT5

implicit none ! Запрет неявного определения типа real (kind=8) PI, E

integer MIN, MAX

parameter (PI= 3.1415926535897931_8, E= 2.7182818284590451_8) parameter (MIN = 0, MAX = 100)

print*, PI, E, MIN, MAX end

3.3.2. Понятие типа

Фортран, как императивный язык программирования, имеет дело с числовыми символьными и логическими данными, т.е. с данными различных типов.

Тип данных в императивных языках определяется:

1)правилами записи (символьного представления) значений;

2)диапазоном допустимых значений;

3)набором действий и операций над данными этого типа. Например, значения целого типа (INTEGER) имеют привычное символьное представление в виде целых чисел, где целое число –

138

это последовательность цифр со знаком или без знака: «–123», «+98» или «4567», а также целый нуль, который может быть записан со знаком или без знака: «–0», «+0» или просто «0».

Диапазон допустимых значений целых чисел обычно лежит в пределах ±2147483647, в зависимости от параметра разновидности типа (п. 3.3.3). Для объектов данных целого типа определены стандартные арифметические действия: сложение, вычитание, умножение и деление.

ВФортране 90/95 определено пять встроенных типов данных, на основании которых могут быть созданы производные типы данных. Встроенные типы данных отражают характерные особенности организации памяти большинства компьютеров (архитектура фон Неймана) и наиболее распространенные способы хранения данных. Встроенные типы можно использовать непосредственно, без предварительных описаний и подключения каких-либо библиотек.

Такими типами являются:

INTEGER (целые числа);

REAL (вещественные числа);

COMPLEX (комплексные числа);

CHARACTER (текстовые символы и строки);

LOGICAL (ИСТИНА или ЛОЖЬ).

ВФортране 90/95 существуют средства создания производных типов данных на основе встроенных типов.

При написании программ на языке Фортран 77 можно также использовать специфический вещественный тип (не рекомендованный к использованию в Фортране 90/95): DOUBLE PRECSION (вещественные числа двойной точности).

Для объектов числовых типов определены стандартные арифметические действия и операции, для логического типа – логические операции, а для текстового типа – только операция конкатенации, т.е. слияния текстовых строк. Проблема точности (количества зна-

чащих цифр) решается через механизм разновидности типа

(п. 3.3.3).

Символьное представление значений, которые принимают переменные (или другие объекты) перечисленных типов, в Фортране называется буквальными константами (то, что в других языках и в ранних версиях Фортрана называется литералами).

139

3.3.3. Буквальные константы

Одно и то же число может иметь множество вариантов представления, например число «четыре» может быть записано как:

IV − римская символика;

4 − арабская символика, десятичное представление; 100 − арабская символика, двоичное представление и т.д.

Применительно к Фортрану (как и другим языкам программирования) необходимо понимать, что буквальная константа (или литералы в Си или Паскале) – это, прежде всего, способ его записи,

т.е. способ видимого представления этого числа.

Буквальные константы целого типа (INTEGER) представ-

ленные в десятичной системе – обычные целые числа (в том числе

нуль) со знаком или без знака:

 

 

0

+0

–0

12

+345 –675_8

423_K4

Для двух последних буквальных констант явно указаны значения параметра разновидности типа, который может быть выражен через буквальную или именованную целую константу (п. 3.3.4).

Иногда для различных задач удобно представлять положительные целые числа в двоичной, восьмеричной или шестнадцатеричной форме. Для числовых констант без знака в Фортране 90/95 предусмотрены следующие формы записи (например, для десятичного числа «1234»):

B‘10011010010’ – двоичное представление (основание 2); O‘2322’ – восьмеричное представление (основание 8); Z‘4D2’ – шестнадцатеричное представление (основание 16).

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

Если дробная (или целая) часть равна нулю, то ее можно не записывать, но десятичная точка обязательна:

0.0–.12 34. 5.64 –98.7E+10 +2.E–100_16

3.21E+99_LONG

140