Я мало знаю про D, але багатьох, багатьох програмістів на C ++ мені це дуже не подобається, і мені особисто доводиться погоджуватися - мені не подобається погляд D і не буду брати його ближче.
Щоб зрозуміти, чому D не набирає більшої тяги, для початку потрібно зрозуміти, що приваблює людей до C ++. Одним словом, причина номер один - це контроль. Коли ви програмуєте на C ++, то ви маєте повний контроль над своєю програмою. Хочете замінити бібліотеку Standard? Ти можеш. Хочете зробити небезпечні ролики вказівників? Ти можеш. Хочете порушити коректність? Ти можеш. Хочете замінити розподільник пам'яті? Ти можеш. Хочете скопіювати навколо необробленої пам'яті, не враховуючи її тип? Якщо ти дуже хочеш. Хочете успадкувати від кількох реалізацій? Це ваше похорон. Чорт, ви навіть можете отримати бібліотеки для збору сміття, як колектор Boehm. Тоді у вас виникають такі питання, як продуктивність, яка пильно слідкує за контролем - чим більше контролює програміст, тим оптимізованіше він може зробити свою програму.
Ось кілька речей, які я бачив під час невеликого дослідження та розмови з парою людей, які спробували це:
Єдиний тип ієрархії. Користувачі на C ++ користуються успадкуванням дуже рідко, більшість програмістів на C ++ віддають перевагу композиції, а типи повинні бути пов'язані лише через спадкування, якщо для цього є дуже вагомі причини. Поняття Об'єкт сильно порушує цей принцип, пов'язуючи кожен тип. Крім того, це порушує один з основних основних принципів C ++ - ви використовуєте лише те, що хочете. Не маючи вибору щодо спадкування від Object, а також витрат, які пов'язані з цим, дуже рішуче проти того, що C ++ стоїть як мова з точки зору надання програмісту контролю над його програмою.
Я чув про проблеми з функціями та делегатами. Мабуть, D має і функції, і делегати, як типи функцій, які можна зателефонувати, і вони не однакові, але вони взаємозамінні або ... щось? У мого друга було з ними досить багато проблем. Це, безумовно, пониження рівня від C ++, що тільки є, std::function
і ви закінчили.
Тоді ви отримали сумісність. D не особливо сумісний із C ++. Я маю на увазі, що жодна мова не сумісна з C ++, давайте зіткнемося з цим, окрім C ++ / CLI, який є чимось обманом, але як перешкоду для вступу це потрібно згадати.
Потім, є ще деякі речі. Наприклад, просто прочитайте запис у Вікіпедії.
import std.metastrings;
pragma(msg, Format!("7! = %s", fact_7));
pragma(msg, Format!("9! = %s", fact_9));
printf
є однією з найнебезпечніших функцій, коли-небудь розроблених, в тій же сім'ї, що і великі проблеми, як gets
у старої бібліотеки C Standard. Якщо ви шукаєте його в Stack Overflow, ви знайдете багато-багато питань, пов’язаних із його неправильним використанням. Принципово, printf
це порушення сухих- ви надаєте тип у рядку формату, а потім надаєте його знову, коли ви даєте йому аргумент. Порушення DRY, якщо, якщо ви помилитесь, то трапляються дуже погані речі - скажімо, якщо ви змінили typedef з 16-бітного цілого числа на 32-бітове. Це також зовсім не розширюється - уявіть, що буде, якби кожен винайшов власні специфікатори формату. Іострими C ++ можуть бути повільними, і їх вибір оператора може бути не найбільшим, і їхній інтерфейс може використовувати роботу, але вони принципово гарантовані як безпечні, і DRY не порушуються, і їх можна легко розширити. Це не те, про що можна говорити printf
.
Немає багаторазового успадкування. Це зовсім не спосіб С ++. Програмісти на C ++ очікують повного контролю над своєю програмою, і мова, яка виконує те, чого ви не можете успадкувати, - це порушення цього принципу. Крім того, це робить спадщину (навіть більше) крихкою, тому що якщо ви змінюєте тип з інтерфейсу на клас, тому що хочете надати реалізацію за замовчуванням чи щось подібне, раптом весь код вашого користувача порушується. Це не дуже добре.
Інший приклад - string
і wstring
. У C ++ вже досить болісно конвертувати між ними, і чи підтримує ця бібліотека Unicode, і ця стара бібліотека C використовує лише const char*
, і потрібно писати різні версії однієї функції залежно від типу аргументу рядка. Зокрема, у заголовках Windows, наприклад, є надзвичайно дратівливі макроси, щоб впоратися з проблемою, яка часто може заважати вашому власному коду. Додавання dstring
до суміші лише погіршить ситуацію, оскільки тепер замість двох типів рядків вам доведеться керувати трьома. Маючи більше одного типу рядків, це збільшить болі в обслуговуванні та запровадить повторюваний код, що стосується рядків.
Скотт Майєрс пише:
D - мова програмування, побудована для того, щоб допомогти програмістам вирішити проблеми сучасної розробки програмного забезпечення. Це робиться шляхом сприяння модулям, пов'язаних між собою через точні інтерфейси, федерації тісно інтегрованих парадигм програмування, мовній ізоляції потоку, безпеці модульного типу, ефективній моделі пам'яті тощо.
Ізольована мовою ізоляція ниток не є плюсом. Програмісти на C ++ очікують повного контролю над своїми програмами, а мова, що змушує щось робити, точно не те, що наказав лікар.
Я також згадаю маніпуляцію з рядком під час компіляції. D має можливість інтерпретувати D-код під час компіляції. Це не плюс. Розгляньте масивні головні болі, спричинені відносно обмеженим препроцесором C, добре відомим всіма ветеранськими програмістами C ++, а потім уявіть, як погано цією функцією буде зловживати. Можливість створення коду D під час компіляції є чудовою, але вона повинна бути семантичною , а не синтаксичною.
Крім того, можна очікувати певного рефлексу. D має збирання сміття, яке програмісти C ++ асоціюватимуть з такими мовами, як Java та C #, які досить прямо протистоїть йому у філософіях, і синтаксичні подібності також приведуть їх до уваги. Це не обов'язково об'єктивно виправдано, але це, безумовно, слід зазначити.
По суті, це не так багато, що програмісти на C ++ вже не можуть зробити. Можливо, простіше написати факторну метапрограму в D, але ми можемо вже написати факторні метапрограми в C ++. Можливо, у D ви можете написати промінь-прослідковувач часу, але ніхто все одно не хоче цього робити. У порівнянні з основними порушеннями філософії C ++, те, що ви можете зробити в D, не особливо примітно.
Навіть якщо ці речі є лише проблемами на поверхні, я майже впевнений, що той факт, що на поверхні, D насправді зовсім не схожий на C ++, є, мабуть, вагомою причиною того, що багато програмістів на C ++ не переходять на D. Можливо, D потрібно зробити кращу роботу з рекламою.