0
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Особенности создания XS-модулей на языке
C++
Вла...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
1 Введение
2 Пример
3 Как найти компилятор
4 Кон...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
1 Введение
Почему XS
Почему C++
2 Пример
3 Как н...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Почему XS?
Потому что мы хотим:
Увеличить произв...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Почему XS?
Потому что мы хотим:
Увеличить произв...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Почему XS?
Потому что мы хотим:
Увеличить произв...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Почему C++ ?
XS – кодогенератор для C. Но C++ …
...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Почему C++ ?
XS – кодогенератор для C. Но C++ …
...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Почему C++ ?
XS – кодогенератор для C. Но C++ …
...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Почему C++ ?
XS – кодогенератор для C. Но C++ …
...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
1 Введение
2 Пример
Обзор файлов
3 Как найти ком...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Пример
Makefile.PL CppStat.pm CppStat.xs typemap...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Пример
Makefile.PL CppStat.pm CppStat.xs typemap...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Пример
Makefile.PL CppStat.pm CppStat.xs typemap...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Пример
Makefile.PL CppStat.pm CppStat.xs typemap...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Пример
Makefile.PL CppStat.pm CppStat.xs typemap...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Пример
Makefile.PL CppStat.pm CppStat.xs typemap...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Пример
Makefile.PL CppStat.pm CppStat.xs typemap...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
1 Введение
2 Пример
3 Как найти компилятор
CC = ...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
CC = g++
use ExtUtils::MakeMaker;
2
my $CC = ’g+...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
-x c++
1 use ExtUtils::MakeMaker;
use Config;
3
...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
ExtUtils::CppGuess
use ExtUtils::MakeMaker;
2 us...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Module::Build::WithXSpp
Использует ExtUtils::Cpp...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Статистика
Всего на CPAN: ∼ 120
CC = g++: ∼ 50
E...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
1 Введение
2 Пример
3 Как найти компилятор
4 Кон...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Конфликты имен
#ifdef __cplusplus
2 extern ”C” {...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
1 Введение
2 Пример
3 Как найти компилятор
4 Кон...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Просто и неправильно
MyClass.cc
1 void MyClass::...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Просто и неправильно
MyClass.cc
1 void MyClass::...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Просто и неправильно
MyClass.cc
1 void MyClass::...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Просто и неправильно
MyClass.cc
1 void MyClass::...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Переходим к C++ исключениям
MyClass.cc
1 #includ...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Переходим к C++ исключениям
MyModule.xs
void
2 M...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Переходим к C++ исключениям
MyModule.xs
void
2 M...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Переходим к C++ исключениям
void
2 MyClass::meth...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Переходим к C++ исключениям
void
2 MyClass::meth...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Переходим к C++ исключениям
void
2 MyClass::meth...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Вот так не течет
void
2 MyClass::method(int arg)...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
1 Введение
2 Пример
3 Как найти компилятор
4 Кон...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Хотелось бы писать Makefile.PL так
1 use ExtUtil...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Может быть XS может выглядеть так?
void
2 MyClas...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Итого
Писать на C++ можно
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Итого
Писать на C++ можно
Есть поле для улучшений
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Итого
Писать на C++ можно
Есть поле для улучшени...
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Итого
Писать на C++ можно
Есть поле для улучшени...
Upcoming SlideShare
Loading in...5
×

Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 июля 2013

295

Published on

- Почему C++? Плюсы, минусы.
- Как найти компилятор (поддержка в EUMM, MB, стандартные и не очень решения).
- Конфликты имён.
- Трансляция C++ исключений в Perl-исключения.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
295
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
5
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 июля 2013"

  1. 1. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Особенности создания XS-модулей на языке C++ Владимир Тимофеев 2013
  2. 2. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение 1 Введение 2 Пример 3 Как найти компилятор 4 Конфликты имен 5 Исключения 6 Заключение
  3. 3. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение 1 Введение Почему XS Почему C++ 2 Пример 3 Как найти компилятор 4 Конфликты имен 5 Исключения 6 Заключение
  4. 4. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Почему XS? Потому что мы хотим: Увеличить производительность
  5. 5. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Почему XS? Потому что мы хотим: Увеличить производительность Уменьшить потребление памяти
  6. 6. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Почему XS? Потому что мы хотим: Увеличить производительность Уменьшить потребление памяти Использовать сторонние компоненты
  7. 7. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Почему C++ ? XS – кодогенератор для C. Но C++ … Похож на C
  8. 8. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Почему C++ ? XS – кодогенератор для C. Но C++ … Похож на C Сравним по скорости и потреблению памяти
  9. 9. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Почему C++ ? XS – кодогенератор для C. Но C++ … Похож на C Сравним по скорости и потреблению памяти + Инкапсуляция
  10. 10. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Почему C++ ? XS – кодогенератор для C. Но C++ … Похож на C Сравним по скорости и потреблению памяти + Инкапсуляция + STL, Boost, …
  11. 11. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение 1 Введение 2 Пример Обзор файлов 3 Как найти компилятор 4 Конфликты имен 5 Исключения 6 Заключение
  12. 12. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Пример Makefile.PL CppStat.pm CppStat.xs typemap perlobject.map 1 use ExtUtils::MakeMaker; 3 my $CC = ’g++’; 5 WriteMakefile( NAME = ’CppStat’, 7 VERSION_FROM = ’CppStat.pm’, TYPEMAPS = [’perlobject.map’], 9 CC = $CC, LD = ’$(CC)’, 11 );
  13. 13. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Пример Makefile.PL CppStat.pm CppStat.xs typemap perlobject.map package CppStat; 2 use strict; use warnings; 4 our $VERSION = ’0.01’; 6 require XSLoader; 8 XSLoader::load(’CppStat’, $VERSION); 10 1;
  14. 14. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Пример Makefile.PL CppStat.pm CppStat.xs typemap perlobject.map #ifdef __cplusplus 2 extern ”C” { #endif 4 #include ”EXTERN.h” 6 #include ”perl.h” 8 #ifdef __cplusplus } 10 #endif 12 #include ”XSUB.h” 14 #include numeric #include vector
  15. 15. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Пример Makefile.PL CppStat.pm CppStat.xs typemap perlobject.map class CppStat { 18 public: CppStat() : values() { } 20 ~CppStat() { } 22 void add(double val) { values.push_back(val); 24 } double avg() const { 26 return std::accumulate( values.begin(), values.end(), 0.0 28 ) / values.size(); } 30 private: std::vectordouble values; 32 };
  16. 16. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Пример Makefile.PL CppStat.pm CppStat.xs typemap perlobject.map 34 MODULE = CppStat PACKAGE = CppStat 36 CppStat* CppStat::new(); 38 void 40 CppStat::DESTROY(); 42 void CppStat::add(double val); 44 double 46 CppStat::avg();
  17. 17. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Пример Makefile.PL CppStat.pm CppStat.xs typemap perlobject.map TYPEMAP 2 CppStat * O_OBJECT
  18. 18. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Пример Makefile.PL CppStat.pm CppStat.xs typemap perlobject.map Можно поискать в интернете или сгенерировать с помощью модуля ExtUtils::Typemap::ObjectMap на CPAN или почитать perldoc perlxs
  19. 19. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение 1 Введение 2 Пример 3 Как найти компилятор CC = g++ -x c++ ExtUtils::CppGuess Module::Build::WithXSpp Статистика 4 Конфликты имен 5 Исключения 6 Заключение
  20. 20. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение CC = g++ use ExtUtils::MakeMaker; 2 my $CC = ’g++’; 4 WriteMakefile( 6 NAME = ’CppStat’, VERSION_FROM = ’CppStat.pm’, 8 TYPEMAPS = [’perlobject.map’], CC = $CC, 10 LD = ’$(CC)’, ); Только GCC Все файлы как C++
  21. 21. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение -x c++ 1 use ExtUtils::MakeMaker; use Config; 3 my $CCFLAGS = join(’ ’,$Config{ccflags},’-x c++’); 5 WriteMakefile( 7 NAME = ’CppStat’, VERSION_FROM = ’CppStat.pm’, 9 TYPEMAPS = [’perlobject.map’], LIBS = [’-lstdc++’], 11 CCFLAGS = $CCFLAGS , ); Компилятор тот же, что для perl Компилятор должен понимать опцию -x (GCC,Clang) Все файлы как C++
  22. 22. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение ExtUtils::CppGuess use ExtUtils::MakeMaker; 2 use ExtUtils::CppGuess; 4 my $guess = ExtUtils::CppGuess -new; 6 WriteMakefile( NAME = ’CppStat’, 8 VERSION_FROM = ’CppStat.pm’, TYPEMAPS = [’perlobject.map’], 10 CONFIGURE_REQUIRES = { ’ExtUtils::CppGuess’ = 0, 12 }, $guess-makemaker_options , 14 ); Компилятор тот же, что для perl GCC,Clang,MSVC Все файлы как C++
  23. 23. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Module::Build::WithXSpp Использует ExtUtils::CppGuess, но... XS++ Module::Build
  24. 24. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Статистика Всего на CPAN: ∼ 120 CC = g++: ∼ 50 ExtUtils::CppGuess: 13 Module::Build: ∼ 15 Module::Build::WithXSpp: 6
  25. 25. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение 1 Введение 2 Пример 3 Как найти компилятор 4 Конфликты имен iostream 5 Исключения 6 Заключение
  26. 26. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Конфликты имен #ifdef __cplusplus 2 extern ”C” { #endif 4 #include ”EXTERN.h” 6 #include ”perl.h” 8 #ifdef __cplusplus } 10 #endif 12 #include ”XSUB.h” 14 #undef do_open #undef do_close 16 #include iostream
  27. 27. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение 1 Введение 2 Пример 3 Как найти компилятор 4 Конфликты имен 5 Исключения Обычная генерация Perl-исключений Наивная реализация C++ -исключений C++ -исключения без утечек 6 Заключение
  28. 28. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Просто и неправильно MyClass.cc 1 void MyClass::method(int arg) { std::vectorint tmp; 3 if (arg 0) croak(”MyClass::method: arg should be positive”); // ... 5 }
  29. 29. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Просто и неправильно MyClass.cc 1 void MyClass::method(int arg) { std::vectorint tmp; 3 if (arg 0) croak(”MyClass::method: arg should be positive”); // ... 5 } Утечка памяти
  30. 30. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Просто и неправильно MyClass.cc 1 void MyClass::method(int arg) { std::vectorint tmp; 3 if (arg 0) croak(”MyClass::method: arg should be positive”); // ... 5 } Утечка памяти Деструктор для tmp вызван не будет
  31. 31. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Просто и неправильно MyClass.cc 1 void MyClass::method(int arg) { std::vectorint tmp; 3 if (arg 0) croak(”MyClass::method: arg should be positive”); // ... 5 } Утечка памяти Деструктор для tmp вызван не будет Потому что croak реализован через longjmp
  32. 32. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Переходим к C++ исключениям MyClass.cc 1 #include stdexcept void MyClass::method(int arg) { 3 std::vectorint tmp; if (arg 0) throw std::runtime_error( 5 ”MyClass::method: arg should be positive” ); 7 // ... } Программа упадет Исключение надо еще перехватить
  33. 33. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Переходим к C++ исключениям MyModule.xs void 2 MyClass::method(int arg); Придется переписать и обернуть в try...catch.
  34. 34. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Переходим к C++ исключениям MyModule.xs void 2 MyClass::method(int arg); Придется переписать и обернуть в try...catch. void 2 MyClass::method(int arg) CODE: 4 try { THIS-method(arg); 6 } catch (const std::exception e) { 8 croak(”Ops: %s”, e.what()); } 10 catch (...) { croak(”Ops: unknown c++ exception”); 12 }
  35. 35. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Переходим к C++ исключениям void 2 MyClass::method(int arg) CODE: 4 try { THIS-method(arg); 6 } catch (const std::exception e) { 8 croak(”Ops: %s”, e.what()); } 10 catch (...) { croak(”Ops: unknown c++ exception”); 12 }
  36. 36. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Переходим к C++ исключениям void 2 MyClass::method(int arg) CODE: 4 try { THIS-method(arg); 6 } catch (const std::exception e) { 8 croak(”Ops: %s”, e.what()); } 10 catch (...) { croak(”Ops: unknown c++ exception”); 12 } И получим опять утечку памяти (хоть и мелкую)
  37. 37. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Переходим к C++ исключениям void 2 MyClass::method(int arg) CODE: 4 try { THIS-method(arg); 6 } catch (const std::exception e) { 8 croak(”Ops: %s”, e.what()); } 10 catch (...) { croak(”Ops: unknown c++ exception”); 12 } И получим опять утечку памяти (хоть и мелкую) Именно в такой код наши вызовы оборачивает ExtUtils::XSpp
  38. 38. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Вот так не течет void 2 MyClass::method(int arg) CODE: 4 char errmsg[1024]; errmsg[0] = ’0’; 6 try { THIS-method(arg); 8 } catch (const std::exception e) { 10 snprintf(errmsg, 1024, ”Ops: %s”, e.what()) ; } 12 catch (...) { snprintf(errmsg, 1024, ”Ops: unknown c++ exception”); 14 } if (errmsg[0]) { 16 croak(”%s”, errmsg); }
  39. 39. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение 1 Введение 2 Пример 3 Как найти компилятор 4 Конфликты имен 5 Исключения 6 Заключение MakeMaker? exceptions Выводы
  40. 40. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Хотелось бы писать Makefile.PL так 1 use ExtUtils::MakeMaker; 3 WriteMakefile( NAME = ’CppStat’, 5 VERSION_FROM = ’CppStat.pm’, TYPEMAPS = [’perlobject.map’], 7 XS_LANG = ’c++’, );
  41. 41. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Может быть XS может выглядеть так? void 2 MyClass::method(int arg) CPPCATCH: std
  42. 42. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Итого Писать на C++ можно
  43. 43. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Итого Писать на C++ можно Есть поле для улучшений
  44. 44. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Итого Писать на C++ можно Есть поле для улучшений Вопросы?
  45. 45. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Итого Писать на C++ можно Есть поле для улучшений Вопросы? mailto:vovkasm@gmail.com Эта презентация доступна на github.com/vovkasm/using-cpp-in-perlxs-slides
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×