Добавить в корзинуПозвонить
Найти в Дзене
Цифровая Переплавка

⚙️ «Стокгольмский синдром» в кремнии: почему наше железо всё ещё заложник языка C

Когда мы смотрим на кристалл современного процессора — миллиарды транзисторов, кэш, предсказатели ветвлений, целые подсистемы стеков — мы видим не “естественный результат эволюции вычислений”. Мы видим архитектурный памятник языку C. То, что начиналось как экономический компромисс 1970-х, стало ментальной тюрьмой XXI века. Мы живём в эпоху, где процессоры стоят дешевле кофе, но до сих пор программируем их так, будто каждая наносекунда стоит зарплаты инженера Bell Labs. В начале 1970-х, когда PDP-11 стоил как дом, каждая инструкция имела значение. Тогда C и Unix предложили простую, но жёсткую модель: всё — функция, всё — стек, всё — последовательно. 🧱 Проблема была не в C, а в контексте. Компьютеры были дорогими, многопользовательские системы требовали таймшеринга, а последовательное исполнение выглядело рационально. Но когда программисты начали жаловаться на медленные вызовы функций, инженеры не пересмотрели идею.
Они перепроектировали железо. И вот парадокс: мы создали железо под язы
Оглавление

Когда мы смотрим на кристалл современного процессора — миллиарды транзисторов, кэш, предсказатели ветвлений, целые подсистемы стеков — мы видим не “естественный результат эволюции вычислений”. Мы видим архитектурный памятник языку C.

То, что начиналось как экономический компромисс 1970-х, стало ментальной тюрьмой XXI века. Мы живём в эпоху, где процессоры стоят дешевле кофе, но до сих пор программируем их так, будто каждая наносекунда стоит зарплаты инженера Bell Labs.

💾 Как мы попали в эту ловушку

В начале 1970-х, когда PDP-11 стоил как дом, каждая инструкция имела значение. Тогда C и Unix предложили простую, но жёсткую модель: всё — функция, всё — стек, всё — последовательно.

🧱 Проблема была не в C, а в контексте. Компьютеры были дорогими, многопользовательские системы требовали таймшеринга, а последовательное исполнение выглядело рационально.

Но когда программисты начали жаловаться на медленные вызовы функций, инженеры не пересмотрели идею.
Они
перепроектировали железо.

  • 🪙 Появились регистры указателя кадра — для ускорения стековых вызовов.
  • 🧮 В процессоры встроили аппаратное управление стеком.
  • 🧠 Архитектуры начали оптимизировать паттерны вызовов и возвратов.

И вот парадокс: мы создали железо под язык, а потом объявили, что язык “естественно соответствует железу”.

🔁 Замкнутый круг

Так начался Стокгольмский синдром аппаратного обеспечения (Hardware Stockholm Syndrome) — когда мы полюбили свои оковы.

  • 🧩 C стал “эффективным”, потому что процессоры десятилетиями адаптировали под него.
  • 🚦 ОС научились делать контекстные переключения, потому что код был синхронным.
  • 🧮 Кэш и виртуальная память подстроились под стековые паттерны.

Теперь всё вокруг C: операционные системы, компиляторы, железо, наши учебники, даже язык мышления.
И никто уже не спрашивает:
а правильно ли это?

🕹️ Pong против Unix

Самый красивый момент в статье Пола Тарвидаса — пример Pong.
Тот самый аркадный автомат 1972 года, где
не было кода вообще.

🎮 Всё работало на дискретной логике:

  • ⏱️ счётчик положения мяча,
  • 🧱 логика столкновений,
  • 💡 подсистема отображения очков —
    всё параллельно, без функций, без стека, без ОС.

Играла же! Миллионы копий.

В том же году C только обретал форму — и уже предлагал “единственно правильный” способ мышления.
Но Pong показал, что
параллелизм и асинхронность естественны для машин, а не исключение.

🧠 Мы живём в 2025-м, но думаем как в 1972-м

Сегодня:

  • 💸 CPU дешевле Arduino.
  • 🌐 сети вездесущи, от умных ламп до спутников.
  • ⚙️ каждое устройство работает асинхронно, реагируя на события.
  • 🧠 у нас тысячи ядер — от GPU до TPU.

А программируем мы всё это синхронными функциями.
Создаём многопоточность как костыль, эмулируем асинхронность на синхронной модели.

Пишем программы, как будто у нас всё ещё один дорогой CPU, который нужно делить между пользователями.

🪄 Что, если начать заново?

Пол предлагает мысленный эксперимент:

“Представьте, что мы проектируем вычислительную модель не в 1972, а в 2025 году.”

Какими были бы “атомарные единицы вычисления” тогда?

  • 🔋 Не функции, а акторы — автономные процессы, обменивающиеся сообщениями.
  • 💬 Не стеки, а каналы и очереди событий.
  • 🧩 Не монолитный поток, а рои микросервисов, взаимодействующих напрямую.

Теоретически это уже реализовано — в Erlang, Elixir, Go, Rust async, Actor Framework.
Но их считают “особенными” — не стандартом, а “экзотикой”.

⚡ Программирование после функций

Я согласен с Полом: функция — это не истина, а исторический артефакт.
Когда-то она помогла упростить мышление, но теперь мешает отражать
естественный параллелизм реального мира.

Вместо main() и return мы могли бы писать:
🕸️ «Эти пять узлов реагируют на события, обмениваются сообщениями, живут независимо».

Код стал бы ближе к физике: к миру, где всё происходит одновременно, а не по вызову очередной функции.

🚀 Что это значит для будущего

Если пересмотреть саму модель вычислений, можно построить:

  • 🤖 системы без операционных систем, где процессы — равноправные акты вычислений;
  • 🧩 платформы без потоков, где взаимодействие задаётся через контракты сообщений;
  • 🌐 распределённые языки, где “параллельно” — это норма, а не флаг компиляции.

Тогда архитектуры CPU изменятся снова — только теперь под новые модели, где сеть, событие и реакциястанут первичными, а не вторичными.

💭 Личное послесловие

Мы десятилетиями строили кремний под C и теперь боимся выйти из клетки, которую сами сделали уютной.
Но ведь
освободиться не значит разрушить — это значит вспомнить, что у нас есть выбор.

Может быть, новая эра начнётся не с квантовых компьютеров, а с того, что кто-то решит:

“А давайте перестанем думать функциями.”

🔗 Источники и ссылки: