Бьерн Страуструп: «C++ — это инструмент для тех, кто хочет управлять реальностью»

Lex Fridman 1,2 млн 1 ч 47 мин 5 мин 07.11.2019
Главное

Бьерн Страуструп — человек, который определил облик современного цифрового мира, создав язык программирования C++. В беседе с Лексом Фридманом он размышляет о философии дизайна, эволюции абстракций и о том, почему в мире критических систем нет места «пушистому» и неточному коду.

🕰️ От суперэллипсов к системному мышлению: истоки 1:32

Творческий путь Бьерна Страуструпа начался в университете со второй попытки изучения компьютерных наук . Его первой программой на языке Algol 60 был расчет формы суперэллипса с последующим выводом звездчатых паттернов на бумажный принтер . Несмотря на знакомство с Fortran и Pascal, настоящий интерес у Страуструпа вызвали низкоуровневые материи: ассемблер и микрокод . Именно работа с «железом» позволила ему оплатить магистерскую степень и сформировала понимание того, как работает машина.

Переломным моментом стало знакомство с языком Simula. По словам Страуструпа, именно в Simula были изобретены ключевые концепции объектно-ориентированного программирования (ООП):

Страуструп отмечает, что создатели Simula — Кристен Нюгор и Оле-Йохан Даль — были математиками и мыслили категориями «множеств» и «классов», что и дало название основной сущности ООП . Главный урок, который Бьерн вынес из Simula: программа может расти линейно по сложности, а не по квадрату её размера, если её правильно модуляризировать .

🧬 Краткая история языков через призму человека 6:25

Рассматривая историю программирования, Страуструп выделяет Fortran как величайший прорыв . До него код писался под конкретную машину. Команда IBM создала «переводчик формул», который позволил людям (физикам и инженерам) писать в терминах математики, а не команд процессора. Это принесло в мир софта переносимость (portability) .

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

  1. Бизнес-ориентированные: COBOL.
  2. Академически чистые: Algol 60, который Страуструп считает технически безупречным, но практически бесполезным из-за недостатка гибкости .
  3. Динамические и функциональные: Lisp и Smalltalk. Страуструп признает их значимость, но отмечает, что они часто не подходят для условий с жесткими ограничениями по памяти и надежности .

🏗️ Философия C++: Принцип нулевых накладных расходов 25:04

C++ создавался для задач, где надежность и производительность неразрывны. По словам Страуструпа, если система тратит слишком много времени на интерпретацию вызовов, она не успеет обработать сигнал в телефонной сети или вовремя среагировать на нажатие тормоза в автомобиле .

Ключевой догмой языка стал Zero-Overhead Principle (принцип нулевых накладных расходов):

  1. То, чем вы не пользуетесь, не должно стоить вам ничего.
  2. То, чем вы пользуетесь, вы не могли бы написать на более низком уровне (например, на языке C) эффективнее .

В качестве примера Страуструп приводит умножение матриц: на C++ можно создать абстракцию, которая за счет оптимизаций компилятора и устранения временных объектов будет работать быстрее, чем код на Fortran или рукописный код на C .

🛠️ Ошибка как искусство и статический анализ 29:45

Страуструп убежден, что безопасность системы достигается через упрощение, а не через бесконечное наслоение проверок . «Если то, как вы думаете о проблеме, не отражено в коде напрямую — в системе есть потерянное звено, существующее только в вашей голове», — утверждает создатель C++ . Прямое выражение намерений в коде делает его поддерживаемым и тестируемым.

Для борьбы со «сложностью, ведущей к багам», Бьерн продвигает C++ Core Guidelines — набор правил, минимизирующих ущерб от ошибок . Он выделяет два подхода к проверке кода:

🗳️ Демократия стандартизации: C++11, 14, 17 и 20 1:18:14

История стандартизации C++ началась в 1989 году, когда представители IBM и HP убедили Страуструпа, что язык должен принадлежать миру, а не одной корпорации . Процесс идет под эгидой ISO и напоминает политическую борьбу.

Одной из самых ожидаемых функций C++20 Страуструп называет Concepts (Концепты) . Это предикаты времени компиляции, которые позволяют накладывать ограничения на параметры шаблонов (например, требовать, чтобы тип был «сортируемым»). Это решит проблему «ужасных сообщений об ошибках» при работе с шаблонами, над которой Бьерн бился почти 30 лет .

🧘 Философский взгляд на будущее и AI 1:28:32

На вопрос о самом красивом элементе C++ Страуструп отвечает без колебаний: конструкторы и деструкторы . Эта пара (концепция RAII) позволяет управлять ресурсами без вмешательства сборщика мусора (Garbage Collector), обеспечивая предсказуемую производительность.

Обсуждая современные веяния в области AI и машинного обучения, Бьерн проявляет осторожность:

Завершая беседу, Страуструп отмечает, что единственное, что удерживает его в индустрии 40 лет — это люди и то, что они делают с помощью его языка: от марсоходов до систем очистки дизельных двигателей . Его цель остается прежней: сделать C++ еще лучше, сохраняя верность принципам аппаратной эффективности и мощной абстракции.

💬 Цитаты

«Если то, как вы думаете о проблеме, не отражено в коде напрямую — в системе есть потерянное звено.»

Бьерн Страуструп 30:41

«Стандартизация — это ужасно, как и демократия. Худшая форма, за исключением всех остальных.»

Бьерн Страуструп 1:22:30
👥 Спикеры
📚 Упомянутые книги
🔗 Упомянутые сайты и проекты
📖 Термины
RAII
Resource Acquisition Is Initialization — программная идиома, связывающая управление ресурсом со временем жизни объекта.
Concepts
Новая фича C++20, позволяющая проверять свойства типов во время компиляции.
Zero-Overhead
Принцип, согласно которому абстракции в языке не должны замедлять программу по сравнению с низкоуровневым кодом.
📊 Цифры
🗓 Хронология
  1. 1979 Бьерн Страуструп начал работу над 'C with Classes' в Bell Labs.
  2. 1983 Выход компилятора Cfront и официальное появление названия C++.
  3. 1989 Начало процесса формальной стандартизации языка в ISO.
  4. 1998 Публикация первого международного стандарта ISO C++.
  5. 2011 Выход C++11 — масштабного обновления, изменившего облик языка.
  6. 2020 Ожидаемый выход стандарта C++20 с поддержкой концептов.
⚖️ Другая сторона
Технологии и IT Bjarne Stroustrup C++ ISO C++ Simula RAII