Бьерн Страуструп: «У C++ есть значительные преимущества по сравнению с языками, основанными на виртуальных машинах, когда необходимо жестко контролировать быстродействие, надежность, ресурсы и уровень сложности» |
Бьерн Страуструп начал работу над C++ в 1979 году в компании Bell Labs. Изначально язык назывался C with Classes и создавался в рамках эксперимента в области распределенных вычислений. За прошедшие с тех пор более трех десятков лет C++ стал одним из самых популярных языков программирования.
Страуструп, ныне профессор Техасского университета, побеседовал с редактором InfoWorld Полом Крилом, ответив на вопросы о прошлом, настоящем и будущем C++, который недавно вышел в новой версии, C++ 11.
Для каких задач изначально разрабатывался C++?
Как общеупотребительный инструмент создания сложных приложений, от которых требуется высокое быстродействие. Конкретно мне в тот момент нужно было подготовить кое-какие симуляции и разработать программное обеспечение уровня физических устройств для эксперимента в области распределенных вычислений, который проводился в Bell Labs. Вдохновение я во многом почерпнул в работе с языками Simula и BCPL.
В каком состоянии сегодня C++ 11 и какую роль вы сыграли в его разработке?
Спецификации C++ составляются соответствующим комитетом ISO. Я вхожу в число учредителей этого комитета и являюсь председателем рабочей группы, которая оценивает предложения по новым особенностям языка. Я также предлагаю комитету дальнейшие направления работы. В конце 2011 года C++ 11 стал международным стандартом, и сейчас разработчики компиляторов активно реализуют его поддержку. На сегодня уже можно пользоваться многими новшествами и всей новой стандартной библиотекой.
Каковы, на ваш взгляд, самые важные особенности C++ 11? Возможно, средства поддержки многопоточной обработки?
Несомненно, стандартизованные и предотвращающие ошибки типов средства поддержки неблокирующей многопоточности — это одно из важнейших усовершенствований по сравнению с многообразием библиотек параллелизма, которые предлагались для C++ на протяжении десятилетий. Эти особенности станут большим подспорьем при мультиплатформенной разработке. По отдельности изменения невелики, но их довольно много; а какие из них наиболее ценны — зависит от задачи, решаемой программистом.
Например, семантика переноса упрощает возврат сложных структур данных из функций и ускоряет обработку типов из стандартной библиотеки, таких как string и vector. Специалисты по высокопроизводительным вычислениям оценят масштабное расширение возможностей константных выражений. Пользователи стандартной библиотеки и некоторых библиотек, отвечающих за графический интерфейс пользователя (GUI), наиболее ценной особенностью, возможно, сочтут лямбда-выражения. Практически все для упрощения кода будут использовать мелкие новшества, такие как автоопределение типа переменной по строке ее инициализации и цикл range-for.
В каких направлениях, по-вашему, будет дальше развиваться C++?
Пока об этом говорить рановато. Наш комитет начал рассматривать предложения по новым особенностям языка и стандартной библиотеки, но пока ничего окончательно еще не решено. Новый стандарт мы планируем опубликовать уже через пять лет, поэтому какие-то грандиозные планы строить не приходится. Но лично я бы занялся дальнейшим упрощением использования параллелизма, новыми библиотеками (например, boost::filesystem) и внес кое-какие мелкие изменения. У нас сформированы подкомитеты по параллелизму, модульности, файловой системе и сетевым функциям.
Как вы оцениваете C++ в сравнении с Java, C# и динамическими скриптовыми языками, которых стало много в последнее время?
Вкратце, C++ более гибок (что одновременно и хорошо, и плохо) и как правило программы на нем работают существенно быстрее, если говорить о продуктах труда квалифицированных разработчиков на любых языках. Другие языки обычно имеют огромные стандартные библиотеки. У C++ стандартная библиотека относительно невелика, и разработчику приходится выбирать из большого числа комерческих и открытых библиотек, когда ему нужно что-то большее.
Недавно на конференции Microsoft GoingNative 2012 вы подчеркнули важность компиляции в машинный код, заявив: «Нельзя все подряд исполнять на виртуальных машинах. Должны же быть программы, напрямую взаимодействующие с аппаратным обеспечением». Когда разработчику следует выбирать язык, компилирующий в машинный код, а когда — работающий на виртуальной машине?
На самом деле, это сама Microsoft пыталась подчеркнуть важность «нативного» программирования и выбрала название для конференции, а я просто уже много десятилетий специализируюсь именно на таком программировании. У C++ есть значительные преимущества по сравнению с языками, основанными на виртуальных машинах, когда речь идет о разработке инфраструктурного ПО. Другими словами, когда вам необходимо жестко контролировать быстродействие, надежность, ресурсы и уровень сложности.
К примеру, вы же не станете писать движок JavaScript на самом JavaScript, и, вероятно, не возьметесь разрабатывать простенькое веб-приложение на C++. На C++ могут быть написаны фундаменты систем Google, Amazon, Facebook и т. д., но не часто меняющиеся верхние уровни этих систем. C++ очень полезен, когда требуется заботиться об ограничениях потребляемой мощности — например, на серверных фермах и карманных устройствах. Конечно, С++ может быть конкурентоспособным даже в случаях, когда быстродействие некритично, однако выбор тогда будет делаться на основании доступности библиотек и разработчиков, а не исходя из самого языка.