33
СОЕДИНЯЕМ C++ И PYTHON ИГОРЬ САДЧЕНКО [email protected]

Mixing c++ and python

Embed Size (px)

Citation preview

Page 1: Mixing c++ and python

СОЕДИНЯЕМ C++ И PYTHON

ИГОРЬ САДЧЕНКО

[email protected]

Page 2: Mixing c++ and python

МОТИВАЦИЯ

Page 3: Mixing c++ and python

2

Использование как предметно-ориентированный язык для

конкретной области применения(DSL)

Высокоуровневая разработка(VHLL)

Быстрое разработка и прототипирование приложений(RAD)

Встраивание интерактивной среды (REPL)

Разработка графического интерфейса пользователя (GUI)

Тестирование

C++ COREHARD WINTER 2017 // МОТИВАЦИЯ

IGOR SADCHENKO // C++ COREHARD // 12.02.17

ЗАЧЕМ

Page 4: Mixing c++ and python

3

Extensions. Написание расширений для Python на С++

• улучшение производительности

• портирование существующих библиотек

• интеграция различных компонентов

Embedding. Встраивание Python в С++ программы

• упрощение разработки

• дополнительных возможности

C++ COREHARD WINTER 2017 // МОТИВАЦИЯ

IGOR SADCHENKO // C++ COREHARD // 12.02.17

СПОСОБЫ

Page 5: Mixing c++ and python

4

C++ COREHARD WINTER 2017 // МОТИВАЦИЯ

IGOR SADCHENKO // C++ COREHARD // 12.02.17

НАШ ПУТЬ

Page 6: Mixing c++ and python

О PYTHON

Page 7: Mixing c++ and python

6

Python — это свободный интерпретируемый объектно-ориентированный расширяемый встраиваемый язык программирования очень высокого уровня.

• свободный — все исходные тексты интерпретатора и библиотек доступны для любого, включая коммерческое, использования;

• интерпретируемый — поэтому кроссплатформенный, имеет рефлексию;

• объектно-ориентированный — классическая OO модель, включая множественное наследование;

• расширяемый — имеет API для создания модулей, типов и классов на C, C++;

• встраиваемый — имеет API для встраивания интерпретатора в другие программы;

• очень высокого уровня — динамическая типизация, встроенные типы данных высокого уровня, классы, модули, механизм исключений.

C++ COREHARD WINTER 2017 // МОТИВАЦИЯ

IGOR SADCHENKO // C++ COREHARD // 12.02.17

СПРАВКА

Page 8: Mixing c++ and python

7

Python ориентирован на повышение производительности разработчика и читаемости кода.

В Python есть дзен (import this), описывающий общие подходы к разработке.

Синтаксис ядра Python минималистичен. В то же время стандартная библиотека включает большой объём полезных функций.

Python активно развивается и имеет огромное community.

К недостаткам относят низкую производительность и отсутствие реальной многопоточности(GIL)

C++ COREHARD WINTER 2017 // МОТИВАЦИЯ

IGOR SADCHENKO // C++ COREHARD // 12.02.17

СПРАВКА

Page 9: Mixing c++ and python

8

Python — язык универсальный, он широко используется во всем мире для самых разных целей — базы данных и обработка текстов, встраивание интерпретатора в игры, программирование GUI и быстрая разработка приложений(RAD).

И, конечно же, Python используется для программирования web-приложений — серверных, клиентских, web-серверов и серверов приложений.

Python и приложения, написанные на нем, используют самые известные и крупные фирмы — IBM, Yahoo!, Google.com, Hewlett Packard, NASA, Red Hat, Microsoft.

C++ COREHARD WINTER 2017 // МОТИВАЦИЯ

IGOR SADCHENKO // C++ COREHARD // 12.02.17

СПРАВКА

Page 10: Mixing c++ and python

9

C++ Python

компиляция интерпретация

статическая типизация динамическая типизация

строгая типизация строгая типизация

сложный для изучения? лёгкий для изучения?

эффективное управление памятью сборщик мусора

есть стандартная библиотека мощная стандартная библиотека

С++xx…;) рефлексия и интроспекция

высокая производительность кода высокая производительность

разработчика

C++ COREHARD WINTER 2017 // МОТИВАЦИЯ

IGOR SADCHENKO // C++ COREHARD // 12.02.17

СРАВНЕНИЕ C++ и PYTHON

Page 11: Mixing c++ and python

10

C++ COREHARD WINTER 2017 // МОТИВАЦИЯ

IGOR SADCHENKO // C++ COREHARD // 12.02.17

СРАВНЕНИЕ C++ И PYTHON

Page 12: Mixing c++ and python

11

C++ COREHARD WINTER 2017 // МОТИВАЦИЯ

IGOR SADCHENKO // C++ COREHARD // 12.02.17

ПОЛОЖИТЕЛЬНЫЕ СТОРОНЫ

1. С++:

a. Производительность

b. Эффективная работа с ресурсами

2. Python:

a. Скорость разработки

b. Разнообразие доступных решений

c. Лёгкость изучения

Page 13: Mixing c++ and python

12

C++ COREHARD WINTER 2017 // МОТИВАЦИЯ

IGOR SADCHENKO // C++ COREHARD // 12.02.17

Page 14: Mixing c++ and python

ИНТЕГРАЦИЯ

Page 15: Mixing c++ and python

14

C++ COREHARD WINTER 2017 // ИНТЕГРАЦИЯ

IGOR SADCHENKO // C++ COREHARD // 12.02.17

РЕШЕНИЯ

Python

• ctypes – библиотека Python для импорта функций из внешних

библиотек

• cffi(C Foreign Function Interface) - механизм для импорта

функций из внешних библиотек, основанный использовании

на C-подобных деклараций

Page 16: Mixing c++ and python

15

C++ COREHARD WINTER 2017 // ИНТЕГРАЦИЯ

IGOR SADCHENKO // C++ COREHARD // 12.02.17

РЕШЕНИЯ

Не совсем Python

• Cython- преобразуется в С/С++ код для последующей

компиляции и впоследствии может использоваться как

расширение стандартного Python или как независимое

приложение со встроенной библиотекой выполнения Cython.

• RPython (Restricted Python) - ограниченное подмножество

Python, статически типизирован, транслируется в языки С,

Java, CIL

Page 17: Mixing c++ and python

16

C++ COREHARD WINTER 2017 // ИНТЕГРАЦИЯ

IGOR SADCHENKO // C++ COREHARD // 12.02.17

РЕШЕНИЯ

SWIG(Simplified Wrapper and Interface Generator)

• Без зависимостей (для запуска нужен один .exe), не нужны

целевые языки

• Доступен на многих платформах

• Поддерживает структуры С и классы С++

Page 18: Mixing c++ and python

17

C++ COREHARD WINTER 2017 // ИНТЕГРАЦИЯ

IGOR SADCHENKO // C++ COREHARD // 12.02.17

РЕШЕНИЯ

Page 19: Mixing c++ and python

18

C++ COREHARD WINTER 2017 // ИНТЕГРАЦИЯ

IGOR SADCHENKO // C++ COREHARD // 12.02.17

РЕШЕНИЯ

С & C++

• Python C API

• Boost.Python

• Pybind11

Page 20: Mixing c++ and python

19

C++ COREHARD WINTER 2017 // ИНТЕГРАЦИЯ

IGOR SADCHENKO // C++ COREHARD // 12.02.17

Python C API

• Самая тесная интеграция с Python из всех возможных

• Лучшая производительность

• Нужно все время считать ссылки

• Нужно хорошо знать C

• Хорошо документирован

• Объемный

• Опасно использовать не понимая

Page 21: Mixing c++ and python

20

C++ COREHARD WINTER 2017 // ИНТЕГРАЦИЯ

IGOR SADCHENKO // C++ COREHARD // 12.02.17

Python C API (пример)

Page 22: Mixing c++ and python

21

C++ COREHARD WINTER 2017 // ИНТЕГРАЦИЯ

IGOR SADCHENKO // C++ COREHARD // 12.02.17

Python C API (пример)

Page 23: Mixing c++ and python

22

C++ COREHARD WINTER 2017 // ИНТЕГРАЦИЯ

IGOR SADCHENKO // C++ COREHARD // 12.02.17

Python C API (встраивание)

Page 24: Mixing c++ and python

23

C++ COREHARD WINTER 2017 // ИНТЕГРАЦИЯ

IGOR SADCHENKO // C++ COREHARD // 12.02.17

Boost.Python

• Позволяет небольшими усилиями экспортировать типы из C++

в Python

• Без сторонних утилит, только С++ компилятор

• Подходит для оборачивания сторонних библиотек без

изменения их кода)

• Extensions and embedding

Page 25: Mixing c++ and python

24

C++ COREHARD WINTER 2017 // ИНТЕГРАЦИЯ

IGOR SADCHENKO // C++ COREHARD // 12.02.17

Boost.Python (пример)

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

#include <boost/python.hpp>

BOOST_PYTHON_MODULE(hello_ext) {using namespace boost::python;def("greet", greet);

}

>>> import hello_ext

>>> print hello_ext.greet()hello, world

Page 26: Mixing c++ and python

25

C++ COREHARD WINTER 2017 // ИНТЕГРАЦИЯ

IGOR SADCHENKO // C++ COREHARD // 12.02.17

Boost.Python (пример)

struct World {

World(std::string msg): msg(msg) {} // added constructor

void set(std::string msg_) { this->msg = msg_; }

std::string greet() { return msg; }

std::string msg;

};

class_<World>("World", init<std::string>()).def(init<double, double>()).def("greet", &World::greet).def("set", &World::set);

Page 27: Mixing c++ and python

26

C++ COREHARD WINTER 2017 // ИНТЕГРАЦИЯ

IGOR SADCHENKO // C++ COREHARD // 12.02.17

Pybind11

• Аналог Boost.Python

• Поддерживает STL и callback

• header only

Page 28: Mixing c++ and python

27

C++ COREHARD WINTER 2017 // ИНТЕГРАЦИЯ

IGOR SADCHENKO // C++ COREHARD // 12.02.17

Pybind11

• Аналог Boost.Python

• Активно развивается

• Поддерживает STL и callback

• header only

Page 29: Mixing c++ and python

28

C++ COREHARD WINTER 2017 // ИНТЕГРАЦИЯ

IGOR SADCHENKO // C++ COREHARD // 12.02.17

pybind11

Page 30: Mixing c++ and python

ВЫВОДЫ

Page 31: Mixing c++ and python

30

C++ COREHARD WINTER 2017 // ВЫВОДЫ

IGOR SADCHENKO // C++ COREHARD // 12.02.17

ВЫВОДЫ

• Python можно расширять С++ модулями для увеличения

производительности

• Python можно встраивать в С++ программы для упрощения

разработки

• Существует библиотеки для выполнения этих действий

Page 32: Mixing c++ and python

СПАСИБО ЗА ВНИМАНИЕ!

Page 33: Mixing c++ and python

IGOR SADCHENKO

software developer

+375 33 642 92 91

https://www.facebook.com/WargamingMinsk

ANY QUESTIONS?

[email protected]

wargaming.com

https://www.linkedin.com/company/wargaming-net