У меня есть набор классов, написанных на C++. Как лучше всего вызвать их из Perl-скрипта? Спасибо.
Как я могу использовать класс C++ из Perl?
Ответы (3)
Я не особо люблю SWIG и предпочитаю писать интерфейсный код самостоятельно. Perl поставляется с своего рода псевдоязыком под названием «XS» для взаимодействия с C или C++. К сожалению, для того, чтобы его использовать, вам нужно будет знать как минимум C, Perl, а затем еще и кое-что узнать об API интерпретатора. Если вы уже хорошо знаете Perl и C, это не такой уж большой шаг. Взгляните на следующие основные документы по XS:
Кроме того, в Интернете есть множество руководств и инструкций.
Теперь взаимодействие с C++ с помощью XS требует некоторых дополнительных шагов. Поначалу это может немного разочаровывать, но как только вы это сделаете, все встанет на свои места. В этом отношении основная документация в лучшем случае скудна. Но еще не все потеряно. Маттиа Барбон, создатель привязок wxWidgets для Perl, написал отличный инструмент «XS++», который делает это почти невероятно простым (или таким же простым, как XS). Он включен в Wx, но мы работаем над тем, чтобы выделить его в отдельный дистрибутив. Эта работа в процессе. Вы можете найти код Mattia XS++ и моя модифицированная версия на github.
За исключением выпуска автономного XS++ для CPAN, я бы посоветовал научиться писать XS для C++ из других ресурсов:
- Довольно давно Джон Кейзер написал отличное руководство по XS и C++. Он также включает дополнительные указатели на полезные инструменты и документацию.
- Я изучил XS&C++ из этого учебника и нескольких примеров, которые нашел на CPAN. Не помню, что я тогда смотрел. Но теперь я могу указать на свою собственную работу в качестве примера (хорошего или плохого, я не знаю): Math::SymbolicX::FastEvaluator.
- Точно так же планируемый дистрибутив XS++ содержит полный (хотя и бессмысленный) пример использования XS++ для взаимодействия с C++ и Perl. Поскольку XS++ переводится в обычный XS, вы можете использовать его для создания примеров.
PS: есть еще модуль Inline::CPP. Если это работает, это, вероятно, самое простое решение. Я сомневаюсь, что он может обрабатывать шаблоны.
Проверьте http://www.swig.org :
«SWIG — это инструмент разработки программного обеспечения, который связывает программы, написанные на C и C++, с различными языками программирования высокого уровня. SWIG используется с различными типами языков, включая распространенные языки сценариев, такие как Perl, PHP, Python, Tcl и Ruby».
Обычно я выбираю XS, например tsee, но есть также Inline::C ( или Inline::CPP в этом случае). Я не люблю SWiG и стараюсь избегать пакетов, построенных вокруг него.
Inline
действительно значительно упрощают интеграцию чужого кода в Perl.
- person mob; 10.10.2009