<
  • Главная
Статьи

Чому нікому не подобається мова програмування C ++?

Одного разу програміст Дуглас Крокфорд сказав: "Тільки божевільний буде використовувати C ++". Так чому C ++ вважають далеко не кращим мовою для програмування? На це питання відповідають користувачі сайту Quora .

сайту Quora

Джон Харроп, займається програмуванням більше 34 років

Чому C ++ вважають не найкращим мовою для програмування? Ймовірно, пояснити подібне буде найпростіше, порівнявши C ++ з іншою мовою - C, який відмінно оформлений і володіє високою функціональністю.

Особливості мови С обумовлені певними цілями. Ці особливості призначалися для вирішення реальних проблем і тих проблем, які вони самі можуть викликати. Проста арифметика з цілочисельними операторами. Автоматичний розподіл регістрів за допомогою портативного (між компіляторами) двійкового інтерфейсу додатків. Простий, але зручний процесор попередньої обробки. І багато іншого. Крім того, мова С не сильно ускладнений: написати компілятор цієї мови можна за досить короткий час (tinycc - це компілятор С для платформи х86, написаний десь за 65 тисяч рядків коду C!). C був випущений для досягнення певної мети, і він її успішно досяг. Завдяки «чистоті» даного мови, на ринок в прискореному темпі вийшла величезна кількість якісних компіляторів і вже на ранній стадії були доступні рішення на рівні системи підтримки операцій.

На відміну від С, у C ++ ніколи не було чіткої мети, тому багато функцій цієї мови додавалися мало не випадковим чином. Первісна ідея Б. Страуструпа (разом з М. Елліс - автор книги «Довідник з мови програмування C ++ з коментарями») була такою: «С - це круто, і об'єктно-орієнтоване програмування (ООП) теж круто, тому давайте запіхну ООП в С ». Ретроспективно ООП було широко поширене, але при цьому в більшості випадків воно невірно використовувалося фахівцями. Справжні мови для ООП, такі як Smalltalk або IO, володіють багатьма функціями, яких немає в C ++. Про

сновним властивістю, в якому потребував мову C, був, мабуть, параметричний поліморфізм. Замість цього C ++ отримав шаблони, які були призначені скоріше для вирішення декількох абсолютно не пов'язаних між собою проблем, ніж для вирішення якої-небудь конкретного завдання. Незабаром хтось зовсім випадково виявив, що шаблони в C ++ елементарні, після чого була написана і опублікована програма (машина Тьюринга), яка обчислювала прості числа під час компіляції. Вау. Просто вражаюче спостереження, яке призвело до того, що люди кілька десятків років користувалися далеко не ідеальними шаблонами C ++, в той час як існували шаблони, придумані набагато раніше і які підходять для вирішення багатьох проблем набагато краще (наприклад, макроси Lisp або ML -поліморфізм). Гірше того, невірне використання Цих не ідеальних шаблонів призвело до додаванню більшої кількості функцій, наприклад, часткової спеціалізації шаблонів.

По суті, випадково ускладнення C ++ призвело до того, що написання працюючого компілятора для цієї мови стало майже неможливим завданням. Наприклад, для цієї мови вкрай складно написати синтаксичний аналізатор. Синтаксис також має такі жахливі оператори, як List <Set <int >>, які інтерпретуються як логічний зрушення вправо. Жоден з вихідних компіляторів C ++ не був достатньо надійним. Наприклад, під час отримання ступеня кандидата наук в 2000-2004 рр. я стикався з десятками помилок в компіляторах C ++ з GNU, Intel і SGI. Надійні компілятори були створені тільки два десятиліття по тому.

Прийнято вважати, що C ++ - це вкрай швидкий мову, але реальність така, що C ++ буде швидким тільки тоді, коли ви пишете C-подібний код, і навіть в цьому випадку це правило буде працювати тільки для певних видів програм. Виходячи з позиції «Не платите за те, що ви не використовуєте», C ++ абсолютно неефективний. Ідіома RAII, що означає «отримання ресурсу є ініціалізація», вводить безліч викликів непотрібних функцій, які іноді можуть виявитися вкрай дорогими. Такі виклики зазвичай вимагають дані, які в іншому випадку не використовувалися б, тому ці дані зберігаються в активному використанні, збільшуючи реєстрове тиск і знижуючи продуктивність. Механізм винятків C ++ вкрай неефективний (~ 6x повільніше, ніж OCaml). У порівнянні з сучасними збирачами сміття, розподіл нової та віддаленої інформації в C ++ відбувається повільно, тому людям пропонується використовувати стандартні бібліотеки шаблонів (STL). Але для них заздалегідь виділяють величезні блоки пам'яті, внаслідок чого втрачається одна з переваг, яке було в мові С, а саме, ефективність розподілу пам'яті. Після цього вам рекомендується написати ваш власний розподільник STL, який вже точне не краще, ніж використання С. Одним з основних давно з'явилися і нині існуючих переваг C перед сучасними мовами є непрогнозований час очікування, що виникає у складальників сміття.

А ось C ++ взяв найгірше: у нього відсутня збирач сміття (що унеможливлює ефективний вплив на корисні функції, наприклад, використання функціональних структур даних належним чином), а порядок виклику деструкторів при цьому точно не визначений, а значить в будь-який момент у вашому роботі може утворитися необмежена пауза, так як неможливо заздалегідь передбачити, коли саме буде утилізовано конкретний об'єкт. Хоча шаблони широко використовуються в метапрограмування, їх використання далеко не настільки зручно, як хотілося б, тому можна сказати, що C ++ не надає достатньо можливостей для метапрограмування.

Наприклад, в С ++ ви не можете створити портативну бібліотеку для роботи з регулярними виразами, тому що в даному випадку неможливо буде виконати генерацію і компіляцію коду в виконувані файли, хоча це можна зробити в Java, C # та іншими мовами, що беруть початок в Lisp. Адже Java і C # мають регулярні вирази в своїх стандартних бібліотеках вже більше 10 років, в той час як C ++ їх тільки отримав.

Мова C ++ настільки складний, що навіть світові експерти, немов новачки, допускають в ньому помилки і промахи. Герб Саттер працює в компанії Microsoft, він довгий час був організатором і секретарем комітету зі стандартизації ISO C ++. Під час однієї зі своїх лекцій він давав свій улюблений 10-рядковий код на мові C ++, і хтось вказав йому на помилку, що приводить до витоку пам'яті.

На мою особисту думку, нову мову програмування Rust - це те, яким мав би стати C ++. У ньому є узагальнене програмування (generics), розмічене об'єднання типів даних, порівняння на відповідність шаблоні і багато інших нові функції, наприклад, безпеку доступу до пам'яті без збору сміття.

Акаш Патель, інженер з обчислювальної техніки

Написати щось, що прийме компілятор С ++, зовсім нескладно. Приклавши трохи зусиль, ви навіть можете змусити кінцеву програму працювати так, як вам того хотілося б. Але, так чи інакше, майже напевно там буде безліч невловимих, але критичних помилок. Звичайно, не бачачи ваш код, мені складно стверджувати з упевненістю, що там є помилки, але я готовий посперечатися, що вони там є.

C # і Java - це обмежені мови, і це як благословення, так і прокляття. У певному сенсі, з ними виникає багато складнощів (необхідність створювати клас для простого «привіт, світ!» Це дуже нерозумно, адже є інші мови програмування, в яких взагалі не потрібні класи). Але їхня перевага полягає в тому, що, будучи більш обмежуючим, їх компілятор здатний зловити більша кількість помилок, які в C ++ будуть непомітні до того моменту, поки ви не запустите програму. Або поки хтось інший не запустить програму на іншому комп'ютері, в інший день, в іншу хвилину.

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

Коли ви тільки починаєте вивчати програмування, дуже важливо виявити правильний підхід. На самому початку необхідно навчитися виражати себе в коді, розбирати будь-яку глобальну проблему на більш дрібні, які потім можна виразити в термінах мови програмування, ось що важливо. Але вивчення C ++ змусить вас з самого початку навчитися в один і той же час «жонглювати» величезною кількістю непростих речей, а саме, визначити покажчики, мати справу з управлінням пам'яттю вручну, індексами, що виходять за межі масивів, помилками компіляції шаблонів, витоками пам'яті і величезною кількістю випадків невизначеного поведінки (випадки, коли компілятор приймає код, але специфікація не визначає поведінку мови. Це означає, що може трапитися все, що завгодно, навіть якщо здається, що код працює нормально. В с ++ таке з учается вкрай часто, в той час як багато інших мов під час компіляції прагнуть виявити або запобігти подібні помилки).

Набагато ефективніше буде почати вчити якусь більш просту мову, який не прагне поставити настільки величезна кількість перешкод на вашому шляху. А ось після того, як засвоїте суть програмування в цілому, можна буде сфокусуватися на тонкощах C ++.

Я розумію, що я не згадав дуже багато вкрай специфічних характеристик цієї мови. Проблема полягає в тому, що більшість окремих функцій С ++ досить прості (робота зі спеціалізацією шаблонів і покажчиками може збити з пантелику спочатку, але, врешті-решт, з цим можна розібратися. А ось метапрограмування шаблонів напевно зведе вас з розуму, і це цілком нормально ;)). Головна проблема полягає в самій мові, де безліч непередбачуваних помилок, які тільки іноді поверхневі, а в більшості випадків відображаються тільки при запуску програми на деяких комп'ютерах, або проблеми, які можуть виникнути при спробі запустити відразу конструктор, конструктор копіювання, оператор присвоювання і деструктор, щоб упевнитися у відсутності витоку ресурсів і в тому, що все в порядку з класами.

Головна проблема полягає в самій мові, де безліч непередбачуваних помилок, які тільки іноді поверхневі, а в більшості випадків відображаються тільки при запуску програми на деяких комп'ютерах, або проблеми, які можуть виникнути при спробі запустити відразу конструктор, конструктор копіювання, оператор присвоювання і деструктор, щоб упевнитися у відсутності витоку ресурсів і в тому, що все в порядку з класами

Ерік Скотт, фахівець в області теорії обчислювальних машин і систем

Багато висловилися дали відмінні відповіді з позиції програмістів, приділивши основну увагу тим аспектам, які їм подобаються чи не подобаються. Але суть полягає в тому, що дивитися необхідно з точки зору перспективності мови в сфері розробки програмного забезпечення, в якій основна увага приділяється тому, як властивості і особливості мови впливають на якість продукту і його пристосованість до технічного обслуговування та поточного ремонту:

  • Наскільки легко навчитися писати високоякісний, простий в супроводі і придатний для тестування код на C ++?
  • Наскільки складно написати безпечний і красивий код на C ++?

Якщо порівнювати цю мову з C і Java, то відповідь на обидва вище наведених питання буде «досить складно», і на це є ряд причин. По суті, використання мови С ++ в деякій мірі схоже на використання вогнепальної зброї - головне це знати правила.

Всі ми знаємо, що зброя небезпечно. Ми також знаємо, що вогнепальна зброя є причиною багатьох нещасних випадків, збільшує ймовірність самогубства і погіршує ситуацію, в яких є ненавмисні обставини. Але всі ці негативні сторони стосуються тільки інших людей, що не носять зброю, адже власники зброї завжди говорять щось на кшталт «Зброя безпечно, якщо його використовувати належним чином, а я точно знаю, як це робити».

Багато вірно говорять, що використання С ++ не буде шкідлива або в тягар, якщо ви використовуєте його правильно. Це, однак, не змінює того факту, що, метафорично кажучи, що працюють з С ++ програмісти щодня самі ставлять палки собі в колеса. Як кажуть, «існує 6 способів реалізувати просту задачу на мові С ++, і 5 з них найімовірніше закінчаться повною катастрофою». Якщо програміст достатньо досвідчений, щоб обійти ці 5 варіантів, тоді він може написати відмінний код.

Однак управління пам'яттю вручну за допомогою RAII, виправлення різних помилок сегментації і багато іншого вимагає добре відпрацьованого набору навичок та вмінь, а також високий рівень професіоналізму і відмінне розуміння мови програмування. Нехай подібні проблеми і виникали в C, але там вони були досить керовані, а ускладнений набір функцій в С ++ постійно змушує бути напоготові.

Якщо програмісти Java можуть приблизно розбиратися в мові, а після, з ходом часу і напрацюванням практики, підвищувати свій рівень кваліфікації, то програміст на С ++, слабо розбирається в проекті, ніколи не буде допущений на роботу з ним. Крім того, кожному початківцю варто в обов'язковому порядку прочитати книгу Скотта Мейерса «Ефективне використання С ++».

Все це веде до того, що багатьом командам розробників такі мови, як Java / C # і C, дозволять виконати проект швидше, краще і з меншою кількістю недоліків. Багато окремі розробники можуть вважати себе «безпечними власниками зброї», створюючи чудові і красиві коди, написати які можна тільки за допомогою С ++. Але, як правило, більшість людей вважають за краще або повністю уникати С ++, або ж розробляти сувору внутрішню політику щодо того, які функції цієї мови будуть використовуватися в проекті, а які ні.

Але, як правило, більшість людей вважають за краще або повністю уникати С ++, або ж розробляти сувору внутрішню політику щодо того, які функції цієї мови будуть використовуватися в проекті, а які ні

Пол Конвей, розробник на пенсії, любитель наукової фантастики

Я писав коди на С ++ ще з часів Zortech. Я бачив, як з плином часу мова все більше прикрашали. І ще в той час я зрозумів, що з С ++, як і в випадку з С, необхідна дисципліна з приводу його використання. Той факт, що ця мова має деякі вкрай екзотичні і незвичні функції, зовсім не означає, що їх обов'язково потрібно впихнути в програму.
Що стосується того, чому С ++ вважають настільки поганим - слухаючи інших програмістів, я зрозумів, що існує величезна безліч забобонів щодо цієї мови. Я зустрічав людей, які говорили, що мова С чудовий, і тих, хто називав С ++ абсолютно непотрібним і безглуздим. І я не згоден ні з тими, ні з іншими.

Близько 15 років тому, незабаром після того, як я приєднався до тієї компанії, де я працюю і зараз, мені доручили написати внутрішній документ про прийняття C ++. У ньому я повинен був викласти плюси і мінуси мови, послідовність кроків, які повинні були бути зроблені, а також розглянути можливі труднощі (сумісність з існуючою базою коду, наявність надійних компіляторів на всіх підтримуваних платформах, навчання розробників і т. Д.)

Коли мій звіт був випущений, один з старших розробників у вкрай жорсткій формі розкритикував мене, звинувативши в тому, що я своїми радикальними думками мав нахабство відкрито кинути виклик ідеям батьків-засновників компанії, а також у відсутності жодної поваги і пошани до чудово отточенному коду С , на якому в той час все працювали. Мене оголосили мало не єретиком.

Звичайно, той старший розробник, який сказав мені написати звіт і прийняв його у мене, не поділяв поглядів критикував мене працівника, інакше він би не дозволив мені створити і випустити той документ. І коли трапився подібний конфлікт, він всіляко мене підтримував.

Той документ відклали в довгу шухляду, і там він лежить і зараз, наскільки мені відомо. Майже весь час з того моменту я працював з власне інтерпретуються мовами. Але зовсім недавно, на мій подив, мені довелося попрацювати з базою вихідних кодів, яку я не бачив дуже багато років. І подумати тільки, я побачив там велику частину коду, написаного на С ++! Уявіть собі, наскільки я був здивований.

Переглянувши код, я прийшов до висновків, що він досить непогано написаний і досить читабельний. Крім того, автор коду дотримувався мого власного принципу не використовувати химерні функції там, де вони насправді не потрібні, тому я припустив, що разом з відходом деяких засновників компанії пішло і упереджене ставлення до даного мови. Крім того, він ріс і розвивався, а значить, стало доступно більшу кількість надійних компіляторів для різних платформ.

Я посміхнувся. У мене до цих пір як заповітний сувенір зберігається копія того звіту, хоча я дуже сумніваюся, що хто-небудь пам'ятає, що я колись його написав.

Так в чому ж була причина подібного негативного ставлення до C ++ з боку людей? Не кажучи про технічні проблеми, яких було безліч, причина швидше за крилася глибоко на емоційно-підсвідомому рівні.

Я думаю, основа такого Ставлення закладається ще во время навчання комп'ютерним наукам. Вищі навчальні заклади прагнуть знизити вартість навчання за рахунок використання безкоштовного програмного забезпечення, тому багато програмістів починають з безкоштовних і всюди зустрічаються Unix / Linux і С.

Крім того, саме компанія Microsoft створила перший компілятор С ++, але я бачив стійке презирство до цієї компанії з боку багатьох програмістів, і подібним же презирством і негативом вони нагороджували С ++.

На мій погляд, С ++ - це чудова мова, і якщо він і зіпсований, то тільки своєю заплутаністю. Але, як я вже говорив, я вкрай акуратно використовую надані їм можливості. Це означає, що багато хто з них я не використовував ніколи. А якщо я це і робив, то вкрай акуратно, щоб це не викликало проблем з обслуговуванням коду.

Так чому C ++ вважають далеко не кращим мовою для програмування?
Наскільки складно написати безпечний і красивий код на C ++?
Так в чому ж була причина подібного негативного ставлення до C ++ з боку людей?


Новости
  • Виртуальный хостинг

    Виртуальный хостинг. Возможности сервера распределяются в равной мере между всеми... 
    Читать полностью

  • Редизайн сайта

    Редизайн сайта – это полное либо частичное обновление дизайна существующего сайта.... 
    Читать полностью

  • Консалтинг, услуги контент-менеджера

    Сопровождение любых интернет ресурсов;- Знание HTML и CSS- Поиск и обновление контента;-... 
    Читать полностью

  • Трафик из соцсетей

    Сравнительно дешевый способ по сравнению с поисковым и контекстным видами раскрутки... 
    Читать полностью

  • Поисковая оптимизация

    Поисковая оптимизация (англ. search engine optimization, SEO) — поднятие позиций сайта в результатах... 
    Читать полностью