D и C ++ в настоящее время статус совместимости - PullRequest
0 голосов
/ 27 ноября 2018

Я хотел бы выучить D, но я не очень хорошо понял важную вещь.Каково текущее состояние взаимодействия между C ++ и D?

Я уверен, что невозможно ссылаться на скомпилированные двоичные файлы C ++, так как он даже не работает с компиляторами C ++.Но что, если у меня есть исходный код библиотеки C ++ и некоторый исходный код D.Можно ли заставить их говорить?(надеюсь, эффективным способом).

Как насчет различных версий C ++ (C ++ 98, 11, 14, 17 и будущих версий)?

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Я являюсь частью команды компиляторов и этим летом работаю над взаимодействием C ++, чтобы взаимодействовать с куском кода C ++, написанного на современном C ++ 14.

C ++ очень хорошо поддерживаетсяD, на самом деле это, вероятно, один из лучших вариантов поддержки для языка такого размера.Например, вы можете выбросить любое исключение, полученное из std::exception в C ++, и перехватить его на стороне D.Вы можете написать класс в D и использовать его из D (виртуальный метод или нет) или наоборот.Вы можете создать подкласс класса D из C ++, и вы можете создать подкласс класса C ++ из D. Вы можете вызывать созданные шаблоны функций!

Теперь есть несколько уловов:

  • Есливы делаете что-то не очень идиоматическое в C ++, например, бросаете int, это будет проблемой.
  • Код C ++ не должен нарушать систему типов D.Например, вы не можете представить char* const* (указатель на постоянный указатель на изменяемый символ), потому что const у D является транзитивным, поэтому он должен быть const char* const*.
  • Поддержка кросс-версии все еще не оптимальна.В настоящее время существует сочетание C ++ 98 и C ++ 11, и нет способа контролировать, что использовать.Это не имеет значения в 95% случаев, поскольку D взаимодействует на двоичном уровне, и касается только соглашения о вызовах и искажения символов.

Что касается платформ, Windows очень хорошо поддерживается (мыесть игровые разработчики, использующие его).Поддержка POSIX для вызова шаблонных функций более поздняя, ​​но у меня работает.

Вот и все для поддержки языка.Инструменты вокруг него (например, о чем упоминал Деян) все еще создаются, и отрасль проявляет большой интерес к их использованию, поскольку D считается гораздо более приятным в использовании, и он может предложить легкий путь перехода для разработчиков на C ++.Фактически, все 3 D-компиляторы (DMD, GDC, LDC) используют общий фронтенд, написанный на D, и подвергают C ++ свой бэкэнд (DMC, GCC, LLVM соответственно).

TL; DR:

  • Если вы хотите вызвать C ++ и можете сэкономить время, чтобы написать несколько привязок в D для ваших классов / функций, да.
  • Если вы не можете написать привязки, следите за обновлениями.
  • Если вы хотите выставить D-код на C ++, то да!
0 голосов
/ 28 ноября 2018

D совместимость с C ++ значительно улучшилась за последние несколько лет. «Интерфейс для C ++» раздела «Спецификация D» - хорошее начало, если вы хотите узнать больше. Возможно, вы также захотите взглянуть на «волшебный» проект dpp -https://code.dlang.org/packages/dpp.

Я не понимаю вашего вопроса о связывании ... Компоновщик одинаков, независимо от того, используете ли вы Assembly, C, C ++, D или любую их комбинацию ...Вы сможете связывать библиотеки C ++, но вы не сможете использовать все, что находится внутри (зависит от того, что находится в библиотеке).Я видел D-приложения, связанные с библиотеками Boost для примера.

...