Фортран

Поделись знанием:
(перенаправлено с «Fortran»)
Перейти к: навигация, поиск
Фортран
Семантика:

императивный, параллельный

Класс языка:

процедурный, модульный, c элементами объектно-ориентированного программирования

Тип исполнения:

компилируемый

Появился в:

1957

Автор:

Джон Бэкус, IBM

Расширение файлов:

.for (FORTRAN77), .f, .f90, .f95 (Fortran'95 и выше)

Выпуск:

ISO/IEC 1539-1:2004 (Fortran 2003)

Тестовая версия:

ISO/IEC 1539-1:2010 (Fortran 2008)

Система типов:

строгая, статическая

Основные реализации:

GFortran, Open Watcom, Sun Studio, XL Fortran, Intel Fortran

Диалекты:

High Performance Fortran (англ.)

Повлиял на:

ALGOL 68, Бейсик, PL/I

Фортра́н (Fortran) — первый язык программирования высокого уровня, получивший практическое применение, имеющий транслятор и испытавший дальнейшее развитие[1]. Создан в период с 1954 по 1957 год группой программистов под руководством Джона Бэкуса в корпорации IBM. (Язык Планкалкюль, претендующий на пальму первенства, был изобретён ещё в 1945 году, но не был реализован вплоть до 2000 года.) Название Fortran является сокращением от FORmula TRANslator (переводчик формул). Фортран широко используется в первую очередь для научных и инженерных вычислений. Одно из преимуществ современного Фортрана — большое количество написанных на нём программ и библиотек подпрограмм[2].

Имеется большое количество написанных на Фортране (в большей части на старых версиях языка) различных математических библиотек для матричной алгебры и решения систем линейных уравнений, библиотеки для решения дифференциальных уравнений, интегральных уравнений и их систем, аппроксимации функций, специальных функций, быстрых преобразований Фурье, математической статистики, и других математических дисциплин. Эти библиотеки поставляются, как правило, с компилятором. Ряд таких пакетов создавался на протяжении десятилетий и популярен в научной среде по сей день, например — IMSL (англ.)[3][4].

Большинство таких библиотек является фактически достоянием человечества: они доступны в исходных кодах, хорошо документированы, отлажены и весьма эффективны.

Современный Фортран (Fortran 95 и Fortran 2003) приобрёл черты, необходимые для эффективного программирования, для новых вычислительных архитектур; позволяет применять современные технологии программирования, в частности, обобщённое и модульное программирование, ООП, сохраняя, при этом, преемственность с более ранними версиями. Одной из наиболее главных концепций развития современного Фортрана — средства поддержки параллельности и векторные операции[5].





Эволюция стандартов языка

Фортран — жёстко стандартизированный язык, поэтому он легко переносится на различные платформы. Новые стандарты языка в значительной мере сохраняют преемственность с более старыми, что позволяет использовать коды ранее написанных программ и модифицировать их[5]. При этом по мере развития языка заранее объявляются устаревшие конструкции, которые в будущем, возможно, будут удалены[6].

FORTRAN 66 (1972)

На базе стандарта фирмы IBM FORTRAN IV

FORTRAN 77 (1980)

Введено множество улучшений:[5]
  1. Введены операторы открытия и закрытия файла (OPEN, CLOSE) и вывода на стандартное устройство — PRINT.
  2. Добавлены строковый тип данных и функции для его обработки.
  3. Введён блочный оператор IF и конструкция IF THEN — ELSE IF THEN — END IF, а также оператор включения фрагмента программы INCLUDE.
  4. Введена возможность работы с файлами прямого доступа.
  5. Увеличена максимальная размерность массива с 3 до 7. Сняты ограничения на индексы массива.
  6. Усовершенствованы и расширены возможности работы с процедурами.
  7. Введено понятие внутреннего файла (каковыми являются массивы, числовые и строковые переменные). Внутренние файлы позволяют, в частности, осуществлять преобразование число-строка и строка-число стандартным операторами чтения и записи READ и WRITE[7].

Fortran 90 (1991)

Значительно переработан стандарт языка.[7]
  1. Введён свободный формат написания кода. Появились дополнительные описания IMPLICIT NONE, TYPE, ALLOCATABLE, POINTER, TARGET, NAMELIST.
  2. Введены управляющие операторы и конструкции. Добавлены DOEND DO (вместо завершения цикла меткой), DO WHILE, оператор передачи управления на начало цикла CYCLE, конструкция выбора SELECT CASE (для замены громоздких конструкций IF и операторов GOTO), а также заключительный оператор программной единицы, модульной или внутренней процедуры END[5].
  3. Введён инструментарий указателей и функции для работы с оперативной памятью (по аналогии с языком С).
  4. Введены операторы работы с динамической памятью (ALLOCATE, DEALLOCATE, NULLIFY).
  5. Добавлены программные компоненты MODULE, PRIVATE, PUBLIC, CONTAINS, INTERFACE, USE, INTENT.
  6. Введено маскирование присваивания массивов (присваивание при выполнении наложенного на элементы массива логического условия без использования операторов условия), а также работа с сечениями массивов. Введён оператор и конструкция WHERE для частичной замены циклов (правая часть оператора присваивания не изменяется). Маскирование присваивания распространяется практически на все операторы, конструкции и функции, оперирующие с массивами.
  7. Стандартные операции присваивания, сложения, вычитания, а также деления и умножения на число распространены на массивы и их секции, определяемые сечениями. В этом случае осуществляется поэлементное присваивание.
  8. Появились новые встроенные функции, в первую очередь для работы с массивами. Функции для вычислений в массивах: ALL (лог. произведение) и MASK (логическое сложение), COUNT (число истинных элементов), PRODUCT(произведение элементов массива), SUM (сложение элементов массива), DOT_PRODUCT (скалярное произведение), MATMUL (умножение матриц). Добавились справочные функции, а также функции переформирования и свёртки массивов.
  9. В языке появились элементы ООП[8]. Введены производные типы данных. Отдельно объявлен список устаревших черт языка, предназначенных для удаления в будущем.
  10. Добавлены дополнительные функции для работы со строковыми данными, в частности, функции TRIM (удаление завершающих пробелов) и REPEAT (кратное копирование строки) и функции выравнивания по левой и правой границам.

Fortran 95 (1997)

Коррекция предыдущего стандарта. Введён оператор и конструкция FORALL, позволяющие более гибко, чем оператор и конструкция WHERE, присваивать массивы и заменять громоздкие циклы. FORALL позволяет заменить любое присваивание сечений или оператор и конструкцию WHERE, в частности, обеспечивает доступ к диагонали матрицы. Данный оператор считается перспективным в параллельных вычислениях, способствуя более эффективному, чем циклы, осуществлению распараллеливания[9][7][10].

Fortran 2003 (2004)

Дальнейшее развитие поддержки ООП в языке. Взаимодействие с операционной системой. Добавлены также следующие возможности:[5]
  1. Асинхронный ввод-вывод данных.
  2. Средства взаимодействия с языком C.
  3. Усовершенствование динамического размещения данных[10].

Fortran 2008 (2010)

Стандартом предполагается поддержка средствами языка параллельных вычислений (Co-Arrays Fortran)[5][11]. Также предполагается увеличить максимальную размерность массивов до 15, добавить встроенные специальные математические функции[5] и др.

Возможности и характерные особенности языка

Фортран имеет большой набор встроенных математических функций, поддерживает работу с целыми, вещественными и комплексными числами двойной и повышенной точности (при бинарных операциях используется real(10)), имеет богатый инструментарий работы с массивами и внешними файлами. Вопреки распространённому мнению, современный Фортран (2003 и выше) имеет полноценный инструментарий для работы с символьными данными.

Изначально выразительные средства языка были не очень велики, поскольку Фортран был первым реализованным языком высокого уровня. В дальнейшем в Фортран были добавлены многие лексические конструкции, характерные для структурного, модульного, обобщённого и объектно-ориентированного программирования.

Формат записи кода

Структура программ изначально была ориентирована на ввод с перфокарт и имела ряд удобных именно для этого случая свойств. Так, с 1-й по 5-ю колонку располагалась область меток, 6-я служила для маркировки текста как комментария (символом C), а с 7-й по 72-ю располагался собственно текст оператора или комментария. Колонки с 73-й по 80-ю могли служить для нумерации карт (чтобы восстановить случайно рассыпавшуюся колоду) или для краткого комментария, транслятором они игнорировались. Если текст оператора не вписывался в отведённое пространство (с 7-й по 72-ю колонку), в 6-й колонке следующей карты ставился признак продолжения, и затем оператор продолжался на ней. Расположить два или более оператора в одной строке (карте) было нельзя. Когда перфокарты ушли в историю, эти достоинства превратились в серьёзные неудобства.

Именно поэтому к стандарту Фортрана, начиная с Fortran 90, с сохранением фиксированного формата исходного текста, был добавлен свободный формат, который не регламентирует позиции строки и позволяет записывать более одного оператора на строку. Введение свободного формата и современных способов структурного программирования[5] позволило создавать код, читаемость и ясность которого не уступает коду, созданному при помощи других современных языков программирования, таких как Паскаль, C или Java. Современные среды разработки позволяют комбинировать форматы: например, расширять длину строки до свободного формата (обычно 132 символа), позволяют записывать несколько операторов в строке, но при этом позволяют также сохранять отступ слева (делать левое поле), характерный для старого фиксированного формата, оставляя тем самым выделенную колонку для меток ошибок и форматов, а также колонку продолжения строки.

Своего рода «визитной карточкой» старого Фортрана является огромное количество меток, которые использовались в операторах безусловного перехода GOTO, операторах циклов, в условных операторах и в операторах описания форматного ввода-вывода FORMAT. Большое количество меток и операторов GOTO часто делало программы на Фортране трудными для понимания.

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

Однако современный Фортран (в основном начиная с версии Fortran'90) избавлен от избытка меток за счёт введения таких операторов, как DOEND DO, DO WHILE, SELECT CASE, конструкции IF THEN-ELSEIF THEN-ELSE-END IF и др. Более того, в современных стандартах языка оставлен лишь классический оператор GOTO, применяемый во многих языках и поныне. Вычисляемый оператор GOTO, а также конструкция ENTRY — множественного входа в процедуры, — были исключены из стандарта, хотя, как правило, продолжают поддерживаться компиляторами.

Hello, World!

Фиксированный формат (символами «␣» выделены пробелы в позициях строки с 1 по 6):

␣␣␣␣␣␣PRINT*, 'Hello, World!'
␣␣␣␣␣␣END

Свободный формат:

print *, "Hello, World!"
end
Замечания.
  • Оператор начала главной программы PROGRAM не является обязательным. Строго говоря, единственный обязательный оператор Фортран-программы — оператор END.
  • Выбор прописных или строчных букв для написания операторов программы произволен. С точки зрения современных стандартов языка Фортран, множество прописных букв и множество строчных букв совпадают.

Типы данных

Фортран поддерживает 5 основных элементарных встроенных типов данных: действительный (REAL), комплексный (COMPLEX), целый (INTEGER) со знаком или без, логический (LOGICAL) и символьный (CHARACTER). Кроме того, возможно создавать производные типы данных с помощью ключевого слова TYPE. С самого начала создания языка существовали 4 типа данных: действительный, комплексный, целый и логический.

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

Для всех числовых данных определены обычные арифметические операции и присваивания, существуют встроенные функции. Встроенная функция Log(x) в качестве аргумента x может иметь только действительное или комплексное число (не целое).

Как правило, для действительных чисел "одинарной" точности отводится 4 байта (REAL(4), или параметр разновидности типа KIND=4), "двойной" — 8 байт. Для комплексных чисел число байт удваивается.

Целые числа могут занимать от 1 до 4 байт. Современные компиляторы позволяют программисту оперировать числами и "учетверённой" точности.

В арифметических операциях изменение типа производится по умолчанию от целого в действительное и далее комплексное число, либо применением специальной встроенной числовой функции. Так, эквивалентны следующие выражения (i - целое): Log(i*1.) и Log(real(i)).

Строковые (символьные) данные задаются с указанием длины в скобках либо после атрибута типа, либо после имени строки. Для задания строки в теле программы используются одинарные или двойные кавычки. Так, эквивалентны записи: A='It is hot' или A="It is hot". Это удобно в тех случаях, когда в самой строке присутствуют кавычки: B="It isn't hot".

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

Метки — это целые числа с числом цифр не более 5; символы не допускаются. Метки используются в операторах GO TO, операторах чтения, записи и форматирования, а также при обработке ошибок и исключений. Помимо меток, в Фортране имеется возможность именовать управляющие конструкции (циклы, логические условия, конструкции FORALL... END FORALL, WHERE... END WHERE, SELECT CASE... END SELECT, TYPE... END TYPE и др.), причём имя конструкции может содержать любые допустимые в именах переменых символы.

Встроенные функции для символьных данных

Для преобразования число-символ: CHAR(i) и ACHAR(i). Преобразуют целое в соответствующий ему символ операционной системы или символ таблицы ASCII.

Для преобразования символ-число: ICHAR(i) и IACHAR(i). Осуществляют обратные преобразования.

Функции сравнения строк: LGE(A,B), LGT(A,B), LLE(A,B) и LLT(A,B). Результат функций — "истина", если длины строк (L(A) и L(B)), выраженные в символах ASCII, удовлетворяют следующим неравенствам соответственно: L(A)<math>\geqslant</math>L(B), L(A)<math>></math>L(B), L(A)<math>\leqslant</math>L(B) и L(A)<math><</math>L(B).

Функции длины: LEN(A) и LEN_TRIM(A). Первая возвращает длину строки А (количество символов), вторая - возвращает длину строки без завершающих пробелов, если они имеются.

Функции преобразования: TRIM(A), ADJUSTL(A) и ADJUSTR(A), REPEAT(A,N). Функция TRIM(A) возвращает строку A без завершающих пробелов. Функции ADJUSTL(A) и ADJUSTR(A) выравнивают строку (удаляют пробелы) слева и справа соответственно. Функция REPEAT(A,N) возвращает N копий строки А.

Функции поиска в строке: SCAN(A,B,[back]), INDEX(A,B,[back]), VERIFY(A,B,[back]). Факультативный параметр back определяет направление поиска: по умолчанию слева (для back=.false.) направо (для back=.true.).

Функция SCAN определяет номер позиции в строке A (слева или справа) первого найденного символа из списка-строки В. Если результат отрицательный, то функция возвратит целочисленный 0. Функция INDEX определяет номер позиции, с которой впервые начинается полное вхождение строки В в строку А. Причём поиск может вестись как слева, так и справа, но номер позиции исчисляется всегда слева, от начала строки. При неудачном поиске функция возвратит 0. Функция VERIFY обратна функции INDEX. Так, VERIFY возвращает номер позиции такого символа строки A, которого нет в строке-маске В. Если же все (различные) символы строки А присутствуют в строке-маске В, то функция вернёт 0.

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

Стандарты Фортрана, начиная с версии 2003, предусматривают возможность работы с символами Юникода.

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

В Фортране для совместимости с программами, написанными на языке Си, существует понятие Си-строки, которая задаётся добавлением символа с после кавычки: А='Это Си-строка'с. Нулевая строка будет задана так: А='\0'c.

Подпрограммы (процедуры и функции)

Подпрограммы в Фортране существовали с самого первого стандарта и поныне являются одним из главных инструментов программирования.[5]

В Фортране вызов подпрограмм, функций и передача их параметров происходят исключительно по ссылке (а не по значению). Поэтому подпрограмма может изменить переданный ей аргумент в главной программе, если специальным образом это не предотвратить. Такой механизм позволяет сделать естественной нотацию при записи математических формул и сохранить при этом высокое быстродействие при работе с большими массивами данных.[12]

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

Стандарт языка позволяет осуществлять перегрузку процедур и операций посредством родового интерфейса, объединяя различные процедуры (оперирующая каждая, например, целыми, действительными, комплексными числами и символьными переменными) под одним (родовым) именем. В этом случае в главной программе достаточно обратиться к родовой процедуре, а характер выполняемых операций будет зависеть от типа данных, предложенных процедуре для обработки. По такому принципу сделаны все встроенные функции и подпрограммы, например, COS(x). Перегрузка процедур, функций и операторов (причём символы перегруженных операторов программист может предложить свои, помимо встроенных) распространяется не только на встроенные типы данных, но и на типы, определённые программистом.[7]

Виды подпрограмм

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

Подпрограмма определяется оператором описания Subroutine имя_подпрограммы (список формальных аргументов), функция — оператором Function имя_функции (список формальных аргументов).

Вызов подпрограммы осуществляется оператором Call имя_подпрограммы (список фактических аргументов). Вызов функции осуществляется по имени с указанием списка фактических аргументов и без использования какого-либо специального оператора.

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

Чистые процедуры и функции (pure subroutine [function]) — введённые стандартом F’95 процедуры и функции, не имеющие побочных эффектов. Чистая функция должна возвращать значение и не должна изменять ни одного из своих входных параметров и/или глобальных данных; чистая процедура должна изменять только те параметры, которые явно указаны как результирующие (выходные) посредством атрибута intent(out или inout)). Возможность побочных эффектов в Фортране (то есть, в конечном итоге, возможность изменения переменных в главной программе через подпрограмму) — побочное следствие быстрого метода передачи по адресу.

Чистые программные единицы не могут содержать операторов В/В (WRITE и READ) во внешние файлы и устройства, включая клавиатуру и экран, а также операторов паузы и останова программы.

Все встроенные функции и подпрограммы Фортрана, в том числе математические (кроме обращающихся к операционной системе, функций даты и времени, а также датчиков случайных чисел) являются чистыми, то есть не создают побочных эффектов. Чистые функции введены с целью повышения культуры программирования и повышения эффективности распараллеливания алгоритмов[13][6].

Аргументы подпрограмм

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

Аргументы подразделяются на формальные и фактические. Аргументы заключаются в скобки после имени подпрограммы и разделяются запятыми. Имена фактических и формальных аргументов могут совпадать.

Формальные аргументы — это аргументы подпрограммы (функции), указанные при её описании. При отсутствии аргументов у подпрограммы, скобки могут быть опущены. У функции скобки расставляются и при отсутствии формальных аргументов. Формальный пареметр-процедура называется формальной процедурой.

Фактические аргументы — это аргументы, передаваемые подпрограмме или функции для выполнения при её вызове. Функция без аргументов вызывается с пустым списком в скобках, подпрограмма — без скобок.

Формальные и фактические аргументы должны быть согласованы. Типы аргументов и разновидности их вида должны быть одинаковыми, массиву должен соответствовать массив (или сечение массива) той же конфигурации.

Существуют массивы, перенимающие конфигурацию и перенимающие размер как формальные аргументы процедур. Массив, перенимающий конфигурацию — это формальный аргумент-массив, который наследует конфигурацию соответствующего ему фактического массива. У такого массива при его объявлении задаётся размерность (совпадающая с размерностью фактического аргумента-массива) и опускаются верхние границы. По умолчанию нижние границы равны 1, но могут быть заданы произвольными. Число и значение элементов массива, перенимающего конфигурацию, точно наследуются от фактического аргумента-массива. Массив, перенимающий размер — это оставленный для совместимости более ранний, свойственый языку Fortran'77, способ описания наследующих массивов. У таких массивов наследуется только последнее измерение, верхняя граница которого описывается звёздочкой (*). При этом формальный и фактический массивы-аргументы могут иметь разную размерность. Массивы, перенимающие конфигурацию и размер, не могут быть динамическими или быть указателями. Процедуры, имеющие наследующие массивы, должны иметь явный интерфейс.

Строки-формальные аргументы также могут наследовать (перенимать) длину у соответствующего фактического аргумента-строки. Строки, перенимающие длину, описываются посредством символа *: Character (Len = *) имя_строки. При явном задании длины строки, длина строки-формального аргумента не может быть больше соответствующего фактического аргумента-строки.

Аргументы бывают позиционными и ключевыми. Позиционные формальные и фактические аргументы связываются друг с другом по порядку их расположения в списке аргументов, который должен совпадать. Ключевые — по имени ключа, который совпадает с именем формального аргумента. Ключевые позволяют нарушить порядок следования аргументов или пропустить часть из них. Так, для подпрограммы с заголовком Subroutine ONE (A, B, C, D) вызов может быть таким: Call ONE (D=Z, C=Y, B=X, A=W), где W, X, Y, Z — фактические аргументы.

Ключевые аргументы позволяют иметь необязательные аргументы, которые могут быть опущены. В этом случае необязательные аргументы должны иметь атрибут Optional. Например, если задано Optional C, D, то в этом случае возможен вызов Call ONE (B=X, A=W).

Процедуры с необязательными параметрами должны иметь явный интерфейс.

Работа с массивами

Массивы — центральный пункт философии Фортрана. Все конструкции языка, данные, программные единицы, операторы, встроенные функции, циклы созданы и создаются для эффективной обработки прежде всего массивов. Фортран по мере своего развития следует принципу максимального, насколько это возможно, ухода от детального (поэлементного) описания и обработки массивов. Особенно это эффективно при обработке многомерных массивов (предельная размерность массивов стандарта F2008 — 15). Такой взгляд на массивы не был свойственен ранним версиям языка; первые элементы обобщённого подхода к массивам появились в FORTRAN77; развиваются они и поныне.

Массивы бывают статические и динамические. Динамические разделяются на размещаемые и автоматические (образуемые при вызове подпрограммы). Элементы двумерного массива в Фортране размещаются по столбцам, а не по строкам, как, например, в Си. Таким образом, быстрее всего изменяется первый индекс массива. Поэтому для эффективной работы с массивами во вложенных циклах следует индексировать внутренние циклы левыми индексами, а внешние — правыми. По умолчанию присваивание, ввод, вывод и инициализация массивов осуществляются по столбцам.

do k=1,10
 do j=1,20
  do i=1,100
arr(i,j,k)=25 ! правильно
brr(k,j,i)=0  ! работоспособно, но медленнее в несколько раз

end do; end do; end do

Массивы могут быть нулевого размера (в том числе, если нижняя граница превосходит верхнюю). Индексами границ массивов могут быть любые целые числа. По умолчанию нижняя граница равна 1.

Real, allocatable::  ArR(:,:,:)  ! объявление размещаемого динамического действительного массива 
Integer, allocatable:: ArI(:), ArSI(2,5)  ! целых динамического и статического массивов
Character(32), allocatable:: ArC(:), ArC2(20) ! динамического массива строк длиной 32 символа и статического массива строк

Allocate(ArR(-74:0,8,1:3), ArI(0), ArC(1:-1))  ! размещение динамических массивов
print *, size(ArR), size(ArI), size(ArC), size(ArSI)    ! 1800    0    0    10

ArC2(17)(5:27)='Это присваивание строки' ! В строку номер 17 будет записано ␣ ␣ ␣ ␣ Это␣ присваивание␣ строки␣ ␣ ␣ ␣ ␣
...

Сечения массивов, операторы FORALL и WHERE

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

Real:: arr(I1:I2,J1:J2,K1:K2), arr1(I1:I2,J1:J2,K1:K2), arr2(I1:I2,J1:J2,K1:K2)
Real:: frr(100), frr1(10)/1,2,3,3*4,4*5/
                ! или
Real:: frr1(10)=(/1,2,3,4,4,4,5,5,5,5/)

...
arr=1.  ! присваивание массива (встроенная перегрузка для оператора присваивания)
arr1=Sin(arr)+arr ! элементная функция sin применяется к каждому элементу массива

arr2(I1:I2:1,J1:J2:2,K2:K1:-4)=arr1(I1:I2:1,J1:J2:2,K2:K1:-4) ! присваивание элементов с шагом 1, 2 и -4 (назад), заданное индексным триплетом

frr=(/(J, J=1,100)/) ! присваивание одномерного массива посредством циклического списка

Forall(i=I1:I2, j=J1:J2, k=K1:K2, arr(i,j,k)>0.)  brr(i,j,k)=Log(arr(i,j,k))  ! замена циклов и условных операторов и конструкций. Маскирование присваивания (маска — arr(i,j,k)>0.)

Forall(i=1:N, j=1:N, k=1:N) crr(i,j,k)=Sin(0.5*(i+j)-k)    ! расширение возможностей сечений

Forall(i=1:100) ! конструкция Forall для нескольких операторов присваивания
 drr(i,i)=0.    ! доступ к диагонали матрицы
 err(i,i,i)=1.  ! и диагонали трёхмерного массива
End Forall

Возможны менее очевидные операции:

Integer V(-2:2,1:5)

V=reshape(source=(/(i, i=1,25)/), shape=(/5,5/)) ! инициализация массива порядковыми номерами с помощью конструктора массива и функции переформирования   
	print *, V   ! Вывод в DOS-окно будет произведён по строкам        
! 1           2           3           4           5 — 1-й столбец
! 6           7           8           9          10 — 2-й 
! 11          12         13          14          15 — 3-й
! 16          17         18          19          20 — 4-й
! 21          22         23          24          25 — 5-й

V(2,3:4)=V(-1:0,1) ! Повернуть кусочек массива
	print *, V   ! Вывод в DOS-окно будет произведён по строкам
! 1           2           3           4           5
! 6           7           8           9          10
! 11          12         13          14          2      замена в 3-ем столбце 15 на 2 
! 16          17         18          19          3      замена в 4-м  столбце 20 на 3
! 21          22         23          24          25

Возможности оператора и конструкции FORALL, введённого стандартом F’95, шире возможностей оператора и конструкции WHERE, однако последний в некоторых случаях логического ветвления позволяет упростить код ввиду наличия альтернативы ELSEWHERE, избегая вложенных условных операторов и сложносоставленных массивов-масок.

Оператор и конструкция FORALL допускает использование только чистых процедур и функций. При маскировании присваивания в операторах WHERE, FORALL, а также в специальных встроенных функциях для массивов (например, SUM) логический массив-маска вычисляется до присваивания и позволяет заменять циклы с логическими условиями внутри них, что позволяет избежать дополнительной работы для предсказателя переходов микропроцессора.

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

Integer vi(5)/7,7,7,3,8/, vj(4)/1,2,3,10/  ! инициализация массивов - векторных индексов
Real arr(20,20), brr(10,10) 
brr=0.; arr=1.              
         ! векторные индексы можно задавать и внутри использующего их массива
brr((/8,6,2,1,4/),vj)=arr(vi,vj) ! размерность векторных индексов должна совпадать слева и справа, а их значения - не выходить за пределы границ использующих их массивов
               ! размер векторных индексов может быть меньше размера рабочих массивов

Встроенные функции для массивов

В современном Фортране имеется большое количество специализированных встроенных функций для работы с численными и символьными массивами (помимо разобранных выше общих способов). Аргументами функций выступают численный и/или символьный массив array, логический массив mask (являющийся, например, условием array>0) и измерение dim массива array, формирующее (если задан аргумент dim) сечение массива вдоль одного из измерений с номером dim. Массив array может быть, если не указано иное, целочисленным, содержать действительные или комплексные числа. Если массив-маска не задан, то его значение считается тождественно истинным. Логический массив mask, если задан, должен иметь ту же форму, что и массив array, либо скарярное значение .TRUE..
Основная масса функций введена стандартом F’90.

ALL(mask[, dim]) — логическая функция; возвращает «истина», если все элементы логического массива mask истинны (вдоль факультативного измерения dim) и наоборот в противном случае.
ANY(mask[, dim]) — логическая функция; имеет значение «истина», если хотя бы один элемент логического массива mask истинен (вдоль факультативного измерения dim).
COUNT(mask[, dim]) — целочисленная функция; результат равен числу истинных элементов массива mask (вдоль факультативного измерения dim).

MAXLOC(array[, mask][, dim]), MINLOC(array[, mask][, dim]),
 — целочисленные функции, возвращающие соответственно индекс максимального и минимального элемента (или индексы максимальных и минимальных элементов) вдоль факультативного измерения dim для элементов, удовлетворяющих массиву-маске. Функции возвращают индекс первого по порядку следования элемента массива array. Если аргумент функций dim не задан, или если array — одномерный массив, то результат записывается в одномерный массив.
Для многомерных массивов array результат записывается в массив с рангом, на единицу меньшим ранга массива array (исключается измерение с номером dim).

Значения индексов отсчитываются по порядку от нижних границ массива. То есть в случае, если номер нижней границы массива array отличается от единицы, то для доступа к максимальному или минимальному элементу массива следует прибавить к результату функций MAXLOC и MINLOC разницу между индексом нижней границы и единицей.

MAXVAL(array[, mask][, dim]), MINVAL(array[, mask][, dim]) — функции поиска максимального и минимального элемента соответственно в массиве array для элементов, удовлетворяющих логическому массиву-маске mask вдоль факультативного измерения dim. Результат функции — такого же типа и разновидности, что и массив array. Массив array может быть только вещественным или целочисленным.
Для одномерного массива array или при отсутствии аргумента dim результатом является скаляр, иначе — массив с рангом, на единицу меньшим ранга массива array.

FINDLOC(array, value[, dim][, mask]) — целочисленная функция, возвращающая индекс равного value элемента массива array. Введена стандартом F2008. Искомые элементы массива удовлетворяют логическому массиву-маске mask вдоль факультативного измерения dim. Тип аргумента value должен совпадать с типом массива array и может быть любого встроенного типа (включая комплексный, логический или символьный). Остальные свойства функции аналогичны свойствам функций MAXLOC и MINLOC.

Начиная со стандарта F2003, функции MAXLOC и MINLOC, как и функция FINDLOC, оперируют также и символьными данными.

SUM(array[, mask][, dim]) и PRODUCT(array[, mask][, dim]) осуществляют соответственно суммирование и умножение элементов массива. Смысл аргументов функций SUM и PRODUCT тот же, что и у выше рассмотренных функций.
Функция PRODUCT оперирует комплексными данными, начиная со стандарта F2003.

DOT_PRODUCT(vector_1, vector_2) осуществляет скалярное произведение по правилам линейной алгебры векторов vector_1 и vector_2 (одномерных массивов) одинакового размера. Одномерные массивы vector_1 и vector_2 могут содержать данные любого численного и логического типа. Вектора vector_1 и vector_2 могут быть либо оба численными, либо оба — логическими.

MATMUL(matrix_a, matrix_b) — встроенная функция матричного перемножения. Перемножает две матрицы, матрицу на вектор, вектор на матрицу по правилам линейной алгебры. Аргументы функции matrix_a и matrix_b — двумерные или одномерные численные (любых встроенных численных типов) или логические массивы. Аргументами функции не могут быть одновременно два вектора: один из аргументов обязан быть матрицей (двумерным массивом). Число элементов первого (либо единственного) измерения массива matrix_b должно быть равно числу элементов последнего измерения массива matrix_a. Введена стандартом F’90.
В некоторых случаях при расчёте произведения вектор-столбца на вектор-строку, требующего при использовании функции MATMUL дополнительного преобразовывания векторов в матрицы формы (/m,1/) и (/1,n/), эффективность MATMUL по данным Бартеньева[7] заметно уступает обычному вложенному циклу.
По тестам NASA[14] для произведения матриц (двумерных массивов) быстродействие MATMUL компилятора фирмы Intel при использовании полной оптимизации [parallel.uran.ru/node/28 -O3] существенно (в некоторых случаях — на порядок) превышает быстродействие вложенных циклов, хотя для матриц размером ~1000×1000 и больше несколько уступает быстродействию подпрограммы [www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f_source.html DGEMM] библиотеки [www.netlib.org/lapack/explore-html/index.html LAPAK]. В то же время для матриц ~100×100 и меньше MATMUL превосходит по скорости DGEMM. Компилятор Фортрана фирмы IBM, начиная с версии F’90, использует для MATMUL алгоритм Винограда — Штрассена со сложностью <math>{\rm O}(n^{2.81})</math>[15]. Отметим, что стандартом алгоритмические реализации математических функций обычно не оговариваются и остаются на усмотрение разработчика компилятора.

MERGE(t_source, f_source, mask) — функция, создающая новый массив под управлением маски-массива mask из элементов массивов t_source и f_source той же формы и того же размера, что и исходные массивы. Массивы-аргументы и массив-результат могут быть любого встроенного типа и совпадать по типу данных, размеру и форме.
Если элемент mask есть истина (.ТRUE.), то соответствующий ему элемент массива-результата равен соответствующему элементу массива t_source; если ложь (.FALSE.) — то элементу массива f_source.
Аргументами функции могут быть скаляры; в этом случае, например, MERGE(a,0,c>=0)=a·Θ(с), где Θ(с) — целочисленная функция Хэвисайда.

MOVE_ALLOC(from, to) — встроенная подпрограмма, позволяющая динамически переразмещать ранее размещённый динамический массив to с новыми границами и размером, как у динамического массива from. При этом данные из массива from копируются в массив to. Тип данных и ранг массивов from и to должны совпадать. После переразмещения массива to массив from освобождает память и становится неразмещённым. Может быть полезна в численных методах с изменяющейся дискретизацией задачи (многосеточных и адаптивных методах).
Введена стандартом F2003.

TRANSPOSE(matrix) — функция, транспонирующая (меняющая местами строки и столбцы) двумерную матрицу.

В современном Фортране предусмотрены встроенные функции упаковки и распаковки многомерного массива в одномерный массив (и из одномерного массива, соответственно) под управлением логического условия для повышения быстродействия и экономии памяти.

PACK(array, mask [, vector]) — функция; упаковывает многомерный массив любого типа array в одномерный массив-вектор под управлением логического массива mask. Необязательный одномерный массив vector должен иметь тот же тип данных, что и array, причём количество элементов в vector, если он задан, должно быть не меньше числа истинных элементов в mask. Если mask — скаляр со значением .TRUE., то число элементов в массиве vector, если он задан, должно быть не меньше, чем общее число элементов в array.
Результатом функции будет одномерный массив того же типа, что и array. Длина результата будет равна длине вектора vector, если он задан; если нет — то числу истинных элементов в массиве-маске mask. Если vector не задан, а mask — скаляр со значением истина, то длина результирующего одномерного вектора равна числу элементов массива array.
Результирующий массив последовательно заполняется элементами массива array (в порядке их размещения в компьютерной памяти), удовлетворяющими истинным значениям массива mask. При этом, если задан vector, из него выбираются недостающие (возможно) элементы в массиве-результате, причём начиная с индекса, следующего за последним по порядку истинным элементом массива array.
Так, для массива <math>A=\begin{bmatrix} 0 & 1 & 0 \\ 2 & 0 & 0 \\ 0 & 0 & 3 \end{bmatrix}</math>
результатом функции PACK(A, mask=A.NE.0) будет одномерный массив <math>\begin{bmatrix} 1 & 2 & 3 \end{bmatrix}</math>. Если дополнительно задан вектор <math>V=\begin{bmatrix} 77 & -95 & 0 & 4 & 5 & 6 & 7 & 8 & 9 & 10 \end{bmatrix}</math>, то результатом PACK(A, mask=A.NE.0, V) будет
<math>\begin{bmatrix} 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 \end{bmatrix}</math>.

Файлы и операции ввода-вывода

Фортран обладает богатым встроенным инструментарием для операций ввода-вывода, в том числе для больших массивов данных. Файлы в Фортране бывают внутренние и внешние.

Внутренний файл — это любой массив, символьная строка или подстрока. Внутренние файлы всегда открыты по умолчанию. Внешний файл — это любой файл, внешний по отношению к выполняемой программе.

С обоими типами файлов используются одни и те же операторы записи WRITE и чтения READ. Внутренние файлы используются для преобразований число-строка-число и для создания смешанных числовых и символьных записей.

Character(15) string
Real:: xyz=-123.456
Integer intg

Write(string,*) xyz            ! Запись в строку числа -123.456
Print *, 'string=', string     ! string=␣ -123.4560␣ ␣

Read (string,'(I6)') intg      ! Чтение из строки целого числа
Print *, 'intg=', intg         ! intg=␣ -123
!...

Внешние файлы подразделяются на форматные (текстовые, CR- и LF-потоки), бинарные (двоичные), непосредственно отображающие оперативную память, и неформатные (не двоичные). Кроме того, они могут быть файлами прямого и последовательного доступов с записями фиксированной и переменной длины (переменной — только для последовательных файлов), а также сегментированными записями (для очень больших неформатных последовательных файлов). Таким образом, Фортран позволяет создавать и обрабатывать довольно большое количество видов файлов — 15 способов организации. Максимальный размер одной записи — 2,14·<math>10^{9}</math> байт.

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

При открытии последовательного файла его можно позиционировать в начало, в конец (перед записью «конец файла»), что позволяет добавлять данные по мере их накопления без затирания ранее введённых, а также либо в начало, либо в конец в зависимости от ранее определённого статуса файла (был он открыт ранее или нет).

Работа с памятью

В современных стандартах языка (начиная с Fortran'90 или Fortran'95) возможна работа с тремя видами динамических массивов (автоматическими, размещаемыми и массивами-ссылками), указателями, ссылками; имеются встроенные процедуры для работы с памятью напрямую и процедуры для побитовых операций.

Стандарты языка предполагают автоматическое освобождение оперативной памяти, занятой любым типом динамического массива, после завершения работы программы или подпрограммы (процедуры, функции), даже если программистом освобождение не было выполнено явно. Это позволяет избегать возникновения утечек памяти при работе с динамическими массивами средствами Фортрана (при использовании указателей и в других случаях утечки возможны) при небрежности программирования[7].

Атоматические массивы (размещаемые компилятором) создаются при вызове подпрограммы и являются её локальными объектами. Их границы определяются всякий раз при обращении к процедуре; при этом при выходе из неё они уничтожаются, а память — очищается. Автоматические массивы во время выполнения программы находятся в стеке, размещаемые (с помощью оператора ALLOCATE) — в куче[13].

Указатели Фортрана аналогичны указателям Си,[7] однако при решении вычислительных задач и разработке математических алгоритмов они в большинстве случаев с успехом заменяются иными инструментами Фортрана.

Управляющие конструкции

Начиная со стандарта F'90 конструкция условного перехода IF THEN — ELSEIF THEN — END IF не отличается от подобных конструкций в других современных языках и заменила т.н. "арифметический" IF с метками, признанный устаревшим[6]. Существует и более простая форма условного оператора: IF(логическое условие) оператор, где исполняемый оператор должен быть единственным после оператора IF, например, Goto метка.

Конструкция выбора SELECT CASE - CASE - CASE DEFAULT - END SELECT, наоборот, отличается от конструкции SWITCH - CASE в Си-подобных языках[16], языке Java[17][18] и несколько напоминает по возможностям оператор CASE в Паскале[19].
Integer N(74)             ! выражение выбора - это целое, логическое, символьное выражение или
...                       ! целочисленый массив, или массив символов с любым ненулевым числом элементов 

nameSC: Select Case(N(i)) ! nameSC - имя конструкции, N(i) - элемент массива
        Case(:-5)         ! выполняется для всех N(i), меньших либо равных -5 с шагом +1
        ! Блок 1
        
        Case(-3,-1,0,2)   ! для переменной N(i), равной -3, -1, 0, 2
        ! Блок 2
        
        Case(50:100)      ! для N(i) в диапазоне от 50 до 100 включительно (шаг +1)
        ! Блок 3
        
        Case(400)         ! для N(i)=400
        ! Блок 4
        
        Case(1,20:30,35)  ! для N(i)=1, N(i) в диапазоне от 20 до 30 включительно и N(i)=35
        ! Блок 5
        
        Case Default      ! для всех прочих ситуаций. Case Default - опциональный, необязательный оператор
        ! Блок по умолчанию
        End Select nameSC
Если значение переменной N, называемой выражением выбора, совпадёт со списком селекторов (списком значений или диапазоном) в к-либо опрераторе CASE, например, в третьем для N=70, то, после выполнения соответствующего блока операторов Блок-3, происходит выход из конструкции SELECT CASE,[7][13] и операторов прерывания (типа BREAK) не требуется. Оператор CASE DEFAULT, равно как и имя конструкции, не является необходимым. Диапазоны в списках селекторов различных операторов CASE не должны пересекаться или иметь хотя бы одного общего элемента.

В качестве выражения выбора (N) может быть элемент целочисленного массива.

Диапазоны в списках селекторов применяются только для целых или для символов, по возрастанию от нижней границы к верхней; для символов - по возрастанию их кодов.

В современном Фортране существуют две формы циклов со счётчиком итераций: традиционная конструкция DO-ENDDO и цикл с меткой. Последняя признана устаревшей конструкцией начиная со стандарта F'90, однако до сих пор входит в стандарты. Для вложенных циклов с большим уровнем вложенности последняя форма может быть более лаконичной:
! Синтаксис устаревшей конструкции цикла
    do 1 k=1,10      ! 1- это метка конца цикла
      do 1 j=1,20    ! метка может быть одинаковой для вложенных циклов
        do 1 i=1,100
    arr(i,j,k)=25    
1   Continue         ! метка может стоять только перед к-либо опрератором

L1: do k=1,10        ! однако современная запись допускает именовать циклы,
  L2: do j=1,20    ! что больше соответствует концепции структурного программирования
    L3: do i=1,100 ! и позволяет легче избежать ошибок 
    arr(i,j,k)=25    
    end do L3
  end do L2
end do L1
Заголовок цикла со счётчиком имеет следующий полный вид:
name: DO I=N1, N2, dN  ! имя конструкции необязательно
...                    ! N1 - начальное значение счётчика, N2 - конечное, dN - шаг (параметры цикла)
      END DO name      ! Параметры цикла - целые числа произвольного знака. dN не равно нулю.
Число выполнения тела цикла без прерывания равно Nс=max(int((N2-N1+dN)/dN), 0) и может быть равным нулю.

Например, цикл выполнится нуль раз, если N2<N1 и шаг положителен: dN>0. Если шаг отрицательный, dN<0, то цикл пройдёт в обратном порядке, при этом для выполнения цикла необходимо, чтобы N2<N1. Если шаг dN опущен, то по умолчанию он считается равным единице: dN=1.

Значение переменной цикла I после выхода из него всегда равно Nс+1, т.е. на единицу больше числа итераций цикла и не менее единицы: I≥1.

Возможен также цикл с условием DO WHILE(логическое условие) - END DO, и бесконечный цикл DO - END DO, имеющие стандартную форму.

Оператор CYCLE имя цикла прерывает текущую итерацию цикла и переходит к следующей итерации этого же цикла. Если имя цикла не указано, то выполняется прерывание итерации текущего цикла (в котором расположен оператор CYCLE).

Оператор EXIT имя цикла прерывает выполнение цикла с указанным именем и передаёт управление далее, а при отсутствии имени — прерывает текущий цикл (в который вложен оператор EXIT).

Операторы CYCLE и EXIT логически тождественны оператору GOTO (в соответствующих обстоятельствах), но существенно облегчают понимание и обслуживание кода программистом.

Компиляторы

С момента первоначальной разработки языка, компиляторы Фортрана производит фирма IBM. В настоящее время фирмой IBM поставляется оптимизирующий компилятор VS Fortran[20] для мэйнфреймов IBM System z, история развития различных версий которого восходит ещё к 1964 году, а также компилятор XL Fortran[21] для платформ на базе архитектуры PowerPC — AIX, Linux и суперкомпьютера Blue Gene (выпускалась также версия для Mac OS X, когда компьютеры Macintosh использовали процессоры PowerPC). Оба этих компилятора содержат очень сложные оптимизаторы, являющиеся результатом непрерывной научной работы специалистов IBM на протяжении полувека. На базе компилятора IBM Fortran XL фирмой Absoft, бизнес-партнёром IBM, создан и поставляется компилятор Absoft Pro Fortran для систем на базе процессоров PowerPC (Linux, Mac OS X) и Intel (Linux, Mac OS X, Windows)[22].

До 1997 крупным производителем компилятора Фортран для операционной системы Windows была корпорация «Microsoft». Впоследствии она отказалась от их разработки в связи с низкой прибыльностью. После этого компилятор поставляла фирма «DEC», вошедшая в 1998 году в состав «Compaq» и вместе с последней в 2002 году слившаяся с «HP». Дальнейшей разработкой этой версии компилятора стала заниматься фирма Intel, а компилятор называется Intel Fortran Compiler, который позволяет оптимизировать код под платформы Intel IA-32, x86_64 и IA-64.

Компания «DEC» поставляет компилятор, интегрированный в среду разработки Digital Visual Fortran, основанную на Microsoft Visual Studio. Наиболее известными продуктами этой линейки являются FPS 4.0 (Microsoft Fortran Power Station), DVF 5.0 и 6.0. Каждый компилятор может поддерживать несколько стандартов Фортрана. Слияния компаний явились причиной того, что последующие продукты появлялись на рынке под торговыми марками Compaq и HP. В настоящее время HP продаёт среду разработки версии 6.6 для Intel/win32. Поддержка Фортрана реализована также для всех высокопроизводительных платформ HP.

Другим крупным поставщиком систем разработки на Фортране является фирма «Lahey», предлагающая интегрированные решения для Windows и Linux.

Долгое время лучшим компилятором Фортрана для PC считался компилятор фирмы «Watcom», который был выделен в отдельный проект Open Watcom развивающий компилятор на открытой основе.

Среди бесплатных компиляторов Фортран следует выделить компилятор от бывшей Sun Microsystems (сейчас Oracle), входящий в состав Sun Studio, который генерирует эффективный код под SPARC, x86 и x86-64[23] и доступен для ОС Solaris, OpenSolaris и GNU/Linux.

Фонд свободного программного обеспечения GNU выпускал открытый компилятор Фортрана-77 g77, доступный практически для любой платформы и полностью совместимый с GCC. Сейчас ему на смену пришёл компилятор GFortran, в котором реализованы практически все конструкции стандарта Фортран-95 и многие конструкции стандартов Фортран-2003 и Фортран-2008. Он также полностью обратно совместим с Фортран-77. Также существует независимый проект g95 по созданию на основе GCC компилятора Фортран-95.

Взаимодействие с другими языками

Многие системы программирования позволяют компоновать полученные в результате трансляции фортрановской программы объектные файлы с объектными файлами, полученными от компиляторов с других языков, что позволяет создавать более гибкие и многофункциональные приложения. Для языка Фортран также доступно большое количество библиотек, содержащих как подпрограммы решения классических вычислительных задач (LAPACK, IMSL, BLAS), задач организации распределённых вычислений (MPI, PVM), так и задач построения графических интерфейсов (Quickwin, FORTRAN/TK) или доступа к СУБД (Oracle).

Фортран в СССР

Фортран в СССР появился позже, чем на Западе, поскольку поначалу в СССР более перспективным языком считался Алгол. Во внедрении Фортрана большую роль сыграло общение советских физиков (в частности Леонтович А. Л.) со своими коллегами из CERN, где в 1960-х годах почти все расчёты велись с использованием программ на Фортране[24].

Первый советский компилятор с Фортрана был создан в 1967 году для машины Минск-2, однако он не получил большой известности. Широкое внедрение Фортрана началось после создания в 1968 году компилятора ФОРТРАН-ДУБНА для машины БЭСМ-6. Фортран — основной язык для АСВТ и СМ ЭВМ, часто использовался вместе с препроцессором РАТФОР. Машины ЕС ЭВМ, появившиеся в 1972 году, уже изначально имели транслятор Фортрана («позаимствованный» с IBM/360 вместе с другим программным обеспечением).

В 1970x в ИПМ была разработана графическая библиотека ГРАФОР («ГРАфическое расширение ФОРтрана»)[25].

В конце 80-х — начале 1990-х физик Андрей Зарецкий создал серию детских книжек, одним из главных героев которых был профессор Фортран, доступным языком объяснявший детям основы компьютерной грамотности и программирования[26][27].

Напишите отзыв о статье "Фортран"

Примечания

  1. В.Э. Карпов. КЛАССИЧЕСКАЯ ТЕОРИЯ КОМПИЛЯТОРОВ. — Учебное пособие. 2-е изд.. — Москва, 2011. — 91 с. — ISBN 5–230–16344–5.
  2. См., например: [netlib.org Netlib Repository at UTK and ORNL]
  3. [www.roguewave.com/products-services/imsl-numerical-libraries/fortran-libraries IMSL Fortran Numerical Library | Rogue Wave]
  4. Бартеньев О.В. 1-3 // Фортран для профессионалов. Математическая библиотека ISML. — Москва: Диалог-МИФИ, 2001. — ч1 - 448 с., ч2 - 320 с., ч3 - 368 с. — 3000 экз. — ISBN 5-86404-157-2 (ч.2), 5-86404-18-58-0 (ч.3).
  5. 1 2 3 4 5 6 7 8 9 А. М. Горелик. [num-meth.srcc.msu.ru/zhurnal/tom_2008/v9r208.html Эволюция языка программирования Фортран (1957—2007) и перспективы его развития//Вычислительные методы и программирование, 2008, Т. 9, с. 53-71]
  6. 1 2 3 Горелик А.М. Часть 2, Главы 14-20 // Программирование на современном Фортране. — Москва: Финансы и статистика, 2006. — 352 с. — 3000 экз. — ISBN 5-279-03066-X.
  7. 1 2 3 4 5 6 7 8 Бартеньев О.В. [lib.mexmat.ru/books/8926 Современный Фортран]. — М.: Диалог МИФИ, 2005. — ISBN 5-86404-113-0.
  8. А. М. Горелик. [www.ict.edu.ru/ft/004318/prep2002_70.pdf объектно-ориентированное программирвание на современном Фортране]
  9. Горелик А.М. 3. Введение в параллельное программирование на Фортране // Программирование на современном Фортране. — Москва: Финансы и статистика, 2006. — 352 с. — ISBN 5-279-03066-X.
  10. 1 2 С. Д. Алгазин, В. В. Кондратьев. Программирование на Visual Fortran. — М.: «Диалог МИФИ», 2008. — 448 с. — ISBN 5-8243-0759-8.
  11. Горелик А. М.[parallel.ru/tech/tech_dev/f2000.html Новости]
  12. Трой Дуглас, Douglas A. Troy. пер. с англ. Б. А. Кузьмина. Программирование на языке Си для персонального компьютера IBM PC = Complete C Language Programming for the IBM-PC / И. В. Емелин. — Москва: "Радио и связь", 1991. — 432 с. — ISBN 5-256-00707-6, 0-316-85311-9.
  13. 1 2 3 Горелик А.М. Часть 1, Главы 1-13 // Программирование на современном Фортране. — 1. — Москва: Финансы и статистика, 2006. — 352 с. — ISBN 5-279-03066-X.
  14. Thomas Clune. [modelingguru.nasa.gov/docs/DOC-1762 Comparing Python, NumPy, Matlab, Fortran, etc.]. NASA Modeling Guru (Nov 2, 2009 10:33 AM).
  15. Craig C. Douglas, Gordon Slishman [doi.acm.org/10.1145/181498.181500 Variants of Matrix-matrix Multiplication for Fortran-90] // SIGNUM Newsl.. — 1994-04-01. — Т. 29, вып. 2. — С. 4–6. — ISSN [www.sigla.ru/table.jsp?f=8&t=3&v0=0163-5778&f=1003&t=1&v1=&f=4&t=2&v2=&f=21&t=3&v3=&f=1016&t=3&v4=&f=1016&t=3&v5=&bf=4&b=&d=0&ys=&ye=&lng=&ft=&mt=&dt=&vol=&pt=&iss=&ps=&pe=&tr=&tro=&cc=UNION&i=1&v=tagged&s=0&ss=0&st=0&i18n=ru&rlf=&psz=20&bs=20&ce=hJfuypee8JzzufeGmImYYIpZKRJeeOeeWGJIZRrRRrdmtdeee88NJJJJpeeefTJ3peKJJ3UWWPtzzzzzzzzzzzzzzzzzbzzvzzpy5zzjzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzztzzzzzzzbzzzzzzzzzzzzzzzzzzzzzzzzzzzvzzzzzzyeyTjkDnyHzTuueKZePz9decyzzLzzzL*.c8.NzrGJJvufeeeeeJheeyzjeeeeJh*peeeeKJJJJJJJJJJmjHvOJJJJJJJJJfeeeieeeeSJJJJJSJJJ3TeIJJJJ3..E.UEAcyhxD.eeeeeuzzzLJJJJ5.e8JJJheeeeeeeeeeeeyeeK3JJJJJJJJ*s7defeeeeeeeeeeeeeeeeeeeeeeeeeSJJJJJJJJZIJJzzz1..6LJJJJJJtJJZ4....EK*&debug=false 0163-5778]. — DOI:10.1145/181498.181500.
  16. [msdn.microsoft.com/ru-ru/library/k0t5wee3.aspx Оператор switch (C++)]. msdn.microsoft.com. Проверено 5 июня 2016.
  17. [learn.javascript.ru/switch Конструкция switch]. learn.javascript.ru. Проверено 5 июня 2016.
  18. [habrahabr.ru/post/174065/ Тонкости оператора switch]. habrahabr.ru. Проверено 5 июня 2016.
  19. [www.freepascal.org/docs-html/ref/refsu57.html The Case statement]. www.freepascal.org. Проверено 5 июня 2016.
  20. [www.ibm.com/software/awdtools/fortran/vsfortran/ VS FORTRAN]
  21. [www.ibm.com/software/products/ru/ru/xlfortran-linux XL Fortran for Linux]
  22. [www.absoft.com/Absoft%20Compilers.htm Absoft Pro Fortran Compiler Suites General Overview]
  23. [developers.sun.com/sunstudio/products/benchmarks.html Sun Studio — Benchmarks]
  24. [samlib.ru/r/rastorguew_a_a/fortran.shtml Очерк Александра Расторгуева о появлении Фортрана в Дубне]
  25. [www.graphicon.ru/ru/russia/history История компьютерной графики в России]
  26. [www.sutki.net/culture/17088-entsiklopediya_professora_fortrana.html Энциклопедия профессора Фортрана], Sutki.net (29 января 2008). [web.archive.org/web/20120310055828/www.sutki.net/culture/17088-entsiklopediya_professora_fortrana.html Архивировано] из первоисточника 10 марта 2012. Проверено 11 июня 2013.
  27. Кириленко, Александр. [noos.com.ua/ru/post/2984 Эстония вводит программирование в школах начиная с младших классов], Ноосфера (7 сентября 2009). [web.archive.org/web/20120909193515/www.noos.com.ua/ru/post/2984 Архивировано] из первоисточника 9 сентября 2012. Проверено 11 июня 2013.

Литература

  • [bitsavers.informatik.uni-stuttgart.de/pdf/ibm/704/704_FortranProgRefMan_Oct56.pdf Fortran. Programmer's Reference Manual. The Fortran Automatic Coding System for the IBM 704 EDPM]. — IBM Corp., 1956. — 51 с.
  • Роберт У. Себеста. 2.3. Компьютер IBM 704 и язык Фортран // Основные концепции языков программирования = Concepts of Programming Languages / Пер. с англ. — 5-е изд. — М.: Вильямс, 2001. — С. 63—69. — 672 с. — 5000 экз. — ISBN 5-8459-0192-8 (рус.), ISBN 0-201-75295-6 (англ.).
Стандарты
  • [www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=50459 ISO/IEC 1539-1:2010 Information technology — Programming languages — Fortran — Part 1: Base language]
  • [www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=26934 ISO/IEC 1539-2:2000 Information technology — Programming languages — Fortran — Part 2: Varying length character strings]
  • ГОСТ 23056-78 — Язык программирования Фортран
  • ГОСТ 23057-78 — Язык программирования Базисный Фортран

Ссылки

  • [www.visual.2000.ru/develop/fortran/index.htm О старом Фортране замолвлено слово…]
  • [rsusu1.rnd.runnet.ru/develop/fortran/prof77/prof77.html Professional Programmer’s Guide to Fortran77]
  • [www.thefreecountry.com/compilers/fortran.shtml Компиляторы ФОРТРАН, распространяемые бесплатно]
  • F2C — Fortran to C Translator
  • [www.nytimes.com/2007/03/19/obituaries/20cnd-backus.html?ex=1332043200&en=adde3ee5a1875330&ei=5124&partner=permalink&exprod=permalink 19 марта 2007 года умер создатель языка FORTRAN]
  • [gcc.gnu.org/fortran/ gfortran] — Компилятор Фортрана 95/2003/2008, часть Коллекции компиляторов GNU
  • [habrahabr.ru/company/intel/blog/266079/ «Фортран – живее всех живых» или «Что нового у дедушки ifort»] — Хабрахабр, блог компании Intel.
  • [habrahabr.ru/company/intel/blog/254235/ «Нежданчики» языка Фортран] — Хабрахабр, блог компании Intel.
  • [habrahabr.ru/company/intel/blog/255305/ Fortran 2003: учим Фортран и С дружить] — Хабрахабр, блог компании Intel.
  • [habrahabr.ru/company/intel/blog/203618/ Знакомство с Coarray Fortran: будем параллельны?] — Хабрахабр, блог компании Intel.
  • [progopedia.ru/language/fortran/ Статья Фортран] в Прогопедии — энциклопедии языков программирования (рус.)

Отрывок, характеризующий Фортран

Волшебница, скажи, какая сила
Влечет меня к покинутым струнам;
Какой огонь ты в сердце заронила,
Какой восторг разлился по перстам!
Пел он страстным голосом, блестя на испуганную и счастливую Наташу своими агатовыми, черными глазами.
– Прекрасно! отлично! – кричала Наташа. – Еще другой куплет, – говорила она, не замечая Николая.
«У них всё то же» – подумал Николай, заглядывая в гостиную, где он увидал Веру и мать с старушкой.
– А! вот и Николенька! – Наташа подбежала к нему.
– Папенька дома? – спросил он.
– Как я рада, что ты приехал! – не отвечая, сказала Наташа, – нам так весело. Василий Дмитрич остался для меня еще день, ты знаешь?
– Нет, еще не приезжал папа, – сказала Соня.
– Коко, ты приехал, поди ко мне, дружок! – сказал голос графини из гостиной. Николай подошел к матери, поцеловал ее руку и, молча подсев к ее столу, стал смотреть на ее руки, раскладывавшие карты. Из залы всё слышались смех и веселые голоса, уговаривавшие Наташу.
– Ну, хорошо, хорошо, – закричал Денисов, – теперь нечего отговариваться, за вами barcarolla, умоляю вас.
Графиня оглянулась на молчаливого сына.
– Что с тобой? – спросила мать у Николая.
– Ах, ничего, – сказал он, как будто ему уже надоел этот всё один и тот же вопрос.
– Папенька скоро приедет?
– Я думаю.
«У них всё то же. Они ничего не знают! Куда мне деваться?», подумал Николай и пошел опять в залу, где стояли клавикорды.
Соня сидела за клавикордами и играла прелюдию той баркароллы, которую особенно любил Денисов. Наташа собиралась петь. Денисов восторженными глазами смотрел на нее.
Николай стал ходить взад и вперед по комнате.
«И вот охота заставлять ее петь? – что она может петь? И ничего тут нет веселого», думал Николай.
Соня взяла первый аккорд прелюдии.
«Боже мой, я погибший, я бесчестный человек. Пулю в лоб, одно, что остается, а не петь, подумал он. Уйти? но куда же? всё равно, пускай поют!»
Николай мрачно, продолжая ходить по комнате, взглядывал на Денисова и девочек, избегая их взглядов.
«Николенька, что с вами?» – спросил взгляд Сони, устремленный на него. Она тотчас увидала, что что нибудь случилось с ним.
Николай отвернулся от нее. Наташа с своею чуткостью тоже мгновенно заметила состояние своего брата. Она заметила его, но ей самой так было весело в ту минуту, так далека она была от горя, грусти, упреков, что она (как это часто бывает с молодыми людьми) нарочно обманула себя. Нет, мне слишком весело теперь, чтобы портить свое веселье сочувствием чужому горю, почувствовала она, и сказала себе:
«Нет, я верно ошибаюсь, он должен быть весел так же, как и я». Ну, Соня, – сказала она и вышла на самую середину залы, где по ее мнению лучше всего был резонанс. Приподняв голову, опустив безжизненно повисшие руки, как это делают танцовщицы, Наташа, энергическим движением переступая с каблучка на цыпочку, прошлась по середине комнаты и остановилась.
«Вот она я!» как будто говорила она, отвечая на восторженный взгляд Денисова, следившего за ней.
«И чему она радуется! – подумал Николай, глядя на сестру. И как ей не скучно и не совестно!» Наташа взяла первую ноту, горло ее расширилось, грудь выпрямилась, глаза приняли серьезное выражение. Она не думала ни о ком, ни о чем в эту минуту, и из в улыбку сложенного рта полились звуки, те звуки, которые может производить в те же промежутки времени и в те же интервалы всякий, но которые тысячу раз оставляют вас холодным, в тысячу первый раз заставляют вас содрогаться и плакать.
Наташа в эту зиму в первый раз начала серьезно петь и в особенности оттого, что Денисов восторгался ее пением. Она пела теперь не по детски, уж не было в ее пеньи этой комической, ребяческой старательности, которая была в ней прежде; но она пела еще не хорошо, как говорили все знатоки судьи, которые ее слушали. «Не обработан, но прекрасный голос, надо обработать», говорили все. Но говорили это обыкновенно уже гораздо после того, как замолкал ее голос. В то же время, когда звучал этот необработанный голос с неправильными придыханиями и с усилиями переходов, даже знатоки судьи ничего не говорили, и только наслаждались этим необработанным голосом и только желали еще раз услыхать его. В голосе ее была та девственная нетронутость, то незнание своих сил и та необработанная еще бархатность, которые так соединялись с недостатками искусства пенья, что, казалось, нельзя было ничего изменить в этом голосе, не испортив его.
«Что ж это такое? – подумал Николай, услыхав ее голос и широко раскрывая глаза. – Что с ней сделалось? Как она поет нынче?» – подумал он. И вдруг весь мир для него сосредоточился в ожидании следующей ноты, следующей фразы, и всё в мире сделалось разделенным на три темпа: «Oh mio crudele affetto… [О моя жестокая любовь…] Раз, два, три… раз, два… три… раз… Oh mio crudele affetto… Раз, два, три… раз. Эх, жизнь наша дурацкая! – думал Николай. Всё это, и несчастье, и деньги, и Долохов, и злоба, и честь – всё это вздор… а вот оно настоящее… Hy, Наташа, ну, голубчик! ну матушка!… как она этот si возьмет? взяла! слава Богу!» – и он, сам не замечая того, что он поет, чтобы усилить этот si, взял втору в терцию высокой ноты. «Боже мой! как хорошо! Неужели это я взял? как счастливо!» подумал он.
О! как задрожала эта терция, и как тронулось что то лучшее, что было в душе Ростова. И это что то было независимо от всего в мире, и выше всего в мире. Какие тут проигрыши, и Долоховы, и честное слово!… Всё вздор! Можно зарезать, украсть и всё таки быть счастливым…


Давно уже Ростов не испытывал такого наслаждения от музыки, как в этот день. Но как только Наташа кончила свою баркароллу, действительность опять вспомнилась ему. Он, ничего не сказав, вышел и пошел вниз в свою комнату. Через четверть часа старый граф, веселый и довольный, приехал из клуба. Николай, услыхав его приезд, пошел к нему.
– Ну что, повеселился? – сказал Илья Андреич, радостно и гордо улыбаясь на своего сына. Николай хотел сказать, что «да», но не мог: он чуть было не зарыдал. Граф раскуривал трубку и не заметил состояния сына.
«Эх, неизбежно!» – подумал Николай в первый и последний раз. И вдруг самым небрежным тоном, таким, что он сам себе гадок казался, как будто он просил экипажа съездить в город, он сказал отцу.
– Папа, а я к вам за делом пришел. Я было и забыл. Мне денег нужно.
– Вот как, – сказал отец, находившийся в особенно веселом духе. – Я тебе говорил, что не достанет. Много ли?
– Очень много, – краснея и с глупой, небрежной улыбкой, которую он долго потом не мог себе простить, сказал Николай. – Я немного проиграл, т. е. много даже, очень много, 43 тысячи.
– Что? Кому?… Шутишь! – крикнул граф, вдруг апоплексически краснея шеей и затылком, как краснеют старые люди.
– Я обещал заплатить завтра, – сказал Николай.
– Ну!… – сказал старый граф, разводя руками и бессильно опустился на диван.
– Что же делать! С кем это не случалось! – сказал сын развязным, смелым тоном, тогда как в душе своей он считал себя негодяем, подлецом, который целой жизнью не мог искупить своего преступления. Ему хотелось бы целовать руки своего отца, на коленях просить его прощения, а он небрежным и даже грубым тоном говорил, что это со всяким случается.
Граф Илья Андреич опустил глаза, услыхав эти слова сына и заторопился, отыскивая что то.
– Да, да, – проговорил он, – трудно, я боюсь, трудно достать…с кем не бывало! да, с кем не бывало… – И граф мельком взглянул в лицо сыну и пошел вон из комнаты… Николай готовился на отпор, но никак не ожидал этого.
– Папенька! па…пенька! – закричал он ему вслед, рыдая; простите меня! – И, схватив руку отца, он прижался к ней губами и заплакал.

В то время, как отец объяснялся с сыном, у матери с дочерью происходило не менее важное объяснение. Наташа взволнованная прибежала к матери.
– Мама!… Мама!… он мне сделал…
– Что сделал?
– Сделал, сделал предложение. Мама! Мама! – кричала она. Графиня не верила своим ушам. Денисов сделал предложение. Кому? Этой крошечной девочке Наташе, которая еще недавно играла в куклы и теперь еще брала уроки.
– Наташа, полно, глупости! – сказала она, еще надеясь, что это была шутка.
– Ну вот, глупости! – Я вам дело говорю, – сердито сказала Наташа. – Я пришла спросить, что делать, а вы мне говорите: «глупости»…
Графиня пожала плечами.
– Ежели правда, что мосьё Денисов сделал тебе предложение, то скажи ему, что он дурак, вот и всё.
– Нет, он не дурак, – обиженно и серьезно сказала Наташа.
– Ну так что ж ты хочешь? Вы нынче ведь все влюблены. Ну, влюблена, так выходи за него замуж! – сердито смеясь, проговорила графиня. – С Богом!
– Нет, мама, я не влюблена в него, должно быть не влюблена в него.
– Ну, так так и скажи ему.
– Мама, вы сердитесь? Вы не сердитесь, голубушка, ну в чем же я виновата?
– Нет, да что же, мой друг? Хочешь, я пойду скажу ему, – сказала графиня, улыбаясь.
– Нет, я сама, только научите. Вам всё легко, – прибавила она, отвечая на ее улыбку. – А коли бы видели вы, как он мне это сказал! Ведь я знаю, что он не хотел этого сказать, да уж нечаянно сказал.
– Ну всё таки надо отказать.
– Нет, не надо. Мне так его жалко! Он такой милый.
– Ну, так прими предложение. И то пора замуж итти, – сердито и насмешливо сказала мать.
– Нет, мама, мне так жалко его. Я не знаю, как я скажу.
– Да тебе и нечего говорить, я сама скажу, – сказала графиня, возмущенная тем, что осмелились смотреть, как на большую, на эту маленькую Наташу.
– Нет, ни за что, я сама, а вы слушайте у двери, – и Наташа побежала через гостиную в залу, где на том же стуле, у клавикорд, закрыв лицо руками, сидел Денисов. Он вскочил на звук ее легких шагов.
– Натали, – сказал он, быстрыми шагами подходя к ней, – решайте мою судьбу. Она в ваших руках!
– Василий Дмитрич, мне вас так жалко!… Нет, но вы такой славный… но не надо… это… а так я вас всегда буду любить.
Денисов нагнулся над ее рукою, и она услыхала странные, непонятные для нее звуки. Она поцеловала его в черную, спутанную, курчавую голову. В это время послышался поспешный шум платья графини. Она подошла к ним.
– Василий Дмитрич, я благодарю вас за честь, – сказала графиня смущенным голосом, но который казался строгим Денисову, – но моя дочь так молода, и я думала, что вы, как друг моего сына, обратитесь прежде ко мне. В таком случае вы не поставили бы меня в необходимость отказа.
– Г'афиня, – сказал Денисов с опущенными глазами и виноватым видом, хотел сказать что то еще и запнулся.
Наташа не могла спокойно видеть его таким жалким. Она начала громко всхлипывать.
– Г'афиня, я виноват перед вами, – продолжал Денисов прерывающимся голосом, – но знайте, что я так боготво'ю вашу дочь и всё ваше семейство, что две жизни отдам… – Он посмотрел на графиню и, заметив ее строгое лицо… – Ну п'ощайте, г'афиня, – сказал он, поцеловал ее руку и, не взглянув на Наташу, быстрыми, решительными шагами вышел из комнаты.

На другой день Ростов проводил Денисова, который не хотел более ни одного дня оставаться в Москве. Денисова провожали у цыган все его московские приятели, и он не помнил, как его уложили в сани и как везли первые три станции.
После отъезда Денисова, Ростов, дожидаясь денег, которые не вдруг мог собрать старый граф, провел еще две недели в Москве, не выезжая из дому, и преимущественно в комнате барышень.
Соня была к нему нежнее и преданнее чем прежде. Она, казалось, хотела показать ему, что его проигрыш был подвиг, за который она теперь еще больше любит его; но Николай теперь считал себя недостойным ее.
Он исписал альбомы девочек стихами и нотами, и не простившись ни с кем из своих знакомых, отослав наконец все 43 тысячи и получив росписку Долохова, уехал в конце ноября догонять полк, который уже был в Польше.



После своего объяснения с женой, Пьер поехал в Петербург. В Торжке на cтанции не было лошадей, или не хотел их смотритель. Пьер должен был ждать. Он не раздеваясь лег на кожаный диван перед круглым столом, положил на этот стол свои большие ноги в теплых сапогах и задумался.
– Прикажете чемоданы внести? Постель постелить, чаю прикажете? – спрашивал камердинер.
Пьер не отвечал, потому что ничего не слыхал и не видел. Он задумался еще на прошлой станции и всё продолжал думать о том же – о столь важном, что он не обращал никакого .внимания на то, что происходило вокруг него. Его не только не интересовало то, что он позже или раньше приедет в Петербург, или то, что будет или не будет ему места отдохнуть на этой станции, но всё равно было в сравнении с теми мыслями, которые его занимали теперь, пробудет ли он несколько часов или всю жизнь на этой станции.
Смотритель, смотрительша, камердинер, баба с торжковским шитьем заходили в комнату, предлагая свои услуги. Пьер, не переменяя своего положения задранных ног, смотрел на них через очки, и не понимал, что им может быть нужно и каким образом все они могли жить, не разрешив тех вопросов, которые занимали его. А его занимали всё одни и те же вопросы с самого того дня, как он после дуэли вернулся из Сокольников и провел первую, мучительную, бессонную ночь; только теперь в уединении путешествия, они с особенной силой овладели им. О чем бы он ни начинал думать, он возвращался к одним и тем же вопросам, которых он не мог разрешить, и не мог перестать задавать себе. Как будто в голове его свернулся тот главный винт, на котором держалась вся его жизнь. Винт не входил дальше, не выходил вон, а вертелся, ничего не захватывая, всё на том же нарезе, и нельзя было перестать вертеть его.
Вошел смотритель и униженно стал просить его сиятельство подождать только два часика, после которых он для его сиятельства (что будет, то будет) даст курьерских. Смотритель очевидно врал и хотел только получить с проезжего лишние деньги. «Дурно ли это было или хорошо?», спрашивал себя Пьер. «Для меня хорошо, для другого проезжающего дурно, а для него самого неизбежно, потому что ему есть нечего: он говорил, что его прибил за это офицер. А офицер прибил за то, что ему ехать надо было скорее. А я стрелял в Долохова за то, что я счел себя оскорбленным, а Людовика XVI казнили за то, что его считали преступником, а через год убили тех, кто его казнил, тоже за что то. Что дурно? Что хорошо? Что надо любить, что ненавидеть? Для чего жить, и что такое я? Что такое жизнь, что смерть? Какая сила управляет всем?», спрашивал он себя. И не было ответа ни на один из этих вопросов, кроме одного, не логического ответа, вовсе не на эти вопросы. Ответ этот был: «умрешь – всё кончится. Умрешь и всё узнаешь, или перестанешь спрашивать». Но и умереть было страшно.
Торжковская торговка визгливым голосом предлагала свой товар и в особенности козловые туфли. «У меня сотни рублей, которых мне некуда деть, а она в прорванной шубе стоит и робко смотрит на меня, – думал Пьер. И зачем нужны эти деньги? Точно на один волос могут прибавить ей счастья, спокойствия души, эти деньги? Разве может что нибудь в мире сделать ее и меня менее подверженными злу и смерти? Смерть, которая всё кончит и которая должна притти нынче или завтра – всё равно через мгновение, в сравнении с вечностью». И он опять нажимал на ничего не захватывающий винт, и винт всё так же вертелся на одном и том же месте.
Слуга его подал ему разрезанную до половины книгу романа в письмах m mе Suza. [мадам Сюза.] Он стал читать о страданиях и добродетельной борьбе какой то Аmelie de Mansfeld. [Амалии Мансфельд.] «И зачем она боролась против своего соблазнителя, думал он, – когда она любила его? Не мог Бог вложить в ее душу стремления, противного Его воле. Моя бывшая жена не боролась и, может быть, она была права. Ничего не найдено, опять говорил себе Пьер, ничего не придумано. Знать мы можем только то, что ничего не знаем. И это высшая степень человеческой премудрости».
Всё в нем самом и вокруг него представлялось ему запутанным, бессмысленным и отвратительным. Но в этом самом отвращении ко всему окружающему Пьер находил своего рода раздражающее наслаждение.
– Осмелюсь просить ваше сиятельство потесниться крошечку, вот для них, – сказал смотритель, входя в комнату и вводя за собой другого, остановленного за недостатком лошадей проезжающего. Проезжающий был приземистый, ширококостый, желтый, морщинистый старик с седыми нависшими бровями над блестящими, неопределенного сероватого цвета, глазами.
Пьер снял ноги со стола, встал и перелег на приготовленную для него кровать, изредка поглядывая на вошедшего, который с угрюмо усталым видом, не глядя на Пьера, тяжело раздевался с помощью слуги. Оставшись в заношенном крытом нанкой тулупчике и в валеных сапогах на худых костлявых ногах, проезжий сел на диван, прислонив к спинке свою очень большую и широкую в висках, коротко обстриженную голову и взглянул на Безухого. Строгое, умное и проницательное выражение этого взгляда поразило Пьера. Ему захотелось заговорить с проезжающим, но когда он собрался обратиться к нему с вопросом о дороге, проезжающий уже закрыл глаза и сложив сморщенные старые руки, на пальце одной из которых был большой чугунный перстень с изображением Адамовой головы, неподвижно сидел, или отдыхая, или о чем то глубокомысленно и спокойно размышляя, как показалось Пьеру. Слуга проезжающего был весь покрытый морщинами, тоже желтый старичек, без усов и бороды, которые видимо не были сбриты, а никогда и не росли у него. Поворотливый старичек слуга разбирал погребец, приготовлял чайный стол, и принес кипящий самовар. Когда всё было готово, проезжающий открыл глаза, придвинулся к столу и налив себе один стакан чаю, налил другой безбородому старичку и подал ему. Пьер начинал чувствовать беспокойство и необходимость, и даже неизбежность вступления в разговор с этим проезжающим.
Слуга принес назад свой пустой, перевернутый стакан с недокусанным кусочком сахара и спросил, не нужно ли чего.
– Ничего. Подай книгу, – сказал проезжающий. Слуга подал книгу, которая показалась Пьеру духовною, и проезжающий углубился в чтение. Пьер смотрел на него. Вдруг проезжающий отложил книгу, заложив закрыл ее и, опять закрыв глаза и облокотившись на спинку, сел в свое прежнее положение. Пьер смотрел на него и не успел отвернуться, как старик открыл глаза и уставил свой твердый и строгий взгляд прямо в лицо Пьеру.
Пьер чувствовал себя смущенным и хотел отклониться от этого взгляда, но блестящие, старческие глаза неотразимо притягивали его к себе.


– Имею удовольствие говорить с графом Безухим, ежели я не ошибаюсь, – сказал проезжающий неторопливо и громко. Пьер молча, вопросительно смотрел через очки на своего собеседника.
– Я слышал про вас, – продолжал проезжающий, – и про постигшее вас, государь мой, несчастье. – Он как бы подчеркнул последнее слово, как будто он сказал: «да, несчастье, как вы ни называйте, я знаю, что то, что случилось с вами в Москве, было несчастье». – Весьма сожалею о том, государь мой.
Пьер покраснел и, поспешно спустив ноги с постели, нагнулся к старику, неестественно и робко улыбаясь.
– Я не из любопытства упомянул вам об этом, государь мой, но по более важным причинам. – Он помолчал, не выпуская Пьера из своего взгляда, и подвинулся на диване, приглашая этим жестом Пьера сесть подле себя. Пьеру неприятно было вступать в разговор с этим стариком, но он, невольно покоряясь ему, подошел и сел подле него.
– Вы несчастливы, государь мой, – продолжал он. – Вы молоды, я стар. Я бы желал по мере моих сил помочь вам.
– Ах, да, – с неестественной улыбкой сказал Пьер. – Очень вам благодарен… Вы откуда изволите проезжать? – Лицо проезжающего было не ласково, даже холодно и строго, но несмотря на то, и речь и лицо нового знакомца неотразимо привлекательно действовали на Пьера.
– Но если по каким либо причинам вам неприятен разговор со мною, – сказал старик, – то вы так и скажите, государь мой. – И он вдруг улыбнулся неожиданно, отечески нежной улыбкой.
– Ах нет, совсем нет, напротив, я очень рад познакомиться с вами, – сказал Пьер, и, взглянув еще раз на руки нового знакомца, ближе рассмотрел перстень. Он увидал на нем Адамову голову, знак масонства.
– Позвольте мне спросить, – сказал он. – Вы масон?
– Да, я принадлежу к братству свободных каменьщиков, сказал проезжий, все глубже и глубже вглядываясь в глаза Пьеру. – И от себя и от их имени протягиваю вам братскую руку.
– Я боюсь, – сказал Пьер, улыбаясь и колеблясь между доверием, внушаемым ему личностью масона, и привычкой насмешки над верованиями масонов, – я боюсь, что я очень далек от пониманья, как это сказать, я боюсь, что мой образ мыслей насчет всего мироздания так противоположен вашему, что мы не поймем друг друга.
– Мне известен ваш образ мыслей, – сказал масон, – и тот ваш образ мыслей, о котором вы говорите, и который вам кажется произведением вашего мысленного труда, есть образ мыслей большинства людей, есть однообразный плод гордости, лени и невежества. Извините меня, государь мой, ежели бы я не знал его, я бы не заговорил с вами. Ваш образ мыслей есть печальное заблуждение.
– Точно так же, как я могу предполагать, что и вы находитесь в заблуждении, – сказал Пьер, слабо улыбаясь.
– Я никогда не посмею сказать, что я знаю истину, – сказал масон, всё более и более поражая Пьера своею определенностью и твердостью речи. – Никто один не может достигнуть до истины; только камень за камнем, с участием всех, миллионами поколений, от праотца Адама и до нашего времени, воздвигается тот храм, который должен быть достойным жилищем Великого Бога, – сказал масон и закрыл глаза.
– Я должен вам сказать, я не верю, не… верю в Бога, – с сожалением и усилием сказал Пьер, чувствуя необходимость высказать всю правду.
Масон внимательно посмотрел на Пьера и улыбнулся, как улыбнулся бы богач, державший в руках миллионы, бедняку, который бы сказал ему, что нет у него, у бедняка, пяти рублей, могущих сделать его счастие.
– Да, вы не знаете Его, государь мой, – сказал масон. – Вы не можете знать Его. Вы не знаете Его, оттого вы и несчастны.
– Да, да, я несчастен, подтвердил Пьер; – но что ж мне делать?
– Вы не знаете Его, государь мой, и оттого вы очень несчастны. Вы не знаете Его, а Он здесь, Он во мне. Он в моих словах, Он в тебе, и даже в тех кощунствующих речах, которые ты произнес сейчас! – строгим дрожащим голосом сказал масон.
Он помолчал и вздохнул, видимо стараясь успокоиться.
– Ежели бы Его не было, – сказал он тихо, – мы бы с вами не говорили о Нем, государь мой. О чем, о ком мы говорили? Кого ты отрицал? – вдруг сказал он с восторженной строгостью и властью в голосе. – Кто Его выдумал, ежели Его нет? Почему явилось в тебе предположение, что есть такое непонятное существо? Почему ты и весь мир предположили существование такого непостижимого существа, существа всемогущего, вечного и бесконечного во всех своих свойствах?… – Он остановился и долго молчал.
Пьер не мог и не хотел прерывать этого молчания.
– Он есть, но понять Его трудно, – заговорил опять масон, глядя не на лицо Пьера, а перед собою, своими старческими руками, которые от внутреннего волнения не могли оставаться спокойными, перебирая листы книги. – Ежели бы это был человек, в существовании которого ты бы сомневался, я бы привел к тебе этого человека, взял бы его за руку и показал тебе. Но как я, ничтожный смертный, покажу всё всемогущество, всю вечность, всю благость Его тому, кто слеп, или тому, кто закрывает глаза, чтобы не видать, не понимать Его, и не увидать, и не понять всю свою мерзость и порочность? – Он помолчал. – Кто ты? Что ты? Ты мечтаешь о себе, что ты мудрец, потому что ты мог произнести эти кощунственные слова, – сказал он с мрачной и презрительной усмешкой, – а ты глупее и безумнее малого ребенка, который бы, играя частями искусно сделанных часов, осмелился бы говорить, что, потому что он не понимает назначения этих часов, он и не верит в мастера, который их сделал. Познать Его трудно… Мы веками, от праотца Адама и до наших дней, работаем для этого познания и на бесконечность далеки от достижения нашей цели; но в непонимании Его мы видим только нашу слабость и Его величие… – Пьер, с замиранием сердца, блестящими глазами глядя в лицо масона, слушал его, не перебивал, не спрашивал его, а всей душой верил тому, что говорил ему этот чужой человек. Верил ли он тем разумным доводам, которые были в речи масона, или верил, как верят дети интонациям, убежденности и сердечности, которые были в речи масона, дрожанию голоса, которое иногда почти прерывало масона, или этим блестящим, старческим глазам, состарившимся на том же убеждении, или тому спокойствию, твердости и знанию своего назначения, которые светились из всего существа масона, и которые особенно сильно поражали его в сравнении с своей опущенностью и безнадежностью; – но он всей душой желал верить, и верил, и испытывал радостное чувство успокоения, обновления и возвращения к жизни.
– Он не постигается умом, а постигается жизнью, – сказал масон.
– Я не понимаю, – сказал Пьер, со страхом чувствуя поднимающееся в себе сомнение. Он боялся неясности и слабости доводов своего собеседника, он боялся не верить ему. – Я не понимаю, – сказал он, – каким образом ум человеческий не может постигнуть того знания, о котором вы говорите.
Масон улыбнулся своей кроткой, отеческой улыбкой.
– Высшая мудрость и истина есть как бы чистейшая влага, которую мы хотим воспринять в себя, – сказал он. – Могу ли я в нечистый сосуд воспринять эту чистую влагу и судить о чистоте ее? Только внутренним очищением самого себя я могу до известной чистоты довести воспринимаемую влагу.
– Да, да, это так! – радостно сказал Пьер.
– Высшая мудрость основана не на одном разуме, не на тех светских науках физики, истории, химии и т. д., на которые распадается знание умственное. Высшая мудрость одна. Высшая мудрость имеет одну науку – науку всего, науку объясняющую всё мироздание и занимаемое в нем место человека. Для того чтобы вместить в себя эту науку, необходимо очистить и обновить своего внутреннего человека, и потому прежде, чем знать, нужно верить и совершенствоваться. И для достижения этих целей в душе нашей вложен свет Божий, называемый совестью.
– Да, да, – подтверждал Пьер.
– Погляди духовными глазами на своего внутреннего человека и спроси у самого себя, доволен ли ты собой. Чего ты достиг, руководясь одним умом? Что ты такое? Вы молоды, вы богаты, вы умны, образованы, государь мой. Что вы сделали из всех этих благ, данных вам? Довольны ли вы собой и своей жизнью?
– Нет, я ненавижу свою жизнь, – сморщась проговорил Пьер.
– Ты ненавидишь, так измени ее, очисти себя, и по мере очищения ты будешь познавать мудрость. Посмотрите на свою жизнь, государь мой. Как вы проводили ее? В буйных оргиях и разврате, всё получая от общества и ничего не отдавая ему. Вы получили богатство. Как вы употребили его? Что вы сделали для ближнего своего? Подумали ли вы о десятках тысяч ваших рабов, помогли ли вы им физически и нравственно? Нет. Вы пользовались их трудами, чтоб вести распутную жизнь. Вот что вы сделали. Избрали ли вы место служения, где бы вы приносили пользу своему ближнему? Нет. Вы в праздности проводили свою жизнь. Потом вы женились, государь мой, взяли на себя ответственность в руководстве молодой женщины, и что же вы сделали? Вы не помогли ей, государь мой, найти путь истины, а ввергли ее в пучину лжи и несчастья. Человек оскорбил вас, и вы убили его, и вы говорите, что вы не знаете Бога, и что вы ненавидите свою жизнь. Тут нет ничего мудреного, государь мой! – После этих слов, масон, как бы устав от продолжительного разговора, опять облокотился на спинку дивана и закрыл глаза. Пьер смотрел на это строгое, неподвижное, старческое, почти мертвое лицо, и беззвучно шевелил губами. Он хотел сказать: да, мерзкая, праздная, развратная жизнь, – и не смел прерывать молчание.
Масон хрипло, старчески прокашлялся и кликнул слугу.
– Что лошади? – спросил он, не глядя на Пьера.
– Привели сдаточных, – отвечал слуга. – Отдыхать не будете?
– Нет, вели закладывать.
«Неужели же он уедет и оставит меня одного, не договорив всего и не обещав мне помощи?», думал Пьер, вставая и опустив голову, изредка взглядывая на масона, и начиная ходить по комнате. «Да, я не думал этого, но я вел презренную, развратную жизнь, но я не любил ее, и не хотел этого, думал Пьер, – а этот человек знает истину, и ежели бы он захотел, он мог бы открыть мне её». Пьер хотел и не смел сказать этого масону. Проезжающий, привычными, старческими руками уложив свои вещи, застегивал свой тулупчик. Окончив эти дела, он обратился к Безухому и равнодушно, учтивым тоном, сказал ему:
– Вы куда теперь изволите ехать, государь мой?
– Я?… Я в Петербург, – отвечал Пьер детским, нерешительным голосом. – Я благодарю вас. Я во всем согласен с вами. Но вы не думайте, чтобы я был так дурен. Я всей душой желал быть тем, чем вы хотели бы, чтобы я был; но я ни в ком никогда не находил помощи… Впрочем, я сам прежде всего виноват во всем. Помогите мне, научите меня и, может быть, я буду… – Пьер не мог говорить дальше; он засопел носом и отвернулся.
Масон долго молчал, видимо что то обдумывая.
– Помощь дается токмо от Бога, – сказал он, – но ту меру помощи, которую во власти подать наш орден, он подаст вам, государь мой. Вы едете в Петербург, передайте это графу Вилларскому (он достал бумажник и на сложенном вчетверо большом листе бумаги написал несколько слов). Один совет позвольте подать вам. Приехав в столицу, посвятите первое время уединению, обсуждению самого себя, и не вступайте на прежние пути жизни. Затем желаю вам счастливого пути, государь мой, – сказал он, заметив, что слуга его вошел в комнату, – и успеха…
Проезжающий был Осип Алексеевич Баздеев, как узнал Пьер по книге смотрителя. Баздеев был одним из известнейших масонов и мартинистов еще Новиковского времени. Долго после его отъезда Пьер, не ложась спать и не спрашивая лошадей, ходил по станционной комнате, обдумывая свое порочное прошедшее и с восторгом обновления представляя себе свое блаженное, безупречное и добродетельное будущее, которое казалось ему так легко. Он был, как ему казалось, порочным только потому, что он как то случайно запамятовал, как хорошо быть добродетельным. В душе его не оставалось ни следа прежних сомнений. Он твердо верил в возможность братства людей, соединенных с целью поддерживать друг друга на пути добродетели, и таким представлялось ему масонство.


Приехав в Петербург, Пьер никого не известил о своем приезде, никуда не выезжал, и стал целые дни проводить за чтением Фомы Кемпийского, книги, которая неизвестно кем была доставлена ему. Одно и всё одно понимал Пьер, читая эту книгу; он понимал неизведанное еще им наслаждение верить в возможность достижения совершенства и в возможность братской и деятельной любви между людьми, открытую ему Осипом Алексеевичем. Через неделю после его приезда молодой польский граф Вилларский, которого Пьер поверхностно знал по петербургскому свету, вошел вечером в его комнату с тем официальным и торжественным видом, с которым входил к нему секундант Долохова и, затворив за собой дверь и убедившись, что в комнате никого кроме Пьера не было, обратился к нему:
– Я приехал к вам с поручением и предложением, граф, – сказал он ему, не садясь. – Особа, очень высоко поставленная в нашем братстве, ходатайствовала о том, чтобы вы были приняты в братство ранее срока, и предложила мне быть вашим поручителем. Я за священный долг почитаю исполнение воли этого лица. Желаете ли вы вступить за моим поручительством в братство свободных каменьщиков?
Холодный и строгий тон человека, которого Пьер видел почти всегда на балах с любезною улыбкою, в обществе самых блестящих женщин, поразил Пьера.
– Да, я желаю, – сказал Пьер.
Вилларский наклонил голову. – Еще один вопрос, граф, сказал он, на который я вас не как будущего масона, но как честного человека (galant homme) прошу со всею искренностью отвечать мне: отреклись ли вы от своих прежних убеждений, верите ли вы в Бога?
Пьер задумался. – Да… да, я верю в Бога, – сказал он.
– В таком случае… – начал Вилларский, но Пьер перебил его. – Да, я верю в Бога, – сказал он еще раз.
– В таком случае мы можем ехать, – сказал Вилларский. – Карета моя к вашим услугам.
Всю дорогу Вилларский молчал. На вопросы Пьера, что ему нужно делать и как отвечать, Вилларский сказал только, что братья, более его достойные, испытают его, и что Пьеру больше ничего не нужно, как говорить правду.
Въехав в ворота большого дома, где было помещение ложи, и пройдя по темной лестнице, они вошли в освещенную, небольшую прихожую, где без помощи прислуги, сняли шубы. Из передней они прошли в другую комнату. Какой то человек в странном одеянии показался у двери. Вилларский, выйдя к нему навстречу, что то тихо сказал ему по французски и подошел к небольшому шкафу, в котором Пьер заметил невиданные им одеяния. Взяв из шкафа платок, Вилларский наложил его на глаза Пьеру и завязал узлом сзади, больно захватив в узел его волоса. Потом он пригнул его к себе, поцеловал и, взяв за руку, повел куда то. Пьеру было больно от притянутых узлом волос, он морщился от боли и улыбался от стыда чего то. Огромная фигура его с опущенными руками, с сморщенной и улыбающейся физиономией, неверными робкими шагами подвигалась за Вилларским.
Проведя его шагов десять, Вилларский остановился.
– Что бы ни случилось с вами, – сказал он, – вы должны с мужеством переносить всё, ежели вы твердо решились вступить в наше братство. (Пьер утвердительно отвечал наклонением головы.) Когда вы услышите стук в двери, вы развяжете себе глаза, – прибавил Вилларский; – желаю вам мужества и успеха. И, пожав руку Пьеру, Вилларский вышел.
Оставшись один, Пьер продолжал всё так же улыбаться. Раза два он пожимал плечами, подносил руку к платку, как бы желая снять его, и опять опускал ее. Пять минут, которые он пробыл с связанными глазами, показались ему часом. Руки его отекли, ноги подкашивались; ему казалось, что он устал. Он испытывал самые сложные и разнообразные чувства. Ему было и страшно того, что с ним случится, и еще более страшно того, как бы ему не выказать страха. Ему было любопытно узнать, что будет с ним, что откроется ему; но более всего ему было радостно, что наступила минута, когда он наконец вступит на тот путь обновления и деятельно добродетельной жизни, о котором он мечтал со времени своей встречи с Осипом Алексеевичем. В дверь послышались сильные удары. Пьер снял повязку и оглянулся вокруг себя. В комнате было черно – темно: только в одном месте горела лампада, в чем то белом. Пьер подошел ближе и увидал, что лампада стояла на черном столе, на котором лежала одна раскрытая книга. Книга была Евангелие; то белое, в чем горела лампада, был человечий череп с своими дырами и зубами. Прочтя первые слова Евангелия: «Вначале бе слово и слово бе к Богу», Пьер обошел стол и увидал большой, наполненный чем то и открытый ящик. Это был гроб с костями. Его нисколько не удивило то, что он увидал. Надеясь вступить в совершенно новую жизнь, совершенно отличную от прежней, он ожидал всего необыкновенного, еще более необыкновенного чем то, что он видел. Череп, гроб, Евангелие – ему казалось, что он ожидал всего этого, ожидал еще большего. Стараясь вызвать в себе чувство умиленья, он смотрел вокруг себя. – «Бог, смерть, любовь, братство людей», – говорил он себе, связывая с этими словами смутные, но радостные представления чего то. Дверь отворилась, и кто то вошел.
При слабом свете, к которому однако уже успел Пьер приглядеться, вошел невысокий человек. Видимо с света войдя в темноту, человек этот остановился; потом осторожными шагами он подвинулся к столу и положил на него небольшие, закрытые кожаными перчатками, руки.
Невысокий человек этот был одет в белый, кожаный фартук, прикрывавший его грудь и часть ног, на шее было надето что то вроде ожерелья, и из за ожерелья выступал высокий, белый жабо, окаймлявший его продолговатое лицо, освещенное снизу.
– Для чего вы пришли сюда? – спросил вошедший, по шороху, сделанному Пьером, обращаясь в его сторону. – Для чего вы, неверующий в истины света и не видящий света, для чего вы пришли сюда, чего хотите вы от нас? Премудрости, добродетели, просвещения?
В ту минуту как дверь отворилась и вошел неизвестный человек, Пьер испытал чувство страха и благоговения, подобное тому, которое он в детстве испытывал на исповеди: он почувствовал себя с глазу на глаз с совершенно чужим по условиям жизни и с близким, по братству людей, человеком. Пьер с захватывающим дыханье биением сердца подвинулся к ритору (так назывался в масонстве брат, приготовляющий ищущего к вступлению в братство). Пьер, подойдя ближе, узнал в риторе знакомого человека, Смольянинова, но ему оскорбительно было думать, что вошедший был знакомый человек: вошедший был только брат и добродетельный наставник. Пьер долго не мог выговорить слова, так что ритор должен был повторить свой вопрос.
– Да, я… я… хочу обновления, – с трудом выговорил Пьер.
– Хорошо, – сказал Смольянинов, и тотчас же продолжал: – Имеете ли вы понятие о средствах, которыми наш святой орден поможет вам в достижении вашей цели?… – сказал ритор спокойно и быстро.
– Я… надеюсь… руководства… помощи… в обновлении, – сказал Пьер с дрожанием голоса и с затруднением в речи, происходящим и от волнения, и от непривычки говорить по русски об отвлеченных предметах.
– Какое понятие вы имеете о франк масонстве?
– Я подразумеваю, что франк масонство есть fraterienité [братство]; и равенство людей с добродетельными целями, – сказал Пьер, стыдясь по мере того, как он говорил, несоответственности своих слов с торжественностью минуты. Я подразумеваю…
– Хорошо, – сказал ритор поспешно, видимо вполне удовлетворенный этим ответом. – Искали ли вы средств к достижению своей цели в религии?
– Нет, я считал ее несправедливою, и не следовал ей, – сказал Пьер так тихо, что ритор не расслышал его и спросил, что он говорит. – Я был атеистом, – отвечал Пьер.
– Вы ищете истины для того, чтобы следовать в жизни ее законам; следовательно, вы ищете премудрости и добродетели, не так ли? – сказал ритор после минутного молчания.
– Да, да, – подтвердил Пьер.
Ритор прокашлялся, сложил на груди руки в перчатках и начал говорить:
– Теперь я должен открыть вам главную цель нашего ордена, – сказал он, – и ежели цель эта совпадает с вашею, то вы с пользою вступите в наше братство. Первая главнейшая цель и купно основание нашего ордена, на котором он утвержден, и которого никакая сила человеческая не может низвергнуть, есть сохранение и предание потомству некоего важного таинства… от самых древнейших веков и даже от первого человека до нас дошедшего, от которого таинства, может быть, зависит судьба рода человеческого. Но так как сие таинство такого свойства, что никто не может его знать и им пользоваться, если долговременным и прилежным очищением самого себя не приуготовлен, то не всяк может надеяться скоро обрести его. Поэтому мы имеем вторую цель, которая состоит в том, чтобы приуготовлять наших членов, сколько возможно, исправлять их сердце, очищать и просвещать их разум теми средствами, которые нам преданием открыты от мужей, потрудившихся в искании сего таинства, и тем учинять их способными к восприятию оного. Очищая и исправляя наших членов, мы стараемся в третьих исправлять и весь человеческий род, предлагая ему в членах наших пример благочестия и добродетели, и тем стараемся всеми силами противоборствовать злу, царствующему в мире. Подумайте об этом, и я опять приду к вам, – сказал он и вышел из комнаты.
– Противоборствовать злу, царствующему в мире… – повторил Пьер, и ему представилась его будущая деятельность на этом поприще. Ему представлялись такие же люди, каким он был сам две недели тому назад, и он мысленно обращал к ним поучительно наставническую речь. Он представлял себе порочных и несчастных людей, которым он помогал словом и делом; представлял себе угнетателей, от которых он спасал их жертвы. Из трех поименованных ритором целей, эта последняя – исправление рода человеческого, особенно близка была Пьеру. Некое важное таинство, о котором упомянул ритор, хотя и подстрекало его любопытство, не представлялось ему существенным; а вторая цель, очищение и исправление себя, мало занимала его, потому что он в эту минуту с наслаждением чувствовал себя уже вполне исправленным от прежних пороков и готовым только на одно доброе.
Через полчаса вернулся ритор передать ищущему те семь добродетелей, соответствующие семи ступеням храма Соломона, которые должен был воспитывать в себе каждый масон. Добродетели эти были: 1) скромность , соблюдение тайны ордена, 2) повиновение высшим чинам ордена, 3) добронравие, 4) любовь к человечеству, 5) мужество, 6) щедрость и 7) любовь к смерти.
– В седьмых старайтесь, – сказал ритор, – частым помышлением о смерти довести себя до того, чтобы она не казалась вам более страшным врагом, но другом… который освобождает от бедственной сей жизни в трудах добродетели томившуюся душу, для введения ее в место награды и успокоения.
«Да, это должно быть так», – думал Пьер, когда после этих слов ритор снова ушел от него, оставляя его уединенному размышлению. «Это должно быть так, но я еще так слаб, что люблю свою жизнь, которой смысл только теперь по немногу открывается мне». Но остальные пять добродетелей, которые перебирая по пальцам вспомнил Пьер, он чувствовал в душе своей: и мужество , и щедрость , и добронравие , и любовь к человечеству , и в особенности повиновение , которое даже не представлялось ему добродетелью, а счастьем. (Ему так радостно было теперь избавиться от своего произвола и подчинить свою волю тому и тем, которые знали несомненную истину.) Седьмую добродетель Пьер забыл и никак не мог вспомнить ее.
В третий раз ритор вернулся скорее и спросил Пьера, всё ли он тверд в своем намерении, и решается ли подвергнуть себя всему, что от него потребуется.
– Я готов на всё, – сказал Пьер.
– Еще должен вам сообщить, – сказал ритор, – что орден наш учение свое преподает не словами токмо, но иными средствами, которые на истинного искателя мудрости и добродетели действуют, может быть, сильнее, нежели словесные токмо объяснения. Сия храмина убранством своим, которое вы видите, уже должна была изъяснить вашему сердцу, ежели оно искренно, более нежели слова; вы увидите, может быть, и при дальнейшем вашем принятии подобный образ изъяснения. Орден наш подражает древним обществам, которые открывали свое учение иероглифами. Иероглиф, – сказал ритор, – есть наименование какой нибудь неподверженной чувствам вещи, которая содержит в себе качества, подобные изобразуемой.
Пьер знал очень хорошо, что такое иероглиф, но не смел говорить. Он молча слушал ритора, по всему чувствуя, что тотчас начнутся испытанья.
– Ежели вы тверды, то я должен приступить к введению вас, – говорил ритор, ближе подходя к Пьеру. – В знак щедрости прошу вас отдать мне все драгоценные вещи.
– Но я с собою ничего не имею, – сказал Пьер, полагавший, что от него требуют выдачи всего, что он имеет.
– То, что на вас есть: часы, деньги, кольца…
Пьер поспешно достал кошелек, часы, и долго не мог снять с жирного пальца обручальное кольцо. Когда это было сделано, масон сказал:
– В знак повиновенья прошу вас раздеться. – Пьер снял фрак, жилет и левый сапог по указанию ритора. Масон открыл рубашку на его левой груди, и, нагнувшись, поднял его штанину на левой ноге выше колена. Пьер поспешно хотел снять и правый сапог и засучить панталоны, чтобы избавить от этого труда незнакомого ему человека, но масон сказал ему, что этого не нужно – и подал ему туфлю на левую ногу. С детской улыбкой стыдливости, сомнения и насмешки над самим собою, которая против его воли выступала на лицо, Пьер стоял, опустив руки и расставив ноги, перед братом ритором, ожидая его новых приказаний.
– И наконец, в знак чистосердечия, я прошу вас открыть мне главное ваше пристрастие, – сказал он.
– Мое пристрастие! У меня их было так много, – сказал Пьер.
– То пристрастие, которое более всех других заставляло вас колебаться на пути добродетели, – сказал масон.
Пьер помолчал, отыскивая.
«Вино? Объедение? Праздность? Леность? Горячность? Злоба? Женщины?» Перебирал он свои пороки, мысленно взвешивая их и не зная которому отдать преимущество.
– Женщины, – сказал тихим, чуть слышным голосом Пьер. Масон не шевелился и не говорил долго после этого ответа. Наконец он подвинулся к Пьеру, взял лежавший на столе платок и опять завязал ему глаза.
– Последний раз говорю вам: обратите всё ваше внимание на самого себя, наложите цепи на свои чувства и ищите блаженства не в страстях, а в своем сердце. Источник блаженства не вне, а внутри нас…
Пьер уже чувствовал в себе этот освежающий источник блаженства, теперь радостью и умилением переполнявший его душу.


Скоро после этого в темную храмину пришел за Пьером уже не прежний ритор, а поручитель Вилларский, которого он узнал по голосу. На новые вопросы о твердости его намерения, Пьер отвечал: «Да, да, согласен», – и с сияющею детскою улыбкой, с открытой, жирной грудью, неровно и робко шагая одной разутой и одной обутой ногой, пошел вперед с приставленной Вилларским к его обнаженной груди шпагой. Из комнаты его повели по коридорам, поворачивая взад и вперед, и наконец привели к дверям ложи. Вилларский кашлянул, ему ответили масонскими стуками молотков, дверь отворилась перед ними. Чей то басистый голос (глаза Пьера всё были завязаны) сделал ему вопросы о том, кто он, где, когда родился? и т. п. Потом его опять повели куда то, не развязывая ему глаз, и во время ходьбы его говорили ему аллегории о трудах его путешествия, о священной дружбе, о предвечном Строителе мира, о мужестве, с которым он должен переносить труды и опасности. Во время этого путешествия Пьер заметил, что его называли то ищущим, то страждущим, то требующим, и различно стучали при этом молотками и шпагами. В то время как его подводили к какому то предмету, он заметил, что произошло замешательство и смятение между его руководителями. Он слышал, как шопотом заспорили между собой окружающие люди и как один настаивал на том, чтобы он был проведен по какому то ковру. После этого взяли его правую руку, положили на что то, а левою велели ему приставить циркуль к левой груди, и заставили его, повторяя слова, которые читал другой, прочесть клятву верности законам ордена. Потом потушили свечи, зажгли спирт, как это слышал по запаху Пьер, и сказали, что он увидит малый свет. С него сняли повязку, и Пьер как во сне увидал, в слабом свете спиртового огня, несколько людей, которые в таких же фартуках, как и ритор, стояли против него и держали шпаги, направленные в его грудь. Между ними стоял человек в белой окровавленной рубашке. Увидав это, Пьер грудью надвинулся вперед на шпаги, желая, чтобы они вонзились в него. Но шпаги отстранились от него и ему тотчас же опять надели повязку. – Теперь ты видел малый свет, – сказал ему чей то голос. Потом опять зажгли свечи, сказали, что ему надо видеть полный свет, и опять сняли повязку и более десяти голосов вдруг сказали: sic transit gloria mundi. [так проходит мирская слава.]
Пьер понемногу стал приходить в себя и оглядывать комнату, где он был, и находившихся в ней людей. Вокруг длинного стола, покрытого черным, сидело человек двенадцать, всё в тех же одеяниях, как и те, которых он прежде видел. Некоторых Пьер знал по петербургскому обществу. На председательском месте сидел незнакомый молодой человек, в особом кресте на шее. По правую руку сидел итальянец аббат, которого Пьер видел два года тому назад у Анны Павловны. Еще был тут один весьма важный сановник и один швейцарец гувернер, живший прежде у Курагиных. Все торжественно молчали, слушая слова председателя, державшего в руке молоток. В стене была вделана горящая звезда; с одной стороны стола был небольшой ковер с различными изображениями, с другой было что то в роде алтаря с Евангелием и черепом. Кругом стола было 7 больших, в роде церковных, подсвечников. Двое из братьев подвели Пьера к алтарю, поставили ему ноги в прямоугольное положение и приказали ему лечь, говоря, что он повергается к вратам храма.
– Он прежде должен получить лопату, – сказал шопотом один из братьев.
– А! полноте пожалуйста, – сказал другой.
Пьер, растерянными, близорукими глазами, не повинуясь, оглянулся вокруг себя, и вдруг на него нашло сомнение. «Где я? Что я делаю? Не смеются ли надо мной? Не будет ли мне стыдно вспоминать это?» Но сомнение это продолжалось только одно мгновение. Пьер оглянулся на серьезные лица окружавших его людей, вспомнил всё, что он уже прошел, и понял, что нельзя остановиться на половине дороги. Он ужаснулся своему сомнению и, стараясь вызвать в себе прежнее чувство умиления, повергся к вратам храма. И действительно чувство умиления, еще сильнейшего, чем прежде, нашло на него. Когда он пролежал несколько времени, ему велели встать и надели на него такой же белый кожаный фартук, какие были на других, дали ему в руки лопату и три пары перчаток, и тогда великий мастер обратился к нему. Он сказал ему, чтобы он старался ничем не запятнать белизну этого фартука, представляющего крепость и непорочность; потом о невыясненной лопате сказал, чтобы он трудился ею очищать свое сердце от пороков и снисходительно заглаживать ею сердце ближнего. Потом про первые перчатки мужские сказал, что значения их он не может знать, но должен хранить их, про другие перчатки мужские сказал, что он должен надевать их в собраниях и наконец про третьи женские перчатки сказал: «Любезный брат, и сии женские перчатки вам определены суть. Отдайте их той женщине, которую вы будете почитать больше всех. Сим даром уверите в непорочности сердца вашего ту, которую изберете вы себе в достойную каменьщицу». И помолчав несколько времени, прибавил: – «Но соблюди, любезный брат, да не украшают перчатки сии рук нечистых». В то время как великий мастер произносил эти последние слова, Пьеру показалось, что председатель смутился. Пьер смутился еще больше, покраснел до слез, как краснеют дети, беспокойно стал оглядываться и произошло неловкое молчание.
Молчание это было прервано одним из братьев, который, подведя Пьера к ковру, начал из тетради читать ему объяснение всех изображенных на нем фигур: солнца, луны, молотка. отвеса, лопаты, дикого и кубического камня, столба, трех окон и т. д. Потом Пьеру назначили его место, показали ему знаки ложи, сказали входное слово и наконец позволили сесть. Великий мастер начал читать устав. Устав был очень длинен, и Пьер от радости, волнения и стыда не был в состоянии понимать того, что читали. Он вслушался только в последние слова устава, которые запомнились ему.
«В наших храмах мы не знаем других степеней, – читал „великий мастер, – кроме тех, которые находятся между добродетелью и пороком. Берегись делать какое нибудь различие, могущее нарушить равенство. Лети на помощь к брату, кто бы он ни был, настави заблуждающегося, подними упадающего и не питай никогда злобы или вражды на брата. Будь ласков и приветлив. Возбуждай во всех сердцах огнь добродетели. Дели счастье с ближним твоим, и да не возмутит никогда зависть чистого сего наслаждения. Прощай врагу твоему, не мсти ему, разве только деланием ему добра. Исполнив таким образом высший закон, ты обрящешь следы древнего, утраченного тобой величества“.
Кончил он и привстав обнял Пьера и поцеловал его. Пьер, с слезами радости на глазах, смотрел вокруг себя, не зная, что отвечать на поздравления и возобновления знакомств, с которыми окружили его. Он не признавал никаких знакомств; во всех людях этих он видел только братьев, с которыми сгорал нетерпением приняться за дело.
Великий мастер стукнул молотком, все сели по местам, и один прочел поучение о необходимости смирения.
Великий мастер предложил исполнить последнюю обязанность, и важный сановник, который носил звание собирателя милостыни, стал обходить братьев. Пьеру хотелось записать в лист милостыни все деньги, которые у него были, но он боялся этим выказать гордость, и записал столько же, сколько записывали другие.
Заседание было кончено, и по возвращении домой, Пьеру казалось, что он приехал из какого то дальнего путешествия, где он провел десятки лет, совершенно изменился и отстал от прежнего порядка и привычек жизни.


На другой день после приема в ложу, Пьер сидел дома, читая книгу и стараясь вникнуть в значение квадрата, изображавшего одной своей стороною Бога, другою нравственное, третьею физическое и четвертою смешанное. Изредка он отрывался от книги и квадрата и в воображении своем составлял себе новый план жизни. Вчера в ложе ему сказали, что до сведения государя дошел слух о дуэли, и что Пьеру благоразумнее бы было удалиться из Петербурга. Пьер предполагал ехать в свои южные имения и заняться там своими крестьянами. Он радостно обдумывал эту новую жизнь, когда неожиданно в комнату вошел князь Василий.
– Мой друг, что ты наделал в Москве? За что ты поссорился с Лёлей, mon сher? [дорогой мoй?] Ты в заблуждении, – сказал князь Василий, входя в комнату. – Я всё узнал, я могу тебе сказать верно, что Элен невинна перед тобой, как Христос перед жидами. – Пьер хотел отвечать, но он перебил его. – И зачем ты не обратился прямо и просто ко мне, как к другу? Я всё знаю, я всё понимаю, – сказал он, – ты вел себя, как прилично человеку, дорожащему своей честью; может быть слишком поспешно, но об этом мы не будем судить. Одно ты помни, в какое положение ты ставишь ее и меня в глазах всего общества и даже двора, – прибавил он, понизив голос. – Она живет в Москве, ты здесь. Помни, мой милый, – он потянул его вниз за руку, – здесь одно недоразуменье; ты сам, я думаю, чувствуешь. Напиши сейчас со мною письмо, и она приедет сюда, всё объяснится, а то я тебе скажу, ты очень легко можешь пострадать, мой милый.
Князь Василий внушительно взглянул на Пьера. – Мне из хороших источников известно, что вдовствующая императрица принимает живой интерес во всем этом деле. Ты знаешь, она очень милостива к Элен.
Несколько раз Пьер собирался говорить, но с одной стороны князь Василий не допускал его до этого, с другой стороны сам Пьер боялся начать говорить в том тоне решительного отказа и несогласия, в котором он твердо решился отвечать своему тестю. Кроме того слова масонского устава: «буди ласков и приветлив» вспоминались ему. Он морщился, краснел, вставал и опускался, работая над собою в самом трудном для него в жизни деле – сказать неприятное в глаза человеку, сказать не то, чего ожидал этот человек, кто бы он ни был. Он так привык повиноваться этому тону небрежной самоуверенности князя Василия, что и теперь он чувствовал, что не в силах будет противостоять ей; но он чувствовал, что от того, что он скажет сейчас, будет зависеть вся дальнейшая судьба его: пойдет ли он по старой, прежней дороге, или по той новой, которая так привлекательно была указана ему масонами, и на которой он твердо верил, что найдет возрождение к новой жизни.
– Ну, мой милый, – шутливо сказал князь Василий, – скажи же мне: «да», и я от себя напишу ей, и мы убьем жирного тельца. – Но князь Василий не успел договорить своей шутки, как Пьер с бешенством в лице, которое напоминало его отца, не глядя в глаза собеседнику, проговорил шопотом:
– Князь, я вас не звал к себе, идите, пожалуйста, идите! – Он вскочил и отворил ему дверь.
– Идите же, – повторил он, сам себе не веря и радуясь выражению смущенности и страха, показавшемуся на лице князя Василия.
– Что с тобой? Ты болен?
– Идите! – еще раз проговорил дрожащий голос. И князь Василий должен был уехать, не получив никакого объяснения.
Через неделю Пьер, простившись с новыми друзьями масонами и оставив им большие суммы на милостыни, уехал в свои именья. Его новые братья дали ему письма в Киев и Одессу, к тамошним масонам, и обещали писать ему и руководить его в его новой деятельности.