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

Старые языки — итоги

Разработчику Аналитику Тестировщику Архитектору Инженеру

Кратко — что стоит унести из раздела "Старые языки". Если пункт кажется туманным — откройте указанную главу или оглавление.


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.

Вопрос. Си шарп или Java — откуда взялись идеи из C и Pascal?

Ответ. C# и Java унаследовали типы, блоки, GC-модель (Java), struct-like идеи от C/Pascal/Smalltalk. Сравнение корней — история, Си.


Что запомнить

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

К числу таких языков относятся:

  • Fortran — первый высокоуровневый язык, ориентированный на научные и инженерные расчёты;
  • COBOL — язык бизнес-приложений, управляющий миллиардами финансовых транзакций ежедневно;
  • Lisp — пионер функционального программирования и символьной обработки, повлиявший на развитие ИИ;
  • Pascal — учебный и системный язык, популяризировавший структурное программирование;
  • C — основа системного программирования, лежащая в основе Unix, ядер ОС и компиляторов;
  • Assembly — язык низкого уровня, обеспечивающий прямой контроль над аппаратными ресурсами;
  • visual-basic — средство быстрой разработки десктопных приложений в экосистеме Microsoft.

Хотя эти языки уступают современным аналогам в выразительности, безопасности и удобстве, их значение невозможно переоценить:

  • Они демонстрируют эволюцию подходов к решению задач — от машинной ориентации к человекоцентричности;
  • Многие из них всё ещё поддерживают легаси-системы, замена которых экономически нецелесообразна;
  • Изучение старых языков развивает понимание архитектуры компьютеров, памяти, компиляции и исполнения кода.

Три основных правила эффективного взаимодействия со старыми языками:

  1. Не рассматривать их как "устаревшие", а воспринимать как исторический фундамент современных технологий;
  2. Изучать их с целью понимания принципов, а не для практического применения в новых проектах;
  3. Уважать контекст: многие системы на COBOL или Fortran работают безотказно десятилетиями и критичны для глобальной инфраструктуры.

Три фундаментальных момента:

  • Старые языки — это живые части мировой цифровой инфраструктуры;
  • Их простота и ограниченность заставляют мыслить точнее и эффективнее;
  • Знание этих языков даёт уникальное преимущество в понимании того, как устроен современный софт "под капотом".

Куда идти дальше

Полный маршрут — на странице о разделе.

Проверьте себя: Чек-лист самопроверки.