gerando bindings de bibliotecas c++ para python

21

Upload: marcelo-lira

Post on 27-Jun-2015

2.048 views

Category:

Documents


0 download

DESCRIPTION

Shiboken é o gerador de bindings C++ para Python, e é usado pelo PySide os bindings Python da biblioteca Qt.

TRANSCRIPT

Page 1: Gerando bindings de bibliotecas C++ para Python

Gerando bindings de bibliotecasC++ para PythonMarcelo Lira - setanta

1 de Outubro / São Paulo - SP

Page 2: Gerando bindings de bibliotecas C++ para Python

Sobre o palestrante e seus overlords

� Desenvolvedor híbrido Python/C++

� Membro da equipe principal do PySide

� INDT - Instituto Nokia de Tecnologia

Page 3: Gerando bindings de bibliotecas C++ para Python

O Que Veremos Hoje

� Breve história

� De�nição do problema

� Gerando bindings

Mais uma iniciação que um tutorial.

Page 4: Gerando bindings de bibliotecas C++ para Python

PySide

"Senta que lá vem estória..."

� Parte I� Qt da Trolltech.� Nokia compra Trolltech.� Qt da Nokia.� Qt passa do desenvolvimento fechado pro aberto.

� Parte II� PyQt da Riverbank.� Nokia negocia com Riverbank.� PyQt da Riverbank.� INDT faz o PySide.

Page 5: Gerando bindings de bibliotecas C++ para Python

Genealogia do Gerador de Bindings

Page 6: Gerando bindings de bibliotecas C++ para Python

O Problema

Como usar bibliotecas

C++ em Python?

Page 7: Gerando bindings de bibliotecas C++ para Python

Problemas com C

� Converter de/para tipos primitivos

Python

int <-> intstruct MyString <-> unicode

� Representar tipos em Python

struct Text {struct MyString* paragraph;int lines;

};Text <-> Text

Page 8: Gerando bindings de bibliotecas C++ para Python

Wrappers

Page 9: Gerando bindings de bibliotecas C++ para Python

Identidade dos Objetos

� Objeto passado por valor:alterações sobre a cópia

struct Foo;

void function(Foo foo);

� Objeto passado por ponteiro:alterações sobre o original

void function(Foo* foo);

Page 10: Gerando bindings de bibliotecas C++ para Python

Identidade dos Objetos

Page 11: Gerando bindings de bibliotecas C++ para Python

Mais Problemas com C++

� Overload de métodos

� Métodos virtuais

� Coisas protegidas

� Conversões implícitas

� Herança múltipla

� Templates & containers

� Posse de objetos

Binding C++: http://setantas.net/pages/bindingcpp.html

Page 12: Gerando bindings de bibliotecas C++ para Python

Overload de Métodos

Page 13: Gerando bindings de bibliotecas C++ para Python

Gerador de Bindings

� Coletor de informações sobre a biblioteca

C++ alvo

� Capaz de inserir modi�cações do usuário

� Necessário para bibliotecas grandes

Page 14: Gerando bindings de bibliotecas C++ para Python

Shiboken

� Shiboken é o gerador de bindings usado para criar os

bindings PySide.

� Usa Qt, mas os bindings gerados não dependem dela.

� Está licenciado sob GPL.

Page 15: Gerando bindings de bibliotecas C++ para Python

libshiboken

� libshiboken é a biblioteca de apoio para osbindings gerados pelo Shiboken.

� Licenciada sob a LGPL.

Page 16: Gerando bindings de bibliotecas C++ para Python

Descrição do Binding

<typesystem package="sample">

<primitive-type name="int"/>

<primitive-type name="Complex" target-lang-api-name="PyComplex">

<conversion-rule file="complex_conversions.h"/>

<include file-name="complex.h" location="global"/>

</primitive-type>

<value-type name="Number">

<enum-type name="NumberEnum"/>

<!-- blah blah blah -->

</value-type>

<object-type name="SimpleFile"/>

<namespace-type name="SampleNamespace">

<value-type name="SomeClass"/>

</namespace-type>

</typesystem>

Page 17: Gerando bindings de bibliotecas C++ para Python

Conversor de Tipos

template<> struct Converter<Complex> {

static inline bool checkType(PyObject* pyObj) {

return PyComplex_Check(pyObj);

}

static inline bool isConvertible(PyObject* pyObj) {

return PyComplex_Check(pyObj);

}

static inline PyObject* toPython(const Complex& cpx) {

return PyComplex_FromDoubles(cpx.real(), cpx.imag());

}

static inline Complex toCpp(PyObject* pyobj) {

double real = PyComplex_RealAsDouble(pyobj);

double imag = PyComplex_ImagAsDouble(pyobj);

return Complex(real, imag);

}

};

Page 18: Gerando bindings de bibliotecas C++ para Python

Namespaces

<namespace-type name="SampleNamespace">

<value-type name="SomeClass"/>

</namespace-type>

� Namespaces C++ se tornam classes nãoinstanciáveis em Python

� Classes internas ao namespace aparecem como:

import sample

obj = sample.SampleNamespace.SomeClass()

Page 19: Gerando bindings de bibliotecas C++ para Python

Modi�cações

<value-type name="Number">

<modify-function signature="sumArray(int*,int)">

<modify-argument index="1">

<replace-type modified-type="PySequence" />

</modify-argument>

<modify-argument index="2">

<remove-argument />

</modify-argument>

<inject-code class="target" position="beginning">

int length = PySequence_Size(%PYARG_1);

Shiboken::AutoArrayPointer<int> array(length);

for (int i = 0; i < length; ++i)

array[i] = %CONVERTTOCPP[int](PySequence_GetItem(%PYARG_1, i));

%RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(array, length);

%PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);

</inject-code>

</modify-function>

</value-type>

Page 20: Gerando bindings de bibliotecas C++ para Python

Melhorias Desejáveis

� Uma ferramenta para iniciar o desenvolvimento debindings.

� Utilitário grá�co para edição atualização dosbindings.

� Bindings Python para a libapiextractor (casa deferreiro...).

Page 21: Gerando bindings de bibliotecas C++ para Python

Direções & Perguntas

Código

http://github.com/PySide

www.pyside.org

Lista de discussão

http://lists.openbossa.org/listinfo/pyside

Canal #pyside no Freenode