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

Исторические языки программирования

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

Play ITЗагрузка интерактивного демо…


Старые языки программирования

Термин "старые языки" в данном контексте не несёт дисфункциональной или уничижительной окраски. Он обозначает языки, появившиеся в первые три десятилетия развития программирования (1950–1980-е годы), созданные в условиях жёстких аппаратных ограничений, отсутствия устоявшихся методологий разработки и незрелости самой дисциплины "программная инженерия". Эти языки — не просто исторические артефакты; они сформировали фундаментальную основу современного программного мира. Без понимания их генезиса невозможно в полной мере осознать эволюцию парадигм, конструкций и даже самой терминологии, которой пользуются сегодня.


Почему эти языки называют "старыми"?

Старость языка определяется не столько его возрастом в годах, сколько утратой его доминирующего статуса в качестве языка первого выбора для новых проектов в массовом сегменте разработки. Критерии, по которым язык переходит в категорию "старый", включают:

  • Отсутствие значимой эволюции стандарта в последние 15–20 лет (не путать с сопровождением — COBOL и FORTRAN, например, продолжают обновляться, но эти изменения не меняют фундаментальной модели языка);
  • Сужение сферы применения до узких ниш, где его использование обусловлено историческими, экономическими или техническими причинами (например, необходимость поддержки legacy-систем);
  • Миграция сообщества разработчиков и образовательных программ к более поздним языкам, обладающим лучшей выразительностью, безопасностью, переносимостью или поддержкой современных парадигм;
  • Техническое несоответствие современным требованиям к продуктивности разработки (например, отсутствие встроенной поддержки многопоточности, сборки мусора, строгой типизации, модульности).

Существенно, что "старые" языки почти никогда не исчезают полностью. Они переходят в статус структурообразующих — их идеи, синтаксические паттерны и модели программирования становятся ДНК более поздних языков, а сами исходные системы продолжают функционировать в критически важных инфраструктурах.


Эволюционные связи и преемственность

Программирование развивалось не линейно, но можно выделить несколько ключевых линий наследования, в которых старые языки играют роль предшественников:

  • FORTRAN → Algol → Pascal → Ada, Modula → (косвенно) C → C++/C#/Java/Go/Rust
    FORTRAN задал стандарт компилируемого языка высокого уровня для численных расчётов. Его прямой "оппонент" — Algol — ввёл строгую структуризацию кода, блочную структуру и формальный синтаксис, описанный в нотации Бэкуса–Наура (BNF). Algol, в свою очередь, стал прародителем Pascal (как учебного и системного языка) и повлиял на ранний C — последний, однако, отказался от некоторых строгостей Algol ради близости к железу, создав гибридную модель "высокоуровневого ассемблера". Именно C обеспечил массовый переход от научного программирования к системному и прикладному, а его синтаксис (фигурные скобки, for, while, if) стал де-факто стандартом для подавляющего большинства императивных языков последующих десятилетий.

  • COBOL → (влияние на) RPG, PL/I, Ada, бизнес-ориентированные DSL
    COBOL был разработан как язык, максимально приближенный к естественному (английскому), с целью сделать программирование доступным для аналитиков и экономистов. Его иерархическая структура данных (level numbers), вербальный синтаксис (MOVE A TO B, PERFORM UNTIL) и ориентация на обработку файлов и транзакций оказали влияние на специализированные языки делового программирования (например, IBM RPG) и на концепцию доменных языков (DSL). Хотя COBOL не имеет прямых "потомков" в виде общих языков, его философия — язык как спецификация бизнес-логики — живёт в современных low-code платформах, BPM-системах и языках вроде SQL (который, кстати, тоже концептуально близок к COBOL по декларативности и вербальности).

  • Lisp → Scheme, Common Lisp → Emacs Lisp, AutoLisp → Clojure, Racket, Julia (частично)
    Lisp — единственный из языков 1950-х, сохранивший актуальность и активное развитие. Его революционность состояла в единообразии представления данных и кода. Программа на Lisp — это структура данных (список), и интерпретатор может её модифицировать во время выполнения. Эта идея гомоиконичности легла в основу метапрограммирования, макросистем и динамических языков. Lisp напрямую породил две ветви — Scheme (упрощённая, академическая, с упором на функциональность и рекурсию) и Common Lisp (практическая, стандартизированная). Современные языки вроде Clojure (работающий на JVM и CLR) и Julia (математические вычисления) напрямую заимствуют идеи Lisp — символы как данные, мощные макросы, REPL-ориентированная разработка.

  • Ассемблер (машинно-зависимый) → макроассемблеры → (влияние на) C, C++, Rust
    Ассемблер не является единым языком; это семейство языков низкого уровня, тесно связанных с конкретной архитектурой процессора (x86, ARM, MIPS и т.п.). Именно ассемблер определил базовые концепции — регистры, флаги, стек, прямую адресацию памяти, инструкции управления потоком. Хотя современные разработчики редко пишут на "голом" ассемблере, его логика пронизывает системное программирование. Язык C был задуман как переносимый ассемблер — каждая его конструкция (например, указательная арифметика, union, volatile) имеет прямое отображение в машинные инструкции. Rust, несмотря на высокий уровень безопасности, также сохраняет близость к железу — его модель владения (ownership) и unsafe-блоки — прямое наследие ассемблерно-ориентированного мышления.

  • BASIC → visual-basic → VB.NET
    BASIC создавался как язык для начинающих, с упрощённым синтаксисом и интерактивной средой (REPL в виде командной строки). Его массовое распространение в 1980-х на домашних компьютерах (Commodore 64, ZX Spectrum, Apple II) сделало его первым языком для целого поколения программистов. Microsoft BASIC (а затем QBasic, QuickBASIC) добавил структурные элементы (SUB, FUNCTION), а visual-basic (1991) совершил революцию: впервые связал язык с визуальным конструктором интерфейсов (RAD — Rapid Application Разработка). VB стал де-факто стандартом для Windows-приложений в 1990-х. VB.NET (2002), несмотря на названии, — это уже полностью объектно-ориентированный язык, компилируемый в IL и работающий на .NET CLR, синтаксически совместимый с предшественником лишь на уровне поверхностных конструкций.


Кто кого заменил — и почему это не всегда полная замена

Важно избегать линейного нарратива "язык A устарел, его вытеснил язык B". На практике замена происходит по сегментам применения, и часто старый язык сохраняется там, где его замена экономически или технически невыгодна.

  • FORTRAN дополнился C и C++. Современные HPC-стеки часто используют гибрид — FORTRAN для ядер вычислений (из-за отлаженных библиотек, например, LAPACK, BLAS), а C/C++/Python — для интерфейсов, управления памятью и оркестрации. Причина — непрерывность инвестиций: переписать 50 лет наработок в гидродинамике или квантовой химии — задача с колоссальным риском и стоимостью.

  • COBOL не заменён Java или C# в банковских системах — он интегрирован с ними. Современные решения используют "обёртки" (wrappers), ESB-шлюзы, API-фасады, чтобы COBOL-транзакции вызывались из Java-сервисов. Причина — надёжность, предсказуемость и соответствие регуляторным требованиям: в финансах важна не новизна, а отсутствие неопределённости.

  • Ассемблер не заменён C — он делегирован. Ядро ОС, драйверы, криптографические примитивы по-прежнему содержат вставки ассемблера (inline assembly) для достижения максимальной производительности или доступа к специфическим инструкциям (например, RDTSC, CPUID). Встраивание ассемблера в C — стандартная практика в системном программировании.

Таким образом, "замена" — это скорее перераспределение ролей: старый язык уходит из frontline-разработки, но остаётся в ядре инфраструктуры как "невидимая опора".


Где сейчас можно встретить старые языки

  • Финансовый сектор: более 43% транзакций в системах крупнейших банков США обрабатываются на COBOL (оценка Reuters, 2020). Триллионы строк кода, запущенные на мейнфреймах IBM z/OS.
  • Научные исследования — FORTRAN — основной язык в физике, метеорологии, аэрокосмической отрасли. Код, разработанный в 1970-х, всё ещё используется в NASA и Европейском центре среднесрочных прогнозов погоды (ECMWF).
  • Встроенные и реального времени системы — Ассемблер и C доминируют в микроконтроллерах, автомобильной электронике (AUTOSAR), авионике (DO-178C сертификация). Pascal (в виде Object Pascal/Delphi) встречается в медицинском оборудовании и промышленных ПЛК.
  • Наследственные ПО для Windows: тысячи корпоративных приложений на visual-basic 6.0 всё ещё поддерживаются. Microsoft прекратила официальную поддержку в 2008, но runtime распространяется и сегодня.
  • Образование и ретрокомпьютинг — BASIC (в современных интерпретаторах, например, QB64), Pascal (Free Pascal, Lazarus) используются в школах и университетах для обучения основам алгоритмики. Энтузиасты воссоздают игры для Commodore 64 и ZX Spectrum на оригинальных языках.
  • Метапрограммирование и ИИ — Lisp и его диалекты применяются в символьных системах ИИ, expert systems, в редакторе Emacs (весь UI — на Emacs Lisp), в AutoCAD (AutoLisp), в некоторых DSL для финансового моделирования.

COBOL (Common Business-Oriented Language)

COBOL был разработан в 1959–1960 гг. по инициативе комитета CODASYL при участии Грейс Хоппер. Его появление стало ответом на растущую потребность в автоматизации бухгалтерского и банковского учёта — задач, где доминировала обработка больших объёмов структурированных данных (карты, ленты), а не численные расчёты.

Ключевая особенность COBOL — вербальная избыточность. Синтаксис строится по принципу "читаемость превыше краткости": ADD A TO B GIVING C, IF CUSTOMER-STATUS = 'ACTIVE' THEN PERFORM CALCULATE-DISCOUNT. Это было осознанное проектировочное решение: язык должен был быть понятен бизнес-аналитикам, которые писали спецификации. Отсюда и четырёхчастная структура программы (Identification, Environment, Данные, Procedure Division) — она отражает жизненный цикл обработки — кто, где, с чем, как.

COBOL первым ввёл строгую иерархическую модель данных с level numbers (например, 01 CUSTOMER. 05 NAME PIC X(30). 05 ACCOUNTS OCCURS 10 TIMES.), предвосхитив концепцию вложенных структур и массивов записей. Его модель файлового ввода/вывода (sequential, relative, indexed) легла в основу транзакционных систем — каждая транзакция — это последовательность операций над записями, с чётким разделением на открытие, обработку, закрытие.

COBOL не "умер" — он консервировался. Сегодня около 220 млрд строк COBOL-кода поддерживаются в мире (оценка Reuters, 2023), преимущественно в банковских ядрах (core banking systems), пенсионных фондах и страховых компаниях. Причины устойчивости:

  • Надёжность — программы, отлаженные десятилетиями, обрабатывают миллионы транзакций без сбоев;
  • Соответствие регуляторным нормам: проверки COBOL-систем прошли аудиты десятки лет подряд;
  • Стоимость миграции: перепись одного среднего банка может стоить от $50 млн и занять 5+ лет при высоком риске ошибок.

COBOL оказал прямое влияние на развитие декларативных и специализированных языков — его идея "описать задачу, а не алгоритм её решения" предвосхитила SQL, а структура Data Division — форматы вроде XML Schema и Protocol Buffers.


FORTRAN (FORmula TRANslation)

FORTRAN, созданный в 1954–1957 гг. в IBM под руководством Джона Бэкуса, — первый в мире практически успешный язык высокого уровня. До него программирование велось исключительно на машинных кодах или ассемблере, и переход на FORTRAN означал ускорение разработки в 10–20 раз — революционный эффект для своего времени.

FORTRAN проектировался для одной цели: максимально эффективная компиляция математических формул. Отсюда — его синтаксис, близкий к научной нотации (X = A * SIN(B) + C**2), поддержка комплексных чисел и массивов, а также ранние оптимизации компилятора (loop unrolling, common subexpression elimination), которые были невозможны в интерпретируемых языках. FORTRAN-77 стандартизировал функциональный подход: подпрограммы (FUNCTION, SUBROUTINE) стали основной единицей модульности.

Критически важно: FORTRAN задал парадигму вычислительного кластера. Уже в 1960-х годах FORTRAN-программы распределялись по нескольким процессорам (на CDC 6600), заложив основы MPI-подобных моделей. Библиотеки вроде LINPACK (1970-е) и LAPACK (1990-е) — написаны на FORTRAN — до сих пор используются как эталон производительности в суперкомпьютерных рейтингах TOP500.

Сегодня FORTRAN применяется там, где доминируют:

  • Долговечность вычислительных моделей (например, климатические модели, разработанные в 1980-х, до сих пор в эксплуатации);
  • Производительность для dense linear algebra (матричные операции);
  • Соответствие стандартам в инженерных расчётах (ANSI/IEEE 754 для арифметики).

Наследие FORTRAN — в культуре научных вычислений — идея "написать ядро на низкоуровневом, но эффективном языке, а обвязку — на другом" — прямая проекция FORTRAN/C/Python-стека современных HPC-приложений.


Ассемблер (Assembly Language)

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

Особенность ассемблера — полная прозрачность — каждая инструкция (MOV, ADD, JMP) соответствует одной машинной команде. Это даёт максимальную производительность и предсказуемость по времени выполнения — критично для реального времени. Однако цена — отсутствие переносимости и высокая сложность поддержки: изменение архитектуры (например, переход с x86 на ARM) требует полного переписывания.

Ассемблер определил базовые понятия системного программирования:

  • Регистровая модель (general-purpose, status, stack pointer);
  • Стек как структура управления вызовами;
  • Прямая адресация памяти (absolute, relative, indexed);
  • Прерывания и обработка исключений.

Современное применение:

  • Ядра операционных систем: критические секции (context switching, TLB flush) часто написаны на ассемблере;
  • Криптография — реализации AES, SHA-256 используют специализированные инструкции (AES-NI, AVX);
  • Встроенные системы: микроконтроллеры с объёмом памяти < 64 КБ (например, в бытовой технике);
  • Отладка и реверс-инжиниринг: дизассемблирование остаётся основным методом анализа бинарного кода.

Ассемблер не эволюционировал — он специализировался. Современные макроассемблеры (NASM, MASM) добавили условную компиляцию и макросы, но ядро осталось неизменным: язык остаётся инструментом для тех, кто должен говорить с процессором напрямую.


Lisp (LISt Processor)

Lisp, созданный Джоном Маккарти в 1958 г., — первый функциональный язык и, по сути, первый язык с поддержкой метапрограммирования на уровне языка. Его революционность — в единстве кода и данных — программа на Lisp записывается как s-выражение (вложенный список), и интерпретатор может обрабатывать этот список как данные, модифицировать его и затем выполнять. Отсюда — eval, quote, macroexpand как встроенные примитивы.

Lisp ввёл:

  • Условные выражения (cond);
  • Рекурсию как основной инструмент итерации (циклы появились позже);
  • Автоматическое управление памятью (первый в мире сборщик мусора, 1960);
  • Динамическую типизацию и REPL (Read-Eval-Print Loop) как основной режим работы.

Lisp не был массовым, но стал языком исследований — на нём создавались первые экспертные системы (DENDRAL, MYCIN), символьные системы ИИ, системы автоматического доказательства теорем. Его гибкость делала его идеальным для прототипирования новых идей — многие концепции (замыкания, continuation, pattern matching) впервые были реализованы в диалектах Lisp.

Современное положение:

  • Emacs Lisp — весь пользовательский интерфейс редактора Emacs (окна, меню, плагины) написан на нём;
  • AutoLisp — встроенный язык в AutoCAD для автоматизации черчения;
  • Common Lisp и Scheme — используются в академической среде, а также в нишевых коммерческих продуктах (например, ITA Software, купленная Google, использовала Common Lisp для маршрутизации авиабилетов);
  • Clojure — современный Lisp, работающий на JVM и CLR, активно применяется в финтехе (Nubank, Walmart) и аналитике.

Lisp доказал: язык может быть расширяемым до неузнаваемости, оставаясь при этом строго формальным. Эта идея легла в основу макросистем в Rust, Julia, Scala и даже в препроцессорах C++ (хотя и в ограниченной форме).


Pascal

Pascal был разработан Никлаусом Виртом в 1968–1970 гг. как учебный язык, призванный продемонстрировать преимущества структурного программирования — подхода, противопоставленного "спагетти-коду" на ранних версиях FORTRAN и BASIC. Pascal строго реализовывал идеи Эдсгера Дейкстры — запрет goto, блочная структура, строгая типизация, явное объявление всех переменных.

Ключевые нововведения:

  • Записи (record) — первая реализация структур с именованными полями разного типа;
  • Множества (set of) — аппаратная поддержка битовых масок;
  • Процедуры и функции как первоклассные сущности (но без замыканий в оригинальной версии);
  • Модульность через внешние файлы (позже — unit в Turbo Pascal).

Pascal достиг пика популярности в 1980-х благодаря Turbo Pascal от Borland (1983) — первой IDE с компилятором, редактором и отладчиком в одном пакете, загружавшемся за секунды на PC с 64 КБ ОЗУ. Turbo Pascal и его потомок — Delphi (1995, Object Pascal) — определили поколение Windows-разработчиков. Delphi с его VCL (Visual Component Library) был одним из первых RAD-инструментов, предвосхитив C# WinForms и Java Swing.

Сегодня Pascal живёт в:

  • Free Pascal / Lazarus — кроссплатформенная среда для встраиваемых и десктопных приложений;
  • Эмбаркадеро Delphi — поддержка legacy-приложений в банковской и медицинской сферах (особенно в странах Восточной Европы и Латинской Америки);
  • Обучении — в ряде вузов (например, в Германии, России) Pascal по-прежнему используется для вводного курса по алгоритмам.

Pascal оказал влияние на Ada (который частично базировался на его типовой системе) и на ранний Си++ (Бьёрн Страуструп признавал влияние Pascal на концепцию class как расширенной record).


BASIC и visual-basic

BASIC (Beginner’s All-purpose Symbolic Instruction Code) был создан в 1964 г. в Дартмутском колледже как язык для студентов, не специализирующихся в информатике. Его принцип — минимизация барьеров входа — интерактивный режим, автоматическая нумерация строк, отсутствие компиляции, простейший синтаксис (PRINT "HELLO", GOTO 100).

Массовое распространение BASIC получил благодаря домашним компьютерам 1980-х — Commodore 64, ZX Spectrum, Apple II поставлялись с интерпретатором BASIC в ПЗУ. Это сделало его первым языком для миллионов. Однако его изначальная простота обернулась проблемами: отсутствие процедур, глобальные переменные по умолчанию и GOTO вели к нечитаемому коду — отсюда и фраза "BASIC портит стиль".

Перелом наступил с QuickBASIC (1985) и QBasic (1991), добавившими процедуры, типизацию и отладчик. Но настоящая революция — visual-basic 1.0 (1991). VB объединил:

  • Простоту BASIC;
  • Визуальный конструктор форм (drag-and-drop);
  • Модель событий (Button_Click);
  • COM-интеграцию (позволявшую вызывать DLL и ActiveX-компоненты).

VB стал стандартом для внутренних корпоративных приложений в 1990-х. По оценкам Microsoft, в 1998 г. на VB приходилось 70% всех Windows-приложений.

VB.NET (2002) — уже не BASIC. Это объектно-ориентированный язык, компилируемый в CIL, с перегрузкой, исключениями, обобщениями. Совместимость с VB6 — лишь частичная (синтаксическая), семантически это другой язык. Тем не менее, миллионы строк VB6 до сих пор поддерживаются через режим совместимости или посредством инструментов вроде ArtinSoft visual-basic Upgrade Companion.

Наследие BASIC — идея доступности программирования. Современные low-code платформы (Power Apps, OutSystems), языки вроде Scratch и даже Python (в части своей философии "читаемости") — прямые наследники BASIC-подхода.


Си (C)

Си, разработанный Деннисом Ритчи в Bell Labs в 1969–1973 гг., — мост между аппаратным и программным мирами. Он возник как инструмент переписывания ядра Unix с ассемблера PDP-7 на более переносимый язык. Результат превзошёл ожидания — Unix, написанный на C, был портирован на PDP-11 — и с тех пор C стал языком системного программирования по умолчанию.

C — компромисс между выразительностью и контролем. Он предоставляет:

  • Указатели и арифметику над ними — прямой доступ к памяти;
  • Структуры (struct) и объединения (union) — гибкое представление данных;
  • Преобразование типов (cast) — явное управление интерпретацией битов;
  • Минимальную runtime-поддержку — программа может состоять из одной функции main.

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

Влияние C невозможно переоценить:

  • Операционные системы — Unix, Linux, Windows NT (ядро), macOS, Android (ядро Linux);
  • Компиляторы и интерпретаторы — GCC, Clang, CPython, V8 (часть runtime);
  • Базы данных — MySQL, PostgreSQL, SQLite;
  • Сетевые протоколы: реализации TCP/IP, OpenSSL.

Синтаксис C (фигурные скобки, if/else, for, while, ; как разделитель) стал основой для C++, Java, C#, JavaScript, PHP, Go, Rust — даже в языках с иной семантикой (например, в функциональных) часто сохраняется C-подобная нотация для управляющих конструкций.

Стандарт C17 (2018) ввёл лишь незначительные уточнения; C23 (2023) добавил UTF-8 поддержку, но не изменил модель памяти. Причина — в надёжности базы — если язык позволяет написать ядро ОС, то его "улучшение" — это риск, а не выгода.