Перейти к основному содержимому

5.16. История языка

Разработчику Архитектору

Fortran

История языка Fortran

Прежде чем рассматривать Fortran как технологический артефакт, необходимо обозначить контекст, в котором он возник. В середине 1950‑х годов программирование цифровых ЭВМ было делом исключительно низкоуровневым: инструкции задавались в машинных кодах или с помощью ассемблеров, тесно привязанных к конкретной архитектуре. Программисты работали с регистрами, адресами памяти, битовыми масками и последовательностями команд, оптимизируя каждый такт процессора вручную. При этом доминирующая задача ЭВМ того времени — не обработка текстов, не управление интерфейсами, а численные расчёты, в первую очередь — для аэрокосмической индустрии, ядерной физики и метеорологии.

Компания IBM, обладавшая на тот момент наиболее развитой линейкой научных вычислительных машин — в частности, IBM 704, — столкнулась с парадоксом: аппаратные возможности машины позволяли выполнять десятки тысяч арифметических операций в секунду, но разработка программ требовала колоссальных трудозатрат и была источником многочисленных ошибок. Программы писались на ассемблере, занимали сотни строк, а их отладка могла занимать недели. Отсюда возникла идея: создать машинно‑независимый, человеко‑читаемый способ описания математических вычислений, который бы автоматически транслировался в эффективный машинный код без существенной потери производительности.

Проект, получивший название Speedcoding, предшествовал Fortran и был реализован Джоном Бэкусом (John W. Backus) в 1953 году как интерпретатор для упрощённого языка математических выражений. Speedcoding продемонстрировал жизнеспособность идеи, но его интерпретируемая природа делала выполнение программ в 10–30 раз медленнее машинного кода — неприемлемый компромисс для научных расчётов. В ответ на это IBM инициировала в 1954 году проект с куда более амбициозной целью: разработать компилируемый язык высокого уровня, сопоставимый по эффективности с ручным кодированием, но при этом — экспрессивный, близкий к математической записи. Руководителем проекта вновь стал Бэкус, и 15 апреля 1954 года была опубликована предварительная спецификация нового языка под рабочим названием Formula Translation.


FORTRAN I (1957): рождение нового подхода

Первая реализация, получившая обозначение FORTRAN I, была завершена в апреле 1957 года и официально выпущена для машины IBM 704. Это событие считается отправной точкой эпохи высокоуровневых языков программирования — не только потому, что Fortran был первым из сохранившихся и массово применённых, но и потому, что он впервые продемонстрировал возможность автоматической оптимизации машинного кода на основе высокоуровневых конструкций.

Архитектурные особенности FORTRAN I

FORTRAN I обладал чрезвычайно компактным, но продуманным синтаксисом, отражающим его узкую предметную область — численные вычисления. Язык поддерживал:

  • Три типа данных: целые (INTEGER), вещественные (REAL — 36‑битный формат с плавающей точкой), и логические (LOGICAL).
  • Именованные переменные: до шести символов, обязательное начало с букв A–Z (цифры допускались на 2–6 позициях). Переменные, начинающиеся с букв I–N, по умолчанию имели тип INTEGER, остальные — REAL (это соглашение, известное как implicit typing, сохранялось десятилетиями и до сих пор встречается в legacy‑кодах).
  • Выражения, максимально приближенные к математическим: A = B * C + D / E.
  • Условные переходы через оператор IF (выражение) N1, N2, N3 — трёхветвистый арифметический IF, возвращавший управление на одну из трёх меток в зависимости от знака выражения (отрицательный, ноль, положительный). Это был прямой отклик на потребности численных алгоритмов, где часто требовалась реакция на знак разности или остатка.
  • Циклы через оператор DO, с фиксированным синтаксисом:
    DO 10 I = 1, N
    Здесь 10 — метка конца цикла. Переменная цикла изменялась с шагом 1, задать иной шаг или динамические границы было невозможно — цикл был строго статическим и поддавался полной компиляторной развёртке.
  • ПодпрограммыFUNCTION и SUBROUTINE. Важно подчеркнуть, что вызов подпрограммы в FORTRAN I не предполагал стека вызовов: параметры передавались исключительно по ссылке, а возврат из подпрограммы происходил к фиксированной точке вызова, что позволяло компилятору размещать локальные переменные в статической области памяти.
Компилятор и его инновации

Революционным аспектом FORTRAN I стал не столько язык, сколько его компилятор — это был первый в истории программный продукт, решавший задачу глобальной оптимизации. Компилятор анализировал граф потока управления, строил таблицы живых переменных, выявлял инварианты циклов и применял strength reduction (замена умножения на сложение при вычислении адресов), common subexpression elimination, loop unrolling и register allocation — при том, что сама терминология этих методов появилась лишь спустя десятилетия.

Особый интерес представляет метод кодогенерации: компилятор делил программу на базовые блоки (sequences of straight-line code), строил flow graph, затем — dependence graph, и уже на его основе принимал решения о размещении переменных в регистрах индекса и аккумуляторах. Эффективность получаемого кода была настолько высока, что многие программисты, сначала скептически настроенные, признали: ручное программирование на ассемблере уступает по производительности автоматически сгенерированному коду, особенно в контексте сложных вложенных циклов.

Согласно отчётам IBM, программы, переписанные с ассемблера на FORTRAN I, демонстрировали снижение времени разработки в 20 раз, при сохранении 80–90 % от исходной скорости. Это соотношение стало ключевым аргументом в пользу принятия Fortran в крупных расчётных центрах — Ливерморской национальной лаборатории, Лос-Аламосе, НАСА.


Раннее распространение и научный императив

К 1958 году FORTRAN I был портирован на IBM 709, а затем — на IBM 1401 и IBM 7090. Благодаря открытой публикации Report on the Algorithmic Language FORTRAN (апрель 1957), другие производители (включая Univac, Honeywell) начали создавать собственные реализации. Язык быстро стал де-факто стандартом для научных вычислений. Важно отметить, что его успех был не следствием маркетинга, а результатом соответствия предметной области: математики и физики, не будучи профессиональными программистами, могли, прочитав десяток страниц руководства, написать программу, реализующую, например, метод конечных разностей для уравнения теплопроводности.

Fortran стал языком, на котором:

  • рассчитывались траектории первых спутников и пилотируемых миссий (Mercury, Apollo);
  • моделировались ядерные реакции в проекте Manhattan и последующих программах;
  • создавались первые численные модели атмосферы (например, работа Чарльза Льюиса и Джозефа Смажера в 1950‑х, положившая начало современной метеорологии);
  • решались задачи квантовой химии — метод Хартри–Фока, программный комплекс GAUSSIAN, первоначально написанный на Fortran IV.

Этот «научный императив» определял дальнейшую эволюцию языка: каждая новая версия сохраняла обратную совместимость — не как дань традиции, а как требование непрерывности вычислительного знания. Алгоритмы, разработанные в 1960‑х, продолжали использоваться в 1990‑х и 2000‑х годах; изменение языка не должно было нарушать их работоспособность.


FORTRAN II и FORTRAN IV: консолидация и первые расширения

Несмотря на успех FORTRAN I, в нём отсутствовали средства для модульной разработки: подпрограммы не могли вызывать друг друга рекурсивно (стека не было), не было механизма передачи массивов с динамическими границами, не поддерживались символические операции.

FORTRAN II (1958) ввёл:

  • возможность независимой компиляции подпрограмм — каждая FUNCTION или SUBROUTINE могла компилироваться отдельно, после чего линковаться в единый образ. Это стало основой для создания библиотек численных процедур — например, IMSL (International Mathematics and Statistics Library), появившейся в 1970 году.
  • директивы компилятора (* в первом столбце строки), что позволило встраивать в исходный текст инструкции для оптимизации (например, указание на выравнивание массивов).

FORTRAN IV (1962) — ключевой этап консолидации. В нём были устранены некоторые «странности» FORTRAN I, сделавшие язык практичнее для широкого круга задач:

  • Введён тип COMPLEX для работы с комплексными числами — критически важный для квантовой механики и электродинамики.
  • Появился оператор LOGICAL IF — упрощённая форма ветвления:
    IF (X .GT. 0.0) GOTO 100
  • Добавлены встроенные функции (SIN, COS, EXP, SQRT, LOG), реализованные на ассемблере и гарантирующие максимальную точность и скорость.
  • Устранён трёхветвистый IF как обязательный — хотя он сохранялся как опция.
  • Добавлена поддержка форматированного ввода/вывода (FORMAT), что позволило гибко управлять представлением чисел в текстовых файлах — необходимость для обмена данными между лабораториями.

К 1966 году FORTRAN IV стал основой для первого официального стандарта ANSI X3.9-1966, закрепившего язык как платформенно‑независимую сущность. С этого момента развитие Fortran перестало быть прерогативой IBM и перешло в руки международных комитетов (ANSI, позже — ISO/IEC JTC1/SC22/WG5).