Старые языки — итоги
Кратко — что стоит унести из раздела "Старые языки". Если пункт кажется туманным — откройте указанную главу или оглавление.
FAQ — Часто задаваемые вопросы
Типичные ситуации при знакомстве с легаси-кодом и историческими языками. Здесь — практические ответы и куда смотреть в разделе; определения для зачёта — в чек-листе.
Вопрос. Зачем учить COBOL или Fortran, если "все пишут на Python"?
Ответ. Миллиарды транзакций и расчётов всё ещё идут через легаси-код, который дорого и рискованно переписывать. Изучение даёт понимание банковских batch-систем, HPC и того, как эволюционировали языки. Подробнее здесь — COBOL, Fortran, оглавление.
Вопрос. Программа на C падает с "Segmentation fault" без понятного сообщения.
Ответ. Это обращение к недопустимой памяти: NULL-указатель, выход за границу массива, use-after-free. Запускайте под Valgrind или AddressSanitizer, проверяйте указатели после malloc. Подробнее здесь — Си — память, указатели.
Вопрос. После free(ptr) программа иногда работает, иногда ломается — "магия".
Ответ. Это неопределённое поведение: память могли переиспользовать, а старый указатель всё ещё читают. Обнуляйте указатель после free, не освобождайте дважды. Подробнее здесь — управление памятью в C.
Вопрос. strcpy в учебном примере переполнил буфер — откуда дыра в безопасности?
Ответ. C не проверяет длину автоматически; классический buffer overflow. Используйте strncpy/snprintf, границы массива, статический анализ. Подробнее здесь — строки и безопасность в C.
Вопрос. Арифметика указателей даёт "левый" адрес — результат мусорный.
Ответ. Указатель можно сдвигать только внутри одного выделенного блока (массива). Сложение с произвольным int без типа ptrdiff_t и проверки границ — частая ошибка новичка. Подробнее здесь — указатели.
Вопрос. Компилятор C молчит, а программа ведёт себя по-разному с -O2 и без оптимизации.
Ответ. Оптимизация вскрывает UB и гонки, которые "случайно работали". Включайте -Wall -Wextra -Werror, sanitizers, читайте стандартные гарантии. Подробнее здесь — компиляция C.
Вопрос. malloc вернул NULL, программа упала позже при записи.
Ответ. Разыменование NULL — segfault. Всегда проверяйте результат malloc/calloc и обрабатывайте нехватку памяти. Подробнее здесь — динамическая память.
Вопрос. Дизассемблировал свой C-код — инструкции не совпадают с тем, что писал в исходнике.
Ответ. Компилятор генерирует машинный код по своим правилам: регистры, выравнивание, инлайн. Ассемблер нужен, когда вы сознательно управляете ABI и периферией. Подробнее здесь — ассемблер — введение, Си и ABI.
Вопрос. Какой диалект ассемблера учить на x86 — NASM, MASM, GAS?
Ответ. Для Linux и GCC-цепочки логичен GAS (AT&T или Intel-синтаксис); NASM популярен в учебниках под Windows. Главное — понять регистры, стек вызовов и соглашение о вызовах, а не один мнемонический синтаксис. Подробнее здесь — ассемблер, первая программа.
Вопрос. Pascal "мертв", но в вузе всё ещё требуют — что ставить дома?
Ответ. Актуальная ветка — Free Pascal + Lazarus: совместимость с классическим Turbo Pascal, кроссплатформенная сборка. Синтаксис begin/end и строгая типизация сохраняются. Подробнее здесь — Pascal — о разделе, первая программа, Lab / 1140 — типовые программы.
Вопрос. Путаю VB6, VBA и VB.NET — это "один Visual Basic"?
Ответ. Это разные платформы: VB6 и VBA — COM/Office; VB.NET — CLR и другой синтаксис/OOP. Макрос Excel на VBA не переносится в .NET без переписывания. Подробнее здесь — Visual Basic.
Вопрос. Lisp-код — "стена скобок", не понимаю, где выражение заканчивается.
Ответ. Читайте S-выражения от внутренних скобок наружу: (f (g x) y) — вызов f с двумя аргументами. Форматирование по отступам и подсветка пар скобок в IDE снимают большую часть боли. Подробнее здесь — Lisp — основы, S-выражения.
Вопрос. COBOL-программа не компилируется: "PIC clause incompatible".
Ответ. Поля PIC задают точный формат и длину на магнитных/файловых записях; смешение COMP, COMP-3 и display без явного MOVE ломает выравнивание. Сверяйте copybook и рабочую область. Подробнее здесь — COBOL — типы, структура программы.
Вопрос. Batch на mainframe: JCL, DD, PROC — с чего начать чтение дампа?
Ответ. JCL описывает какой job, какие шаги, какие файлы; COBOL-PROGRAM — один шаг. Ищите SYSOUT, код return step'а, ID ошибки в spool. Подробнее здесь — COBOL — практика.
Вопрос. Открыли легаси-репозиторий — нет README, только .cbl и .for из 1980-х.
Ответ. Стройте карту снизу вверх: точка входа, COPY/INCLUDE, файлы данных, batch-расписание. Документируйте находки по ходу; не рефакторите без тестового прогона на копии. Подробнее здесь — оглавление, инструменты легаси.
Вопрос. Нужно вызвать старый C-модуль из современного REST-сервиса — как не утонуть?
Ответ. Тонкая обёртка (FFI, cgo, P/Invoke) с чётким контрактом: кто владеет памятью, кодировка строк, потокобезопасность. Бизнес-логику в C не трогайте на первом этапе. Подробнее здесь — Си — интерфейсы.
Вопрос. Fortran ругается на строку "not in column 7" — что за колонки?
Ответ. В fixed-form метка — колонки 1–5, C — 6, код с 7. Современный free-form (*.f90) снимает ограничение; уточните, какой стандарт в проекте. Подробнее здесь — Fortran — синтаксис.
Вопрос. В старом коде повсюду GOTO — переписывать на структурный стиль?
Ответ. В легаси сначала сохраняйте поведение: тесты, эталонный вывод. Рефакторинг GOTO — только с покрытием; часть паттернов (error exit) осознанно оставляют. Подробнее здесь — Pascal — структурность, история.
Вопрос. Почему после Y2K всё ещё говорят про двух digit год в COBOL?
Ответ. Урок Y2K — формат даты в PIC и файлах переживает десятилетия. Старые записи и отчёты могут хранить YY; миграции делают поэтапно. Подробнее здесь — COBOL — данные.
Вопрос. Банк не переписывает COBOL на Java — это лень или расчёт?
Ответ. Риск и стоимость big-bang-миграции часто выше, чем поддержка проверенного batch с регламентами. Меняют периферию (API, очереди), ядро расчётов оставляют. Подробнее здесь — COBOL — о разделе.
Вопрос. Макрос Lisp меняет код "магически" — чем он опаснее обычной функции?
Ответ. Макрос работает на уровне исходного текста до выполнения; ошибки дают непонятные expand-артефакты. Для учёбы начните с defun и lambda, макросы — когда понятна quote/unquote. Подробнее здесь — Lisp — функции.
Вопрос. #define MAX(a,b) в C даёт странные побочные эффекты.
Ответ. Макрос препроцессора текстово подставляет аргументы — i++ может выполниться дважды. Для типобезопасности используйте static inline функции или enum. Подробнее здесь — препроцессор C.
Вопрос. C-функция из ассемблера падает — "wrong number of arguments".
Ответ. Несовпадение calling convention (cdecl vs fastcall, кто чистит стек, регистры для float). Сверьте ABI целевой ОС и документацию компилятора. Подробнее здесь — ассемблер и C.
Вопрос. Читаю бинарный дамп старого формата — числа "перевёрнуты".
Ответ. Разные платформы используют little-endian и big-endian. В C — htonl/ntohl; в Fortran — transfer и явное описание record layout. Подробнее здесь — Си — представление данных.
Вопрос. Fortran-расчёт на суперкомпьютере — почему не переписали на CUDA/Python?
Ответ. Десятилетия верифицированных моделей, OpenMP/MPI, библиотеки BLAS/LAPACK. Python часто оборачивает тот же Fortran/C ядро. Подробнее здесь — Fortran — HPC, итоги Fortran.
Вопрос. Старые языки "небезопасны" — имеет ли смысл запускать их код на своём ПК?
Ответ. Учебные примеры запускайте в VM или контейнере, не компилируйте непроверенный легаси с правами root. Buffer overflow в C — реальный вектор; COBOL batch сам по себе не "заражает" ПК, но JCL может указать опасные DD. Подробнее здесь — Си — безопасность.
Вопрос. Хочу понять, откуда в Java/C# взялись class и interface — куда копать в этом разделе?
Ответ. Цепочка: Simula → Smalltalk (в других разделах) → C++/Java; Pascal дал структурность, C — модель памяти. Начните с истории раздела и Си. Подробнее здесь — оглавление.
Вопрос. COBOL программирование с нуля — где учиться в 2025 году?
Ответ. Начните с структуры DIVISION, PIC-форматов и batch-логики; курсы IBM/OpenMainframe и практика на эмуляторе. В энциклопедии — COBOL — о разделе, первая программа.
Вопрос. Зачем банкам COBOL и можно ли устроиться COBOL-разработчиком?
Ответ. Ядро расчётов и транзакций на mainframe десятилетиями на COBOL; спрос на сопровождение и миграцию сохраняется. Нужны batch, JCL, copybook — см. COBOL.
Вопрос. Fortran для научных расчётов — с чего начать новичку?
Ответ. Установите gfortran/ifort, пройдите массивы, DO-циклы, подпрограммы, затем OpenMP/MPI. Маршрут — Fortran — о разделе, первая программа.
Вопрос. Чем Fortran лучше Python для физики и инженерных расчётов?
Ответ. Fortran даёт предсказуемую производительность, многомерные массивы и библиотеки BLAS/LAPACK; Python часто вызывает тот же Fortran/C ядро. Подробнее здесь — Fortran — HPC.
Вопрос. Как выучить язык C с нуля для системного программирования?
Ответ. Освоите указатели, память, struct, компиляцию gcc/clang, затем POSIX и отладку. Маршрут раздела — Си — о разделе, первая программа.
Вопрос. Что такое указатели в C простыми словами?
Ответ. Указатель хранит адрес ячейки памяти; через * читают/пишут значение, через & берут адрес переменной. Ошибки указателей — главный источник segfault. Подробнее здесь — указатели.
Вопрос. malloc и free в C — как правильно выделять память?
Ответ. malloc(n) возвращает блок; после использования — free(ptr), указатель обнулить. Каждый malloc — парный free, без double free. Подробнее здесь — динамическая память.
Вопрос. Как скомпилировать C программу в gcc командой?
Ответ. gcc main.c -o app -Wall; несколько файлов перечисляют через пробел, библиотеки — -lm, -lpthread. Подробнее здесь — компиляция C, первая программа.
Вопрос. Pascal Turbo Pascal vs Free Pascal — что ставить сегодня?
Ответ. Для учёбы и новых проектов — Free Pascal + Lazarus; Turbo Pascal — DOS-наследие. Синтаксис program, begin/end сохраняется. Подробнее здесь — Pascal — о разделе, практика — Lab / 1140.
Вопрос. Lisp для начинающих — с чего начать изучение?
Ответ. Установите SBCL или Clozure, разберите S-выражения, quote, CAR/CDR, defun. Рекурсия и списки — основа. Подробнее здесь — Lisp — о разделе, основы.
Вопрос. Что такое CAR и CDR в Lisp?
Ответ. CAR — первый элемент списка (голова), CDR — хвост (остаток списка). Из них строят cadr, caddr и обход списков. Подробнее здесь — Lisp — списки.
Вопрос. Ассемблер x86 для начинающих — нужен ли он программисту?
Ответ. Полезен для отладки, reverse engineering, понимания CPU, не обязателен для веба. Начните с регистров, mov/add, стека вызовов. Подробнее здесь — ассемблер — о разделе.
Вопрос. Visual Basic 6 vs VB.NET — что изучать для Excel и Office?
Ответ. Макросы Excel/Office — это VBA (близко к VB6); VB.NET — для .NET-приложений. Для автоматизации таблиц учите VBA в контексте Visual Basic.
Вопрос. Легаси код на старых языках — как читать без документации?
Ответ. Найдите entry point, COPY/include, файлы данных, прогоните на тестовых данных, фиксируйте карту модулей. Не рефакторите без эталонного вывода. Подробнее здесь — оглавление, Си — практика.
Вопрос. Y2K problem COBOL — что это было и актуально ли сейчас?
Ответ. Двузначный год в PIC ломал даты после 1999; массовая миграция форматов. Урок — формат данных живёт десятилетиями. Подробнее здесь — COBOL — данные.
Вопрос. struct и union в C — в чём разница?
Ответ. struct — поля рядом в памяти; union — одна область под разные типы (экономия, overlay). Размер union — максимум полей. Подробнее здесь — структуры C.
Вопрос. Препроцессор C #include #define — зачем нужен?
Ответ. До компиляции: подключение заголовков, макросы, условная сборка #ifdef. Макросы заменяют текст — осторожно с побочными эффектами. Подробнее здесь — препроцессор.
Вопрос. OpenMP Fortran parallel do — как распараллелить цикл?
Ответ. Директива !$omp parallel do перед DO; нужна сборка с -fopenmp. Гонки — если потоки пишут в одну переменную без reduction. Подробнее здесь — Fortran — HPC.
Вопрос. Как связать старый Fortran/C код с Python через FFI?
Ответ. Соберите shared library, вызывайте через ctypes/cffi (Python) или cgo; контракт типов и владение памятью — на границе. Подробнее здесь — Си — интерфейсы.
Вопрос. История языков программирования — зачем знать Fortran, Lisp, Algol?
Ответ. От них пришли циклы, функции, ООП, FP, модули в современных языках. Контекст — в истории раздела.
Вопрос. Buffer overflow C пример — как защититься?
Ответ. Границы буфера, snprintf, fgets, AddressSanitizer, запрет небезопасных функций. Не доверяйте длине ввода. Подробнее здесь — Си — безопасность.
Вопрос. Mainframe JCL COBOL job example — что такое JCL?
Ответ. Job Control Language — скрипт запуска job на z/OS: шаги, DD-файлы, PROC. COBOL-PROGRAM — один step в цепочке. Подробнее здесь — COBOL — практика.
Вопрос. NASM vs GAS ассемблер — что выбрать под Linux?
Ответ. Под GCC toolchain на Linux — GAS (.s файлы); NASM — Intel-синтаксис, часто в учебниках Windows. Важнее ABI и регистры, чем мнемоника. Подробнее здесь — ассемблер, ассемблер и C.
Что запомнить
Старые языки программирования — это исторические и промышленно значимые системы записи алгоритмов, созданные в середине XX века и активно использовавшиеся на протяжении десятилетий. Они заложили основы современного программирования, ввели ключевые концепции (процедурность, структурность, типизацию, абстракцию) и до сих пор поддерживают критически важные системы в банковской сфере, авиации, государственном управлении и научных вычислениях.
К числу таких языков относятся:
- Fortran — первый высокоуровневый язык, ориентированный на научные и инженерные расчёты;
- COBOL — язык бизнес-приложений, управляющий миллиардами финансовых транзакций ежедневно;
- Lisp — пионер функционального программирования и символьной обработки, повлиявший на развитие ИИ;
- Pascal — учебный и системный язык, популяризировавший структурное программирование;
- C — основа системного программирования, лежащая в основе Unix, ядер ОС и компиляторов;
- Assembly — язык низкого уровня, обеспечивающий прямой контроль над аппаратными ресурсами;
- visual-basic — средство быстрой разработки десктопных приложений в экосистеме Microsoft.
Хотя эти языки уступают современным аналогам в выразительности, безопасности и удобстве, их значение невозможно переоценить:
- Они демонстрируют эволюцию подходов к решению задач — от машинной ориентации к человекоцентричности;
- Многие из них всё ещё поддерживают легаси-системы, замена которых экономически нецелесообразна;
- Изучение старых языков развивает понимание архитектуры компьютеров, памяти, компиляции и исполнения кода.
Три основных правила эффективного взаимодействия со старыми языками:
- Не рассматривать их как "устаревшие", а воспринимать как исторический фундамент современных технологий;
- Изучать их с целью понимания принципов, а не для практического применения в новых проектах;
- Уважать контекст: многие системы на COBOL или Fortran работают безотказно десятилетиями и критичны для глобальной инфраструктуры.
Три фундаментальных момента:
- Старые языки — это живые части мировой цифровой инфраструктуры;
- Их простота и ограниченность заставляют мыслить точнее и эффективнее;
- Знание этих языков даёт уникальное преимущество в понимании того, как устроен современный софт "под капотом".
Куда идти дальше
Полный маршрут — на странице о разделе.
Проверьте себя: Чек-лист самопроверки.