Бьерн Страуструп — человек, который определил облик современного цифрового мира, создав язык программирования C++. В беседе с Лексом Фридманом он размышляет о философии дизайна, эволюции абстракций и о том, почему в мире критических систем нет места «пушистому» и неточному коду.
🕰️ От суперэллипсов к системному мышлению: истоки 1:32
Творческий путь Бьерна Страуструпа начался в университете со второй попытки изучения компьютерных наук . Его первой программой на языке Algol 60 был расчет формы суперэллипса с последующим выводом звездчатых паттернов на бумажный принтер . Несмотря на знакомство с Fortran и Pascal, настоящий интерес у Страуструпа вызвали низкоуровневые материи: ассемблер и микрокод . Именно работа с «железом» позволила ему оплатить магистерскую степень и сформировала понимание того, как работает машина.
Переломным моментом стало знакомство с языком Simula. По словам Страуструпа, именно в Simula были изобретены ключевые концепции объектно-ориентированного программирования (ООП):
- Классы и наследование.
- Runtime-полиморфизм.
- Система типов, которая была строже, чем в Pascal, но при этом давала свободу расширения .
Страуструп отмечает, что создатели Simula — Кристен Нюгор и Оле-Йохан Даль — были математиками и мыслили категориями «множеств» и «классов», что и дало название основной сущности ООП . Главный урок, который Бьерн вынес из Simula: программа может расти линейно по сложности, а не по квадрату её размера, если её правильно модуляризировать .
🧬 Краткая история языков через призму человека 6:25
Рассматривая историю программирования, Страуструп выделяет Fortran как величайший прорыв . До него код писался под конкретную машину. Команда IBM создала «переводчик формул», который позволил людям (физикам и инженерам) писать в терминах математики, а не команд процессора. Это принесло в мир софта переносимость (portability) .
По мнению гостя, развитие языков идет по пути приближения к человеческому уровню абстракции без потери машинной эффективности . Он делит языки на несколько категорий:
- Бизнес-ориентированные: COBOL.
- Академически чистые: Algol 60, который Страуструп считает технически безупречным, но практически бесполезным из-за недостатка гибкости .
- Динамические и функциональные: Lisp и Smalltalk. Страуструп признает их значимость, но отмечает, что они часто не подходят для условий с жесткими ограничениями по памяти и надежности .
🏗️ Философия C++: Принцип нулевых накладных расходов 25:04
C++ создавался для задач, где надежность и производительность неразрывны. По словам Страуструпа, если система тратит слишком много времени на интерпретацию вызовов, она не успеет обработать сигнал в телефонной сети или вовремя среагировать на нажатие тормоза в автомобиле .
Ключевой догмой языка стал Zero-Overhead Principle (принцип нулевых накладных расходов):
- То, чем вы не пользуетесь, не должно стоить вам ничего.
- То, чем вы пользуетесь, вы не могли бы написать на более низком уровне (например, на языке C) эффективнее .
В качестве примера Страуструп приводит умножение матриц: на C++ можно создать абстракцию, которая за счет оптимизаций компилятора и устранения временных объектов будет работать быстрее, чем код на Fortran или рукописный код на C .
🛠️ Ошибка как искусство и статический анализ 29:45
Страуструп убежден, что безопасность системы достигается через упрощение, а не через бесконечное наслоение проверок . «Если то, как вы думаете о проблеме, не отражено в коде напрямую — в системе есть потерянное звено, существующее только в вашей голове», — утверждает создатель C++ . Прямое выражение намерений в коде делает его поддерживаемым и тестируемым.
Для борьбы со «сложностью, ведущей к багам», Бьерн продвигает C++ Core Guidelines — набор правил, минимизирующих ущерб от ошибок . Он выделяет два подхода к проверке кода:
- Динамический: Тестирование во время выполнения (дорого и не всегда покрывает все случаи).
- Статический анализ: Анализ кода без запуска. Страуструп считает его будущим индустрии . С его помощью можно отслеживать утечки ресурсов и нарушения логики типов до того, как программа попадет на устройство в условной Боготе, где нет программиста для отладки .
🗳️ Демократия стандартизации: C++11, 14, 17 и 20 1:18:14
История стандартизации C++ началась в 1989 году, когда представители IBM и HP убедили Страуструпа, что язык должен принадлежать миру, а не одной корпорации . Процесс идет под эгидой ISO и напоминает политическую борьбу.
- Циклы обновления: Первые стандарты (98 и 11) создавались десятилетиями. Страуструп называет это «эффектом второй системы», когда амбиции затягивают сроки .
- Новый ритм: Сейчас комитет перешел на жесткий трехлетний цикл (C++14, 17, 20). Если фича не готова — она ждет следующего «поезда» .
Одной из самых ожидаемых функций C++20 Страуструп называет Concepts (Концепты) . Это предикаты времени компиляции, которые позволяют накладывать ограничения на параметры шаблонов (например, требовать, чтобы тип был «сортируемым»). Это решит проблему «ужасных сообщений об ошибках» при работе с шаблонами, над которой Бьерн бился почти 30 лет .
🧘 Философский взгляд на будущее и AI 1:28:32
На вопрос о самом красивом элементе C++ Страуструп отвечает без колебаний: конструкторы и деструкторы . Эта пара (концепция RAII) позволяет управлять ресурсами без вмешательства сборщика мусора (Garbage Collector), обеспечивая предсказуемую производительность.
Обсуждая современные веяния в области AI и машинного обучения, Бьерн проявляет осторожность:
- Профессионализм против доступности: Он не согласен с тезисом, что «программировать должны все». Системы управления самолетами или ядерными реакторами должны писать инженеры, использующие острые и точные инструменты, а не «фуззи-логику» (нечеткую логику) .
- Риски AI: Страуструпа пугает идея передачи контроля от AI человеку в критической ситуации. Если автопилот не справляется и просит водителя вмешаться, у человека, который читал книгу, есть всего пара секунд на принятие решения. Это он считает крайне опасной конструкцией .
Завершая беседу, Страуструп отмечает, что единственное, что удерживает его в индустрии 40 лет — это люди и то, что они делают с помощью его языка: от марсоходов до систем очистки дизельных двигателей . Его цель остается прежней: сделать C++ еще лучше, сохраняя верность принципам аппаратной эффективности и мощной абстракции.