— Ровно 30 лет назад состоялся релиз CFront 1.0 и первый выпуск книги «Язык программирования C++». Было ли важным выпустить их в один и тот же день?
— Я не знаю, было ли это важным, но в то же время это было хорошей идеей. О том, какой день станет удачным для релиза, меня спрашивали и AT&T (компания, продающая компилятор), и Addison-Wesley (издатель книги). Я назвал 14 октября, поскольку должен был выступать на конференции Ассоциации по вычислительной технике США и мог бы представить его там.
— Это сделало вас дважды автором и, возможно, потребовало вдвое больше работы. Но помогло ли написание книги разработать лучший язык?
— Это была необходимая книга. Крошечное, но постоянно растущее сообщество нуждалось в ней. Мысль написать эту книгу пришла даже не в мою голову. Эту идею мне подал Ал Ахо, впоследствии мой сосед в Bell Labs (Bell Labs — компания, как и AT&T). Я абсолютно недооценил объём работ над «Языком программирования С++». Писать на совершенно новую тему очень сложно. Я узнал многое о языке, пытаясь объяснить его людям. Я изменял С++, и объяснение становилось проще благодаря тому, что сам язык становился более логичным или более функциональным. Написание инструкции – очень хороший способ проектирования.
— Вы помните, что чувствовали в тот понедельник, 14 октября 1985 года, когда представили свой семинар «Введение в C++»?
— Нет, не помню. На самом деле, из того, что происходило в 1980-х, я помню сравнительно немного. Я был тогда очень занят. В период с 1979 по 1991 число программистов, использующих С++, удваивалось каждые 7,5 месяцев. Такой рост порождает очень большое количество работы. Сегодня количество пользователей С++ достигает 4.4 млн (согласно исследованию JetBrains). Это был важный для меня день, но единственное, что я помню, — это как я получал на руки первую копию моего первого издания.
— Как вы тогда видели С++? Каким представляли его будущее?
— Конечно, я не предполагал такого невероятного, временами взрывного роста языка. Я сконцентрировался на его улучшении, изучал написание библиотек, улучшал компилятор и объяснял, как всем этим пользоваться.
С другой стороны, многое, что мы видим в С++ сегодня, уходит корнями в те дни. Классы, объявление функций (прототипы функций), конструкторы и деструкторы были частью самой первой версии. Пару лет спустя я добавил встраиваемые функции и перегруженный оператор присваивания. Тогда же появилось различие между инициализацией и присваиванием. Общая перегрузка операторов возникла позднее (1983 или около того), тогда же, когда и виртуальные функции. Люди часто забывают, что параметризованные типы данных были внедрены с самого начала. Я использовал Cfront с заголовком <generic.h>. В течение пары лет я думал, что для обобщённого программирования макросов будет достаточно. Я очень ошибался, зато был прав, считая, что нужно использовать параметризованные типы и функции с (другими) типами. Результатом этого стали шаблоны (1988).
Основной идеей было обогатить язык возможностями, которые позволят пользователям стоить мощные, красивые и эффективные абстракции. Это противоречит идее поддержки абстракций, специфичных для приложений, в самом языке. С++ по сей день использует базовую модель вычислительной машины из языка С, что позволяет создавать портируемые программы, эффективно и целесообразно использующие аппаратное обеспечение. Мы также работаем над постепенным улучшением С++ для поддержки построения эффективных абстракций.
— Большая часть попыток разработать хороший язык программирования терпит неудачу. Каково было чувствовать, что всё больше и больше программ вокруг вас написаны на языке, созданном вами? И что, по вашему мнению, стало причиной такого успеха?
— Радостно и в то же время страшновато. Приятно чувствовать, что ты разработал что-то полезное для стольких людей, но это и огромная ответственность, особенно с развитием языка. Если мы добавляли удачные и полезные возможности — мы делали этот мир лучше, но стоило ошибиться — и вред был бы очень большим. И всё же я думаю, что доработка С++ была чередой улучшений. Не все идеи были удачными, но большая часть оказалась очень полезной для большинства, а провалы не были фатальными.
С каждым годом С++ становился всё лучше. Сейчас С++ несравнимо более полезен, чем релиз 1.0, выпущенный в 1980. Мы можем писать более красивый код, и он работает быстрее (даже если учесть разницу в быстродействии оборудования).
Причина успеха? Их было много. Чтобы добиться успеха, язык должен быть достаточно хорошим во всём, что нужно пользователям, и при этом не должен быть провальным ни в чём. Недостаточно быть лучшим в мире в одной-двух вещах.
В своей основе С++ был и остаётся нацеленным на критические задачи в системах, где производительность и доступ к оборудованию имеют критическое значение (так называемое системное программирование), и особенно системах, где необходимо управление сложностью. Во-вторых, С++ постоянно эволюционировал в соответствии с проблемами окружающего мира, он рос. Он никогда не был «башней из слоновой кости». В конце концов, мне кажется важным, что С++ никогда не жил за счёт рекламы: я давал относительно скромные обещания и сдерживал их.
— Вы посвятили С++ большую часть жизни и продолжаете активно работать над ним по сей день. Что стало причиной такой самоотдачи? Не хотелось ли вам начать работу над новым языком программирования?
— Я неоднократно пытался выбраться из разработки С++, но он всегда затягивал меня обратно. Я чувствую, что работа над С++ — мой главный шанс сделать что-то стоящее. Таким образом, С++ — мой главный инструмент для исследования и разработки. Уроки, выученные мной и другими членами сообщества С++, внедряются в язык и библиотеки, где они могут помочь уже миллионам людей.
Конечно, я мечтал о создании нового, более совершенного языка программирования, но нужно очень много времени, чтобы пройти путь от набора идей до полезного инструмента. Сложно соревноваться с С++ на его поле, а большая часть моих интересов – это то, в чём С++ хорош.
Кроме того, большинство новых языков терпит неудачу. Очень просто сделать ошибку, разрабатывая что-либо с нуля. Успешные большие системы, как правило, вырастают из более мелких работающих систем.
— Что изменилось за 30 лет? Что осталось прежним?
— Модель машины и стремление к большей поддержке абстракций остаются неизменными и такими же важными, как и всегда. Это же можно сказать и о внимании, которое уделяется статической (времени компиляции) системе типов данных.
Использование исключений и шаблонов было значительно усовершенствовано, и теперь мы можем писать намного более красивый и функциональный код. И то, и другое появилось как возможные направления развития С++ в документе, который я написал для журнала IEEE Software в 1996 году. Исключения вместе с конструкторами и деструкторами стали основой безопасного управления ресурсами (RAII). Шаблоны способствовали успешному развитию библиотеки STL Алекса Степанова и его идей обобщённого программирования. Буквально в этом году мы разработали прямую языковую поддержку концептов, чтобы дополнить возможности шаблонов С++.
В конце 1980-х люди были помешаны на использовании иерархии классов. Меня же больше интересовало соединение различных стилей программирования в гармоничное целое. В первом издании своей книги я (преднамеренно) не употреблял термин «объектно-ориентированное программирование», а также давал выступления с названиями в духе «С++ — это не просто объектно-ориентированный язык программирования».
Позже публика проявила огромный интерес к шаблонному и мета-программированию, иногда забывая, что самое простое решение — часто самое лучшее. Я до сих пор ищу способ передать своё понимание элегантного программирования, основанного на синтезе особенностей языка и возможностей библиотек.
Ещё одна вещь, которая, по моему мнению, будет иметь большое значение в течение нескольких следующих лет — разработка инструкций для инструментов и библиотек. Это поможет сообществу С++ намного быстрее осваивать новые возможности. Один совершенно новый аспект — это то, что мы сможем устранить висячие указатели, открывая возможности для программирования, абсолютно безопасного с точки зрения типов и управления ресурсами. В частности, мы устраняем все утечки ресурсов без сборщика мусора (потому что мы не производим мусора), так что нам не придётся сталкиваться с потерями производительности, хотя безопасность увеличивается. И мы не ограничиваем область применения С++.
Я надеюсь, что всё это поможет решить проблему, существовавшую в С++ всегда: недостаток обучения и понимания С++ даже среди людей, его использующих. С самого начала существовала тенденция описывать С++ как странную версию чего-то ещё. Например, до сих пор иногда говорят, что С++ — это «несколько новых фич, добавленных к С» или «небезопасный Java, в котором не хватает некоторых современных возможностей». Это наносит огромный вред распространению С++.
Моя новая книга «Обзор С++» тоже может помочь. Я рассказываю всё о С++ и его стандартной библиотеке на довольно высоком уровне, при этом на меньшем количестве страниц, чем в книге Брайана Кернигана и Денниса Ритчи «Язык программирования Си» (также известна как K&R). Моя книга рассчитана скорее на уже состоявшихся программистов, чем на новичков.
Релоцировались? Теперь вы можете комментировать без верификации аккаунта.