История языка 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, N10— метка конца цикла. Переменная цикла изменялась с шагом 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).
См. также
Другие статьи этого же раздела в боковом меню (как на странице «О разделе»). GNU Fortran (gfortran) — часть компиляторной коллекции GCC, бесплатный, открытый, поддерживает все современные стандарты, широко используется в академической среде и Linux-экосистеме. Программа на Fortran состоит из одной или нескольких программных единиц. Каждая такая единица представляет собой логически завершенный фрагмент исходного кода, обладающий собственной областью… Типизация, набор правил определения типа данных значений языка. В Fortran условное выполнение кода реализуется с помощью конструкции IF. Эта конструкция позволяет программе выбирать, какие действия выполнять, в зависимости от истинности логического выражения.… Функция в Fortran — это подпрограмма, которая возвращает ровно одно значение. Это значение может быть любого допустимого типа — целое число, вещественное число, логическое значение, символьная строка… Гайд по установке и настройке с написанием первой программы и её запуском. Пример чистой функции в Фортране — это процедура, вычисляющая сумму двух чисел или норму вектора. Она принимает аргументы, производит вычисления и возвращает результат, не затрагивая внешнее… Программа на Fortran состоит из одной или нескольких программных единиц — Основная программа (program), Внешние подпрограммы (subroutine, function), Модули (module), Блоки внутренних подпрограмм…Основы языка Fortran
Архитектура Fortran-программ
Типы данных в Fortran
Управляющие конструкции и операторы Fortran
Подпрограммы и функции в Fortran
Первая программа на Fortran
Функциональные особенности Fortran
Справочник по языку Fortran