Варианты рефакторинга битов кода от родного C ++? - PullRequest
2 голосов
/ 29 сентября 2008

Итак, один из наиболее часто встречающихся комментариев при обсуждении производительности заключается в том, что вы пишете свой код на любом языке, который выполняет работу быстрее всего. Если производительность в определенных областях является проблемой, переписать эти биты в C / C ++.

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

У нас есть хрупкое приложение для Win32, которое очень выиграло бы, если бы мы могли запускать новый код или рефакторинг старого кода в C # или что-то в этом роде. Очень мало этого требует сложности C ++, а работа с небольшими кусочками затягивает процесс программирования.

Ответы [ 5 ]

2 голосов
/ 22 октября 2008

Как подсказывает Аарон Фишер , попробуйте перекомпилировать ваше приложение C ++ с включенной опцией / clr, а затем начните использовать платформу .Net.

CLI / C ++ довольно легко подобрать, если вы уже знаете C # и C ++, и он обеспечивает мост между миром .Net и собственным C ++.

Если ваш текущий код C ++ не может быть скомпилирован без проблем с включенным / clr, тогда я бы предложил создать ваше приложение как статическую библиотеку (без включенного / clr), а затем включить main () в CLI / C ++ проект, который вызывает вашу точку входа в старое приложение. Таким образом, вы можете по крайней мере начать использовать .Net для новой функциональности.

Для примеров "старых" приложений C / C ++, которые были "перенесены" в .Net CLI / C ++, проверьте .Net порты Quake 2 и Quake 3: Arena .

1 голос
/ 29 сентября 2008

Вы можете изменить поддержку времени выполнения общего языка в вашем проекте c ++ на / clr. С этого момента вы можете использовать любую функциональность .net прямо в вашем коде на C ++. Это также включает создание winforms в вашем проекте. Вы также можете добавить библиотеку c #, которая обрабатывает пользовательский интерфейс и другие функции.

1 голос
/ 29 сентября 2008

Ну, это действительно зависит от языка. Например, взаимодействие с Python легче всего выполнить с помощью Boost Python, и во многих других языках вам потребуется взаимодействовать с ними так же, как с C, используя их библиотеку C и объявляя ваши обратные вызовы внешними "C" (к сожалению, вы можете ' обычно используют определения классов C ++ в других языках).

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

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

1 голос
/ 29 сентября 2008

Если вы хотите работать между C ++ и Python, тогда Boost Python - это то, что вы ищете. Вы можете писать привязки C Python вручную для Cython, но это во многом ограничивает то, как вы собираетесь писать свой код. Это самый простой способ, как видно из некоторых фрагментов из этого урока :

Простая функция, которая выполняет привет мир:

char const* greet()
{
   return "hello, world";
}

Код Python Boost, необходимый для его представления 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);
0 голосов
/ 29 сентября 2008

В мире .NET у вас всегда есть возможность создать уровень взаимодействия COM / ActiveX для вашей сборки C # / VB.NET.

Затем вы можете использовать обычный COM API из вашего приложения C ++ для создания экземпляра этого COM-сервера, который фактически оборачивает вашу сборку .NET.

Хорошо, что простые параметры, такие как int, bool, string, float и т. Д., Сопоставляются с их COM-эквивалентом. Однако, насколько мне известно, невозможно легко передать полные объекты .NET (экземпляры создаваемых вами классов).

Также следует учитывать, что вызовы взаимодействия COM относительно медленные. Вы не должны непрерывно вызывать метод COM-взаимодействия из своего кода C ++.

COM / ActiveX традиционно полагались на реестр Windows, что не идеально, так как это большая зависимость. Однако также возможно использовать COM-Free COM-взаимодействие, чтобы избежать этой зависимости.

В этой статье описаны шаги, необходимые для регистрации сборки .NET для COM-взаимодействия.

...