Итак, один из часто встречающихся комментариев при разговоре о производительности заключается в том, что вы пишете свой код на любом языке, который быстрее всего выполняет свою работу. Если производительность в определенных областях является проблемой, перепишите эти биты на C / C++.
Но что, если вы начинаете с нативного приложения C++? Какие у вас есть варианты, если вы хотите написать простые части или реорганизовать старые части на таком языке, как Python, Ruby, C# или что-то еще? Имейте в виду, что передача данных между нативной и другой сторонами является обязательной. Было бы прекрасно иметь возможность просто вызывать функцию, написанную на «более простом» языке, передавая классы C++ в качестве данных.
У нас есть надежное приложение Win32, которое значительно выиграет, если мы сможем создать новый код или реорганизовать старый код на C# или что-то в этом роде. Очень немногое из этого требует сложности C++, а работа с небольшими неудобными частями затягивает процесс программирования.





Если вы хотите работать между C++ и Python, то Повышение уровня Python - это то, что вам нужно. Вы можете писать привязки C Python для Cython вручную, но это во многом ограничивает то, как вы собираетесь писать свой код. Это самый простой способ, как видно из некоторых фрагментов из этот учебник:
Простая функция, которая выполняет привет, мир:
char const* greet()
{
return "hello, world";
}
Код Boost на Python, необходимый для предоставления доступа к Python:
#include <boost/python.hpp>
BOOST_PYTHON_MODULE(hello_ext)
{
using namespace boost::python;
def("greet", greet);
}
Как использовать этот код из Python:
>>> import hello_ext
>>> print hello.greet()
hello, world
Идти в противоположном направлении немного сложнее, поскольку python не компилируется в собственный код. Вы должны встроить интерпретатор python в свое приложение C++, но работа, необходимая для этого, задокументирована здесь. Это пример вызова интерпретатора Python и извлечения результата (интерпретатор Python определяет класс объекта для использования в C++):
object result = eval("5 ** 2");
int five_squared = extract<int>(result);
Ну это действительно зависит от языка. Например, взаимодействие с Python проще всего выполнить с помощью Boost Python, и многие другие языки потребуют от вас взаимодействия с ними, как с C, с использованием их библиотеки C и объявлением ваших обратных вызовов как extern «C» (к сожалению, вы можете ' t обычно используют определения классов C++ на других языках).
Но я бы также спросил, для чего вы собираетесь его использовать, поскольку C++ - сложный язык, но как только вы познакомитесь с ним, он будет очень мощным и не намного сложнее кодировать, чем другие языки. Единственное действительно хорошее исключение, о котором я мог подумать, - это если вы планируете использовать мощную библиотеку, которая существует только на одном языке, и нет достойной альтернативы C++ (графические библиотеки, вероятно, лучший пример этого, потому что вы должны быть хорошо знакомы с ними, чтобы использовать их эффективно).
Также стоит отметить, что если вы сопоставляете код C++ с другим языком, вы теряете межплатформенную совместимость, предоставляемую этим языком.
В мире .NET у вас всегда есть возможность создать уровень взаимодействия COM / ActiveX для вашей сборки C# / VB.NET.
Затем вы можете использовать обычный COM API из вашего приложения C++ для создания экземпляра этого COM-сервера, который фактически обертывает вашу сборку .NET.
Хорошая вещь в этом заключается в том, что простые параметры, такие как int, bool, string, float и т. д., Отображаются для вас в их COM-эквивалент. Однако, насколько мне известно, невозможно легко передать полные объекты .NET (экземпляры создаваемых вами классов).
Также имейте в виду, что вызовы COM-взаимодействия относительно медленные. Вы не должны постоянно вызывать метод COM-взаимодействия из кода C++ в замкнутом цикле.
COM / ActiveX традиционно полагались на реестр Windows, что не идеально, поскольку это большая зависимость. Однако также можно использовать взаимодействие Без регистрации COM, чтобы избежать этой зависимости.
эта статья описывает шаги, необходимые для регистрации сборки .NET для взаимодействия с COM.
Вы можете изменить поддержку среды выполнения Common Language в своем проекте C++ на / clr. С этого момента вы можете использовать любую функциональность .net прямо в вашем коде на C++. Это также включает создание winforms в вашем проекте. Вы также можете добавить библиотеку C#, которая обрабатывает пользовательский интерфейс и другие функции.
Как предлагает Аарон Фишер, попробуйте перекомпилировать ваше приложение C++ с включенной опцией / clr, а затем начните использовать платформу .Net.
CLI / C++ довольно легко освоить, если вы уже знаете C# и C++, и он обеспечивает мост между миром .Net и родным C++.
Если ваш текущий код C++ не может правильно скомпилироваться с включенным / clr, я бы предложил попытаться создать ваше приложение как статическую библиотеку (без включения / clr), а затем включить main () в проект CLI / C++, который вызывает точку входа в устаревшее приложение. Таким образом, вы, по крайней мере, сможете начать использовать .Net для новых функций.
Примеры «устаревших» приложений C / C++, которые были «портированы» на .Net CLI / C++, можно найти в портах .Net Землетрясение 2 и Землетрясение 3: Арена.