Дата публикации: Dec 15, 2012 4:38:33 PM
Язык Фортран широко использует понятие оператора, то есть встроенной команды языка для совершения тех или иных действий. В других языках зачастую для этих целей применяются функции. Хорошим примером является система ввода/вывода. Некоторые операторы нуждаются в дополнительной информации, уточняющей действие, которое необходимо выполнить, а также возвращают, если это желательно, некоторую информацию о выполненном действии. Эта информация описывается спецификаторами операторов, которые вполне аналогичны формальным аргументам функций. Есть и разница: к примеру, оператор записи write может иметь много спецификаторов (а несколько из них необходимы), указываемых в скобках; однако действия совершаются над списком объектов данных, которые передаются оператору после скобок: оператор write(1,2) a,b,c записывает объекты a, b и c в файл, связанный (ранее) с устройством 1, руководствуясь форматом, описанным на строке с меткой 2.
Подобно аргументам функций, спецификаторы имеют имена; возможно позиционное задание значений (как в примере выше) и ключевое (в стиле имя = значение). В отличие от аргументов функций, лишь некоторые спецификаторы могут задаваться "позиционно", а отнюдь не все, хотя бы потому, что порядок прочих спецификаторов не фиксирован. Так, оператор write должен иметь спецификатор UNIT устройства, в качестве которого может быть натуральное число или целочисленная переменная (устройство, которое должно предварительно быть связано с файлом посредством оператора open), символьная переменная (внутренний файл) либо символ * (устройство по умолчанию, STDOUT в данном случае). Если UNIT= опущено, значение должно идти первым. Также должен присутствовать (для форматных файлов) либо спецификатор FMT формата (звездочка для формата по умолчанию, натуральное число для указания метки, символьная константа либо переменная для непосредственного задания формата), либо спецификатор NML, задающий имя именованного списка ввода/вывода. Будучи вторым, значение может быть задано без указания спецификатора, то есть позиционно. Для файлов прямого доступа вместо этих спецификаторов должен присутствовать REC, указывающий номер записи, но он должен быть указан по имени. Аналогичен спецификатор POS для потоковых файлов.
Спецификаторы, по аналогии с аргументами, могут быть входящими ил исходящими (соответственно своему смыслу). Входящие сообщают информацию оператору: имя файла, форматность, длину записи и т.п. Исходящие служат для получения информации о выполненной операции - коды ошибок и сообщения о них, идентификатор отложенной операции ввода/вывода и т.д. Интересно, что традиционно в Фортране широко используются символьные значения спецификаторов, особенно входящих. Например, файл может быть форматным или неформатным, и это указывает спецификатор FORM с символьными значениями - formatted или unformatted. Так удобнее для человека, но несколько необычно: чаще в таких ситуациях используют целочисленные коды и именованные константы. Это философский вопрос. Исходящий текстовый спецификатор - IOMSG, содержащий текстовое системно-зависимое сообщение об ошибке (если все нормально, значение не меняется). Имеется и парный спецификатор IOSTAT, целочисленный, содержащий код ошибки. "Содержащий" выше означает, что спецификатор указывает переменную подходящего типа, которая и получает значение.
Операторы ввода/вывода имеют огромное количество спецификаторов, предусмотренных в Стандарте и еще больше нестандартных. Однако зачастую можно ограничиться лишь несколькими, используя прочие при необходимости. Спецификаторы позволяют регламентировать ввод/вывод, сообщать об исключительных ситуациях, контролировать асинхронный ввод/вывод и т.п. Помимо ввода/вывода, спецификаторы имеют и другие операторы языка: allocate и deallocate и операторы управления образами (синхронизации).