О секретах эффективного программирования на C++, новой версии языка C++0x и других актуальных вопросах современной программной инженерии Бьярн Страуструп рассказал журналу «Открытые системы».
— Как создавался язык C++?
Причина, побудившая к созданию C++, состояла в том, что в моей научной работе мне необходимо было строить системы, которые требовали высокой производительности и одновременно должны были хорошо понимать особенности аппаратной платформы. Для решения этих задач язык Си был практически идеален, однако при этом я должен был разрабатывать очень сложные, большие системы. И тогда и сейчас я убежден в том, что с этой задачей Си не справляется должным образом. С другой стороны, был язык Simula, созданный в 1967 году норвежским ученым Кристеном Нюгордом, который разработал основы объектно-ориентированного программирования и проектирования. Данный язык обеспечивал базовые механизмы объектно-ориентированного программирования, которые мне очень нравилось использовать для организации кода, поэтому я взял из этого языка понятия класса, классовой инвариантности и добавил их в Си.
Средства Simula для создания пользовательских типов, представления заданных программистом абстракций непосредственно в коде действительно очень хороши и позволяют решать сложные задачи, писать большие сложные системы, создавать удобный в сопровождении код — именно к этому я и стремился в новом языке. И, надо признать, что язык C++ сделал эти идеи вехами магистрали всей ИТ-индустрии. Когда я начал им заниматься в 80-х годах, объектно-ориентированное программирование никого не интересовало, за исключением нескольких человек в академической среде. А те специалисты в индустрии, которые что-то слышали об этом, были убеждены, что объектно-ориентированный подход слишком сложен для программистов, его реализация потребляет чересчур много ресурсов, и потому он не может быть применен к решению реальных проблем и вообще является слишком специализированным, а следовательно, бесполезным. Все это, конечно, неверно, но мне пришлось приложить немало усилий, чтобы справиться с подобными предубеждениями. На объектно-ориентированном языке программирования возможно создание качественных, высокопроизводительных, удобных в сопровождении систем, и делать это могут обычные, правда хорошо подготовленные, программисты, а не гении.
Я начал работу над C++, будучи сотрудником Bell Laboratories, и мои коллеги оказывали мне большую поддержку в выявлении проблемных мест, затрудняющих работу. В 1985 году вышел первый коммерческий релиз С++, и тогда же увидела свет моя первая книга об этом языке.
— Почему возникла необходимость в новой версии языка – С++0х?
Когда С++ уже получил широкое применение, по инициативе ряда крупных корпораций начался процесс его официальной стандартизации, чтобы исключить зависимость от отдельных людей или компаний. Сначала этот процесс проходил в национальных организациях по стандартизации США, затем перешел на международный уровень, и в 1998 году была опубликована первая версия стандарта ISO для С++.
Прошло 12 лет, за это время мы многому научились. Меняются проблемы в мире, которые требуют решения с помощью программ, поэтому любой живой язык должен меняться, чтобы соответствовать новым задачам, эффективно исправлять ошибки и т. д. В новой версии мы реализуем те идеи, которые возникали в ходе исследований и практического опыта за последние годы. Процесс подготовки нового стандарта успешно продвигается, и в 2011 году стандарт будет передан на утверждение в ISO.
Появление любой новой версии языка направлено на повышение производительности, надежности программ на C++, облегчение реализации стратегии обработки ошибок и т. д. Все это очень важно для эффективного применения как уже существующих версий языка, так и его новой версии, поскольку мы не делали в ней кардинальных изменений, а совершенствовали язык таким образом, чтобы позволить программистам лучше использовать эти стратегии.
— Каковы основные этапы процесса стандартизации новой версии С++?
Все начинается с идей новой версии, из них формируется черновой вариант стандарта, который предоставляется заинтересованным специалистам по всему миру. С учетом их откликов формируется окончательный черновой вариант (final committed draft), который рассматривается национальными комитетами в разных странах. После того как будут учтены все их замечания и рекомендации, стандарт передается в ISO. Финальная черновая версия C++0x была выпущена весной 2010 года, а 12 марта 2011 года мы предоставим ее в ISO, надеясь в скором времени получить официальный утвержденный стандарт.
— Получали ли вы какую-либо обратную связь от российского сообщества разработчиков?
Разработчики из России и Восточной Европы участвовали в обсуждении в основном в удаленном режиме, хотя российская делегация и приезжала на две очные встречи по С++0х. Но постоянно и на формальной основе Россия не была представлена в процессе стандартизации C++0x. Мне кажется неправильным, что российские специалисты не имели возможности оказать реальное влияние на создание нового стандарта. Это не соответствует тому уровню, который имеет страна в области программной инженерии, по крайней мере судя по моим наблюдениям.
— Появятся ли у C++0x новые области применения?
Язык C++ используется главным образом на уровне инфраструктуры, для разработки систем с ресурсными ограничениями и систем с высоким уровнем надежности. Эти возможности языка, естественно, сохраняются в будущей версии. Базовая область применения C++ – это системное программирование, а это очень широкая сфера применений. Практически все, что вы делаете на компьютере, так или иначе затрагивает программы на С++: беспроводные интерфейсы на всех уровнях, браузеры, интерпретаторы языка JavaScript, виртуальные машины Java, реализации языка C#, ПО для мобильных телефонов, фотокамер – все это написано на C++. Сложнее найти системные области, где нет C++.
Я не думаю, что с выходом новой версии что-либо изменится с точки зрения применения С++, и не имеет смысла искусственно продвигать этот язык в другие области. C++0x создается не для того, чтобы прорваться в новые домены, а для того, чтобы усовершенствовать язык для его более эффективного использования в сфере инфраструктурных применений, где очень много работы и постоянно появляются новые задачи. Например, программное обеспечение, встроенное в гаджеты. Возьмем мои наручные часы, они способны реагировать на мое состояние – вот сейчас, например, я даю интервью и немного нервничаю. В них есть компьютер, и в нем работают программы. Гаджеты становятся сегодня все более сложными, поэтому их управляющее ПО должно хорошо понимать особенности аппаратного обеспечения, чтобы иметь возможность реализовать задачи такого уровня сложности. А это как раз то, что заложено в дизайне C++. Этот язык прекрасно справляется с такими задачами и востребован именно для них, и в новой версии эти возможности совершенствуются.
— Какую эволюцию, по вашему мнению, претерпели языки программирования за последние 20 лет и каковы ваши прогнозы?
По моим наблюдениям, объектно-ориентированное программирование становится универсальным: его изучают в университетах, используют для разработки приложений, применяют в системном программировании. И если взять языки, которые появились позже, такие как Java и С#, то они многое заимствуют из С++. Мы много работали над тем, чтобы обеспечить возможности для разработки высокопроизводительных систем и систем для встроенных применений, а здесь используются принципы обобщенного программирования. Долгое время я сталкивался с большими проблемами, пытаясь убедить людей в его преимуществах, а сейчас вижу, что и Java и C# реализуют близкие возможности, — очевидно, что эти идеи находят признание на рынке. В C++0x эти принципы получат еще более сильную поддержку, и, надеюсь, у нас появятся новые последователи.
Не думаю, что в области системного программирования возникнет что-либо радикально новое. Из важных событий за последние 25 лет я могу назвать распространение подходов программирования в стиле Си, объектно-ориентированного программирования и обобщенного программирования. Если говорить о C++, то одной из наиболее инновационных концепций этого языка являются стандартные библиотеки шаблонов, придуманные моим давним другом Александром Степановым.
— Какие проблемы перед языками программирования ставит мультиядерная архитектура процессоров?
Параллелизм всегда был популярен, но сейчас его реализация становится действительно насущной потребностью. Моя диссертация была посвящена коммуникациям и контролю в распределенных вычислениях, то есть задаче с параллелизмом. Я работаю над этим более 20 лет, и сегодня мы должны более тщательно подходить к созданию систем, использующих множество компьютеров и множество процессов. Одна из задач, которую мы пытаемся решить в C++0x, состоит в том, чтобы реализовать способ программирования с механизмами многопоточности (threads и locks) для обеспечения параллелизма, поддерживая те же самые типы данных, которые используются при написании обычного кода.
Кроме того, в новом стандарте будет обеспечена переносимость параллельного кода между различными архитектурами. И наконец, в C++0x закладываются основы для самостоятельного построения моделей параллелизма более высокого уровня. Я считаю, что для эффективного управления распараллеливанием задачи нужно уметь моделировать ее на более высоком уровне, чем тот, который допускает модель потоков. Мы должны иметь возможность увидеть, какие проблемы могут возникнуть, если реализуется распараллеливание в условиях ограничений. Для этого простейших механизмов threads и locks будет недостаточно. Причем надо понимать, что не существует одной-единственной модели параллелизма: различные прикладные области и разные системные уровни требуют разных моделей. Наша задача – правильно идентифицировать нужную модель. C++0x закладывает основы для решения этой задачи. Если вы понимаете специфику своей задачи и можете определить необходимый тип параллелизма, то C++0x даст вам возможность эту задачу реализовать.
Бьярн Страуструп: «Профессия программиста за 30 лет завоевала большую популярность, но меня разочаровывает сложившийся в ней к сегодняшнему дню уровень профессионализма — очень много низкокачественной работы» |
— Можно ли решить проблему параллелизма на уровне языка программирования?
Да, если язык правильно спроектирован. Ни один из языков, созданных в 80-е годы, не мог должным образом обрабатывать параллелизм. Была попытка создать и использовать одну модель параллельного программирования, но она не может удовлетворить все возможные случаи параллелизма. В C++0x мы пошли другим путем – в языке реализуется набор примитивов, на базе которых можно строить различные модели. Если необходимо распараллелить программу, чтобы реализовать высокоскоростные вычисления, то будет построена одна модель; если нужно построить параллельную систему с синхронизацией на базе передачи сообщений, модель будет другой. Мы предоставляем готовую стандартную базу, дающую возможность охватить множество задач и строить собственные модели в виде библиотек, которые будут выше уровнем, чем привычные модели на базе механизмов threads и locks.
Я считаю такой подход правильным – реализовать в языке программирования мощные инструменты конструирования параллелизма. Если создавать специальные языки для задач параллелизма, то мы получим очень сложные абстракции, а писать программы в низкоуровневом стиле для высокоуровневых задач параллелизма не имеет смысла. Нужно иметь возможности делать и то и другое.
— Существует ли связь между методикой разработки и языком программирования?
Выявить такие связи сложно, и вряд ли здесь существует какое-либо правило или система. Есть методы разработки, приверженцы которых решительно предпочитают языки с динамической типизацией, придавая гораздо меньшее значение формальным спецификациям, системе формальных типов. Если вы хотите строить систему, которая будет развиваться «органически», не поддерживая явных обязательств между различными группами, думаю, вам не стоит обращаться к C++, потому что этот язык базируется на четком представлении о том, что вы делаете, и однозначно определяет, какие должны быть типы и как они используются.
Если же нужно создавать систему, хорошо представляя себе детали реализации, то имеет смысл использовать С++, поскольку этот язык имеет все возможности для того, чтобы контролировать такие детали и учитывать особенностях аппаратного обеспечения, даже самого необычного. На самом деле, если найти реальную зависимость между методологией проектирования и языком программирования, то, я думаю, это даст возможность выявить связи между подходами к проектированию, реализации и применению ПО. Вы не будете проектировать высокоуровневую банковскую систему тем же способом, каким, например, реализуется стратегия управления ресурсами в разработке ПО для наручных часов. Поэтому, возможно, имеет смысл искать корреляцию между стилем разработки и используемым языком программирования.
— Что изменилось в профессии разработчика за 30 лет и как можно охарактеризовать ее современное состояние?
Профессия разработчика ПО за этот период завоевала большую популярность, но меня разочаровывает сложившийся в ней уровень профессионализма — очень много низкокачественной работы, нет единого представления о том, каким набором знаний должны владеть разработчики и каким идеалам они должны следовать. В конце концов, все это больно ударит по всему обществу. Если кто-то говорит, что занимается разработкой программ, Web-дизайном, другими областями программной инженерии, то из того, что он произносит эти слова, еще не следует реальный профессионализм в этой области.
Мне бы хотелось видеть более образованных, более квалифицированных специалистов, способных завоевывать авторитет уровнем своих знаний и навыков. Если вы предложите американскому врачу использовать некачественное оборудование в лечении пациентов, он сразу откажется. Он никогда не пойдет на нарушение стандартов, принятых в его профессии. Было бы замечательно, если бы и в области разработки ПО мы достигли такого уровня профессионализма, когда разработчик отказывается делать что-либо, потому что это идет вразрез с принятой практикой. И вы не сможете его заставить, потому что, если он нарушит принятые стандарты, то будет наказан, да и вы тоже. Нам необходимы более строгие критерии профессионализма, аналогичные предъявляемым к лицензированным инженерам или врачам. В компьютерной области специалисты должны иметь не менее высокий уровень образования и ответственности, и, как и в медицине, нужно дифференцировать требования к квалификациям специалиста в зависимости от того, на каком уровне профессиональной карьеры он находится.
— Что вас еще интересует помимо C++?
Этот язык – основной инструмент для моих исследований. Меня интересуют приложения на С++, потому что именно они определяют значимость того или иного языка. И я по-настоящему счастлив, что С++ находит такое широкое применение в самых разных проектах. Недавно я обнаружил, что программная начинка машины моей жены написана на С++. Это действительно впечатляет — C++ действительно находится в фарватере ИТ-индустрии.
Я убежден, что не удастся совершенствовать язык, не зная его применений. Приложения дают толчок для развития различных направлений исследований, которыми я занимаюсь со своими студентами, например, сейчас мы ведем проект по средствам программирования более надежного ПО для космических аппаратов. Это сама по себе важная исследовательская тема, но одновременно и возможность использовать C++.
Я также пытаюсь работать над средствами анализа, создавать инструменты, которые анализируют код, чтобы получить лучшее представление о том, что, где и как реализовано. Это должно помочь в решении проблемы появления некачественных программ, автоматизировать процесс выявления возможностей модернизации систем, приведения их к более современному стилю программирования.