SlideShare uma empresa Scribd logo
1 de 45
Baixar para ler offline
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Особенности создания XS-модулей на языке
C++
Владимир Тимофеев
2013
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
1 Введение
2 Пример
3 Как найти компилятор
4 Конфликты имен
5 Исключения
6 Заключение
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
1 Введение
Почему XS
Почему C++
2 Пример
3 Как найти компилятор
4 Конфликты имен
5 Исключения
6 Заключение
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Почему XS?
Потому что мы хотим:
Увеличить производительность
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Почему XS?
Потому что мы хотим:
Увеличить производительность
Уменьшить потребление памяти
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Почему XS?
Потому что мы хотим:
Увеличить производительность
Уменьшить потребление памяти
Использовать сторонние компоненты
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Почему C++ ?
XS – кодогенератор для C. Но C++ …
Похож на C
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Почему C++ ?
XS – кодогенератор для C. Но C++ …
Похож на C
Сравним по скорости и потреблению памяти
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Почему C++ ?
XS – кодогенератор для C. Но C++ …
Похож на C
Сравним по скорости и потреблению памяти
+ Инкапсуляция
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Почему C++ ?
XS – кодогенератор для C. Но C++ …
Похож на C
Сравним по скорости и потреблению памяти
+ Инкапсуляция
+ STL, Boost, …
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
1 Введение
2 Пример
Обзор файлов
3 Как найти компилятор
4 Конфликты имен
5 Исключения
6 Заключение
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Пример
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 );
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Пример
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;
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Пример
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
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Пример
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 };
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Пример
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();
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Пример
Makefile.PL CppStat.pm CppStat.xs typemap perlobject.map
TYPEMAP
2 CppStat * O_OBJECT
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Пример
Makefile.PL CppStat.pm CppStat.xs typemap perlobject.map
Можно поискать в интернете
или сгенерировать с помощью модуля
ExtUtils::Typemap::ObjectMap на CPAN
или почитать perldoc perlxs
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
1 Введение
2 Пример
3 Как найти компилятор
CC = g++
-x c++
ExtUtils::CppGuess
Module::Build::WithXSpp
Статистика
4 Конфликты имен
5 Исключения
6 Заключение
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
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++
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
-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++
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
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++
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Module::Build::WithXSpp
Использует ExtUtils::CppGuess, но...
XS++
Module::Build
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Статистика
Всего на CPAN: ∼ 120
CC = g++: ∼ 50
ExtUtils::CppGuess: 13
Module::Build: ∼ 15
Module::Build::WithXSpp: 6
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
1 Введение
2 Пример
3 Как найти компилятор
4 Конфликты имен
iostream
5 Исключения
6 Заключение
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Конфликты имен
#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
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
1 Введение
2 Пример
3 Как найти компилятор
4 Конфликты имен
5 Исключения
Обычная генерация Perl-исключений
Наивная реализация C++ -исключений
C++ -исключения без утечек
6 Заключение
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Просто и неправильно
MyClass.cc
1 void MyClass::method(int arg) {
std::vectorint tmp;
3 if (arg  0) croak(”MyClass::method: arg should
be positive”);
// ...
5 }
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Просто и неправильно
MyClass.cc
1 void MyClass::method(int arg) {
std::vectorint tmp;
3 if (arg  0) croak(”MyClass::method: arg should
be positive”);
// ...
5 }
Утечка памяти
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Просто и неправильно
MyClass.cc
1 void MyClass::method(int arg) {
std::vectorint tmp;
3 if (arg  0) croak(”MyClass::method: arg should
be positive”);
// ...
5 }
Утечка памяти
Деструктор для tmp вызван не будет
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Просто и неправильно
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
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Переходим к 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 // ...
}
Программа упадет
Исключение надо еще перехватить
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Переходим к C++ исключениям
MyModule.xs
void
2 MyClass::method(int arg);
Придется переписать и обернуть в try...catch.
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Переходим к 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 }
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Переходим к 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 }
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Переходим к 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 }
И получим опять утечку памяти (хоть и мелкую)
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Переходим к 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
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Вот так не течет
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);
}
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
1 Введение
2 Пример
3 Как найти компилятор
4 Конфликты имен
5 Исключения
6 Заключение
MakeMaker?
exceptions
Выводы
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Хотелось бы писать Makefile.PL так
1 use ExtUtils::MakeMaker;
3 WriteMakefile(
NAME = ’CppStat’,
5 VERSION_FROM = ’CppStat.pm’,
TYPEMAPS = [’perlobject.map’],
7 XS_LANG = ’c++’,
);
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Может быть XS может выглядеть так?
void
2 MyClass::method(int arg)
CPPCATCH: std
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Итого
Писать на C++ можно
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Итого
Писать на C++ можно
Есть поле для улучшений
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Итого
Писать на C++ можно
Есть поле для улучшений
Вопросы?
Введение Пример Как найти компилятор Конфликты имен Исключения Заключение
Итого
Писать на C++ можно
Есть поле для улучшений
Вопросы?
mailto:vovkasm@gmail.com
Эта презентация доступна на
github.com/vovkasm/using-cpp-in-perlxs-slides

Mais conteúdo relacionado

Mais procurados

Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Dima Dzuba
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияPlatonov Sergey
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
 
Статический анализ: ошибки в медиаплеере и безглючная аська
Статический анализ: ошибки в медиаплеере и безглючная аська Статический анализ: ошибки в медиаплеере и безглючная аська
Статический анализ: ошибки в медиаплеере и безглючная аська Tatyanazaxarova
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Dima Dzuba
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекPython Meetup
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Sergey Platonov
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаSergey Platonov
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Dima Dzuba
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Googleyaevents
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
 
хитрости выведения типов
хитрости выведения типовхитрости выведения типов
хитрости выведения типовcorehard_by
 

Mais procurados (20)

Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализация
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
 
Статический анализ: ошибки в медиаплеере и безглючная аська
Статический анализ: ошибки в медиаплеере и безглючная аська Статический анализ: ошибки в медиаплеере и безглючная аська
Статический анализ: ошибки в медиаплеере и безглючная аська
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10
 
C++ exceptions
C++ exceptionsC++ exceptions
C++ exceptions
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8.
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Google
 
JRebel
JRebelJRebel
JRebel
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
course js day 2
course js day 2course js day 2
course js day 2
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
 
Bytecode
BytecodeBytecode
Bytecode
 
хитрости выведения типов
хитрости выведения типовхитрости выведения типов
хитрости выведения типов
 

Destaque

Иван Михайлов, Mail.ru
Иван Михайлов, Mail.ruИван Михайлов, Mail.ru
Иван Михайлов, Mail.ruPCampRussia
 
Studying geneva real estate prices using perl grammars
Studying geneva real estate prices using perl grammarsStudying geneva real estate prices using perl grammars
Studying geneva real estate prices using perl grammarsLaurent Dami
 
Разработка документации для RESTful API: как убить трёх зайцев одним. Moscow....
Разработка документации для RESTful API: как убить трёх зайцев одним. Moscow....Разработка документации для RESTful API: как убить трёх зайцев одним. Moscow....
Разработка документации для RESTful API: как убить трёх зайцев одним. Moscow....Moscow.pm
 
презентация на Tagline
презентация на Taglineпрезентация на Tagline
презентация на TaglineRauf Aliev
 
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013Moscow.pm
 
Mojolicious. Веб в коробке!
Mojolicious. Веб в коробке!Mojolicious. Веб в коробке!
Mojolicious. Веб в коробке!Anatoly Sharifulin
 
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Moscow.pm
 
Guitar Hero, Wikipedia, VK, Perl, Like it!
Guitar Hero, Wikipedia, VK, Perl, Like it!Guitar Hero, Wikipedia, VK, Perl, Like it!
Guitar Hero, Wikipedia, VK, Perl, Like it!Anatoly Sharifulin
 
Smirnov dependency-injection-techforum(1)
Smirnov dependency-injection-techforum(1)Smirnov dependency-injection-techforum(1)
Smirnov dependency-injection-techforum(1)kuchinskaya
 
Ленивые итераторы для разбора разнородных данных. Михаил Озеров. Moscow.pm 6 ...
Ленивые итераторы для разбора разнородных данных. Михаил Озеров. Moscow.pm 6 ...Ленивые итераторы для разбора разнородных данных. Михаил Озеров. Moscow.pm 6 ...
Ленивые итераторы для разбора разнородных данных. Михаил Озеров. Moscow.pm 6 ...Moscow.pm
 
Perl Myths 200909
Perl Myths 200909Perl Myths 200909
Perl Myths 200909Tim Bunce
 
Buytaert kris tools
Buytaert kris toolsBuytaert kris tools
Buytaert kris toolskuchinskaya
 
Введение в веб-технологии. Лекция.
Введение в веб-технологии. Лекция. Введение в веб-технологии. Лекция.
Введение в веб-технологии. Лекция. Rauf Aliev
 
О работе с документами .xls, .xlsx, .rtf
О работе с документами .xls, .xlsx, .rtfО работе с документами .xls, .xlsx, .rtf
О работе с документами .xls, .xlsx, .rtfMoscow.pm
 
Владимир Перепелица "Модули"
Владимир Перепелица "Модули"Владимир Перепелица "Модули"
Владимир Перепелица "Модули"Media Gorod
 
Romanova techforum bash
Romanova techforum bashRomanova techforum bash
Romanova techforum bashkuchinskaya
 

Destaque (20)

Иван Михайлов, Mail.ru
Иван Михайлов, Mail.ruИван Михайлов, Mail.ru
Иван Михайлов, Mail.ru
 
Studying geneva real estate prices using perl grammars
Studying geneva real estate prices using perl grammarsStudying geneva real estate prices using perl grammars
Studying geneva real estate prices using perl grammars
 
Разработка документации для RESTful API: как убить трёх зайцев одним. Moscow....
Разработка документации для RESTful API: как убить трёх зайцев одним. Moscow....Разработка документации для RESTful API: как убить трёх зайцев одним. Moscow....
Разработка документации для RESTful API: как убить трёх зайцев одним. Moscow....
 
Gc2005vk
Gc2005vkGc2005vk
Gc2005vk
 
презентация на Tagline
презентация на Taglineпрезентация на Tagline
презентация на Tagline
 
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
 
Mojolicious. Веб в коробке!
Mojolicious. Веб в коробке!Mojolicious. Веб в коробке!
Mojolicious. Веб в коробке!
 
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
 
Perepelitsa
PerepelitsaPerepelitsa
Perepelitsa
 
Kharkov
KharkovKharkov
Kharkov
 
Guitar Hero, Wikipedia, VK, Perl, Like it!
Guitar Hero, Wikipedia, VK, Perl, Like it!Guitar Hero, Wikipedia, VK, Perl, Like it!
Guitar Hero, Wikipedia, VK, Perl, Like it!
 
Smirnov dependency-injection-techforum(1)
Smirnov dependency-injection-techforum(1)Smirnov dependency-injection-techforum(1)
Smirnov dependency-injection-techforum(1)
 
Ленивые итераторы для разбора разнородных данных. Михаил Озеров. Moscow.pm 6 ...
Ленивые итераторы для разбора разнородных данных. Михаил Озеров. Moscow.pm 6 ...Ленивые итераторы для разбора разнородных данных. Михаил Озеров. Moscow.pm 6 ...
Ленивые итераторы для разбора разнородных данных. Михаил Озеров. Moscow.pm 6 ...
 
Ae internals
Ae internalsAe internals
Ae internals
 
Perl Myths 200909
Perl Myths 200909Perl Myths 200909
Perl Myths 200909
 
Buytaert kris tools
Buytaert kris toolsBuytaert kris tools
Buytaert kris tools
 
Введение в веб-технологии. Лекция.
Введение в веб-технологии. Лекция. Введение в веб-технологии. Лекция.
Введение в веб-технологии. Лекция.
 
О работе с документами .xls, .xlsx, .rtf
О работе с документами .xls, .xlsx, .rtfО работе с документами .xls, .xlsx, .rtf
О работе с документами .xls, .xlsx, .rtf
 
Владимир Перепелица "Модули"
Владимир Перепелица "Модули"Владимир Перепелица "Модули"
Владимир Перепелица "Модули"
 
Romanova techforum bash
Romanova techforum bashRomanova techforum bash
Romanova techforum bash
 

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

Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 
Построение компилятора на базе LLVM — Павел Сычев
 Построение компилятора на базе LLVM — Павел Сычев Построение компилятора на базе LLVM — Павел Сычев
Построение компилятора на базе LLVM — Павел СычевYandex
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.Infinity
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupMail.ru Group
 
Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Yauheni Akhotnikau
 
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Ivan Tsyganov
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиTatyanazaxarova
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаAndrey Karpov
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Mikhail Kurnosov
 
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
C++ осень 2013 лекция 7
C++ осень 2013 лекция 7C++ осень 2013 лекция 7
C++ осень 2013 лекция 7Technopark
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...corehard_by
 
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6Technopark
 

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

Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Построение компилятора на базе LLVM — Павел Сычев
 Построение компилятора на базе LLVM — Павел Сычев Построение компилятора на базе LLVM — Павел Сычев
Построение компилятора на базе LLVM — Павел Сычев
 
бегун
бегунбегун
бегун
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
 
Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?
 
бегун
бегунбегун
бегун
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибками
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кода
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
 
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
 
C++ осень 2013 лекция 7
C++ осень 2013 лекция 7C++ осень 2013 лекция 7
C++ осень 2013 лекция 7
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
 
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6
 

Mais de Moscow.pm

Fast queue – как мы сделали свою очередь на perl и redis
Fast queue – как мы сделали свою очередь на perl и redisFast queue – как мы сделали свою очередь на perl и redis
Fast queue – как мы сделали свою очередь на perl и redisMoscow.pm
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьMoscow.pm
 
Язык Go для Perl-программистов v1.1. Александр Орловский. Moscow.pm 4 июля 2013
Язык Go для Perl-программистов v1.1. Александр Орловский. Moscow.pm 4 июля 2013Язык Go для Perl-программистов v1.1. Александр Орловский. Moscow.pm 4 июля 2013
Язык Go для Perl-программистов v1.1. Александр Орловский. Moscow.pm 4 июля 2013Moscow.pm
 
Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013
Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013
Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013Moscow.pm
 
Play Perl — распределенная социальная игра для Perl-разработчиков. Вячеслав М...
Play Perl — распределенная социальная игра для Perl-разработчиков. Вячеслав М...Play Perl — распределенная социальная игра для Perl-разработчиков. Вячеслав М...
Play Perl — распределенная социальная игра для Perl-разработчиков. Вячеслав М...Moscow.pm
 
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...Moscow.pm
 

Mais de Moscow.pm (6)

Fast queue – как мы сделали свою очередь на perl и redis
Fast queue – как мы сделали свою очередь на perl и redisFast queue – как мы сделали свою очередь на perl и redis
Fast queue – как мы сделали свою очередь на perl и redis
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать жить
 
Язык Go для Perl-программистов v1.1. Александр Орловский. Moscow.pm 4 июля 2013
Язык Go для Perl-программистов v1.1. Александр Орловский. Moscow.pm 4 июля 2013Язык Go для Perl-программистов v1.1. Александр Орловский. Moscow.pm 4 июля 2013
Язык Go для Perl-программистов v1.1. Александр Орловский. Moscow.pm 4 июля 2013
 
Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013
Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013
Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013
 
Play Perl — распределенная социальная игра для Perl-разработчиков. Вячеслав М...
Play Perl — распределенная социальная игра для Perl-разработчиков. Вячеслав М...Play Perl — распределенная социальная игра для Perl-разработчиков. Вячеслав М...
Play Perl — распределенная социальная игра для Perl-разработчиков. Вячеслав М...
 
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
 

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

  • 1. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Особенности создания XS-модулей на языке C++ Владимир Тимофеев 2013
  • 2. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение 1 Введение 2 Пример 3 Как найти компилятор 4 Конфликты имен 5 Исключения 6 Заключение
  • 3. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение 1 Введение Почему XS Почему C++ 2 Пример 3 Как найти компилятор 4 Конфликты имен 5 Исключения 6 Заключение
  • 4. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Почему XS? Потому что мы хотим: Увеличить производительность
  • 5. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Почему XS? Потому что мы хотим: Увеличить производительность Уменьшить потребление памяти
  • 6. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Почему XS? Потому что мы хотим: Увеличить производительность Уменьшить потребление памяти Использовать сторонние компоненты
  • 7. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Почему C++ ? XS – кодогенератор для C. Но C++ … Похож на C
  • 8. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Почему C++ ? XS – кодогенератор для C. Но C++ … Похож на C Сравним по скорости и потреблению памяти
  • 9. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Почему C++ ? XS – кодогенератор для C. Но C++ … Похож на C Сравним по скорости и потреблению памяти + Инкапсуляция
  • 10. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Почему C++ ? XS – кодогенератор для C. Но C++ … Похож на C Сравним по скорости и потреблению памяти + Инкапсуляция + STL, Boost, …
  • 11. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение 1 Введение 2 Пример Обзор файлов 3 Как найти компилятор 4 Конфликты имен 5 Исключения 6 Заключение
  • 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. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Пример 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. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Пример 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. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Пример 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. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Пример 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. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Пример Makefile.PL CppStat.pm CppStat.xs typemap perlobject.map TYPEMAP 2 CppStat * O_OBJECT
  • 18. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Пример Makefile.PL CppStat.pm CppStat.xs typemap perlobject.map Можно поискать в интернете или сгенерировать с помощью модуля ExtUtils::Typemap::ObjectMap на CPAN или почитать perldoc perlxs
  • 19. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение 1 Введение 2 Пример 3 Как найти компилятор CC = g++ -x c++ ExtUtils::CppGuess Module::Build::WithXSpp Статистика 4 Конфликты имен 5 Исключения 6 Заключение
  • 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. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение -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. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение 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. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Module::Build::WithXSpp Использует ExtUtils::CppGuess, но... XS++ Module::Build
  • 24. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Статистика Всего на CPAN: ∼ 120 CC = g++: ∼ 50 ExtUtils::CppGuess: 13 Module::Build: ∼ 15 Module::Build::WithXSpp: 6
  • 25. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение 1 Введение 2 Пример 3 Как найти компилятор 4 Конфликты имен iostream 5 Исключения 6 Заключение
  • 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. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение 1 Введение 2 Пример 3 Как найти компилятор 4 Конфликты имен 5 Исключения Обычная генерация Perl-исключений Наивная реализация C++ -исключений C++ -исключения без утечек 6 Заключение
  • 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. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Просто и неправильно MyClass.cc 1 void MyClass::method(int arg) { std::vectorint tmp; 3 if (arg 0) croak(”MyClass::method: arg should be positive”); // ... 5 } Утечка памяти
  • 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. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Просто и неправильно 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. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Переходим к 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. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Переходим к C++ исключениям MyModule.xs void 2 MyClass::method(int arg); Придется переписать и обернуть в try...catch.
  • 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. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Переходим к 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. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Переходим к 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. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Переходим к 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. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Вот так не течет 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. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение 1 Введение 2 Пример 3 Как найти компилятор 4 Конфликты имен 5 Исключения 6 Заключение MakeMaker? exceptions Выводы
  • 40. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Хотелось бы писать Makefile.PL так 1 use ExtUtils::MakeMaker; 3 WriteMakefile( NAME = ’CppStat’, 5 VERSION_FROM = ’CppStat.pm’, TYPEMAPS = [’perlobject.map’], 7 XS_LANG = ’c++’, );
  • 41. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Может быть XS может выглядеть так? void 2 MyClass::method(int arg) CPPCATCH: std
  • 42. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Итого Писать на C++ можно
  • 43. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Итого Писать на C++ можно Есть поле для улучшений
  • 44. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Итого Писать на C++ можно Есть поле для улучшений Вопросы?
  • 45. Введение Пример Как найти компилятор Конфликты имен Исключения Заключение Итого Писать на C++ можно Есть поле для улучшений Вопросы? mailto:vovkasm@gmail.com Эта презентация доступна на github.com/vovkasm/using-cpp-in-perlxs-slides