Б’ярн Страустрап - Фарватер програмування

Про секрети ефективного програмування на C++, нову версію мови C++0x та інші актуальні питання сучасної програмної інженерії Б'ярн Страуструп розповів журналу «Відкриті системи».
— Як створювалася мова C++?
Причина, що спонукала до створення C++, полягала в тому, що в моїй науковій роботі мені необхідно було будувати системи, які вимагали високої продуктивності і одночасно мали добре розуміти особливості апаратної платформи. Для вирішення цих завдань мова Сі була практично ідеальною, проте при цьому я мав розробляти дуже складні великі системи. І тоді і зараз я переконаний у тому, що із цим завданням Сі не справляється належним чином. З іншого боку, була мова Simula, створена 1967 року норвезьким ученим Крістеном Нюгордом, який розробив основи об'єктно-орієнтованого програмування та проектування. Ця мова забезпечувала базові механізми об'єктно-орієнтованого програмування, які мені дуже подобалося використовувати для організації коду, тому я взяв із цієї мови поняття класу, класової інваріантності та додав їх до Сі.
Засоби Simula для створення типів користувача, представлення заданих програмістом абстракцій безпосередньо в коді дійсно дуже хороші і дозволяють вирішувати складні завдання, писати великі складні системи, створювати зручний у супроводі код — саме цього я і прагнув новою мовою. І, треба визнати, що мова C++ зробив ці ідеї віхами магістралі всієї ІТ-індустрії. Коли я почав ним займатися у 80-х роках, об'єктно-орієнтоване програмування нікого не цікавило, за винятком кількох людей в академічному середовищі. А ті фахівці в індустрії, які щось чули про це, булипереконані, що об'єктно-орієнтований підхід надто складний для програмістів, його реалізація споживає надто багато ресурсів, і тому він не може бути застосований до вирішення реальних проблем і взагалі є надто спеціалізованим, а отже, марним. Все це, звичайно, неправильно, але мені довелося докласти чимало зусиль, щоб упоратися з подібними упередженнями. Об'єктно-орієнтованою мовою програмування можливе створення якісних, високопродуктивних, зручних у супроводі систем, і робити це можуть звичайні, щоправда добре підготовлені, програмісти, а не генії.
Я почав працювати над C++, будучи співробітником Bell Laboratories, і мої колеги надавали мені велику підтримку у виявленні проблемних місць, які ускладнюють роботу. У 1985 році вийшов перший комерційний реліз С++, і тоді побачила світ моя перша книга про цю мову.
— Чому виникла потреба у новій версії мови – С++0х?
Минуло 12 років, за цей час ми багато чого навчилися. Змінюються проблеми у світі, які вимагають вирішення за допомогою програм, тому будь-яка жива мова повинна змінюватися, щоб відповідати новим завданням, ефективно виправляти помилки тощо. У новій версії ми реалізуємо ті ідеї, які виникали під час досліджень та практичного досвіду за останні роки. Процес підготовки нового стандарту успішно просувається, і в 2011 році стандарт буде передано на затвердження ISO.
Поява будь-якої нової версії мови спрямована на підвищення продуктивності, надійності програм на C++, полегшення реалізації стратегії обробки помилок і т.д. кардинальних змін, а вдосконалювали мову таким чином,щоб дозволити програмістам краще використовувати ці стратегії.
— Які основні етапи процесу стандартизації нової версії С++?
— Чи отримували ви якийсь зворотний зв'язок від української спільноти розробників?
Розробники з України та Східної Європи брали участь в обговоренні здебільшого у віддаленому режимі, хоча українська делегація і приїжджала на дві очні зустрічі з С++0х. Але постійно і на формальній основі Україна не була представлена у процесі стандартизації C++0x. Мені здається неправильним, що українські фахівці не мали змоги вплинути на створення нового стандарту. Це не відповідає тому рівню, який має країна в галузі програмної інженерії, принаймні судячи з моїх спостережень.
— Чи з'являться у C++0x нові сфери застосування?
Я не думаю, що з виходом нової версії щось зміниться з погляду застосування С++, і немає сенсу штучно просувати цю мову в інші області. 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++.
Я також намагаюся працювати над засобами аналізу, створювати інструменти, які аналізують код, щоб отримати найкраще уявлення про те, що, де та як реалізовано. Це має допомогти у вирішенні проблеми появи неякісних програм, автоматизувати процес виявлення можливостей модернізації систем, приведення їх до сучаснішого стилю програмування.
