For point of comparison, my branch now has a Cython and C++ version of
the same thing.
Here's the Cython version:
https://github.com/mdboom/matplotlib/blob/no_cxx/src/_png.pyx
Here's the C++ version:
https://github.com/mdboom/matplotlib/blob/no_cxx/src/_png_wrap.cpp
Some interesting things to note:
The Cython version isn't that much shorter than the C++ version. It
mostly consists of declarations. These declarations aren't exact
matches to what one would find in the header file(s) because Cython
doesn't support exact-width data types etc. The Cython documentation
says "not to worry", but I do wonder how well this will work across
different architectures etc. I'm not sure why some of the Python/C API
calls I needed were not defined in Cython's include wrappers.
The Cython extension only builds with "-fpermissive" because I can't
seem to get the casts and const coercions to work. Maybe there's a
simple solution...
The exception handling in the png_core.cpp file will need to be updated
because Cython only supports handling built-in C++ exceptions (and
subclasses), and the Cython custom exception handler doesn't provide a
way to get at the exception object that was thrown.
It seems that a lot of things pass through the Cython compiler, but then
fail in the C compiler -- you then have to wade through the generated C
code to figure out what's going wrong. This reminds me of the bad old
days of C++ when the error messages generated would be dozens of lines
long and rather inscrutable.
Once things compiled, due to my own mistake, calling the function
segfaulted. Debugging that segfault in gdb required, again, wading
through the generated code. Using gdb on hand-written code is *much* nicer.
So, it's probably clear that I'm not much of a fan of this approach, but
I am trying to find something that the whole community around matplotlib
finds easier and more accessible so that the C/C++ experts among use are
not exclusively burdened to maintain this part of the code base. I
would be interested to see what others think now that we have an
apples-to-apples comparison.
Cheers,
Mike
On 12/01/2012 01:36 PM, Michael Droettboom wrote:
For the PNG extension specifically, it was creating callbacks that can
be called from C and the setjmp magic that libpng requires. I think
it's possible to do it, but I was surprised at how non-obvious those
pieces of Cython were. I was really hoping by creating this experiment
that a Cython expert would step up and show the way ;)
The Agg backend has more C++-specific challenges, particularly
instantiating very complex template expressions -- but I haven't really
followed that on through.
Mike
On 11/30/2012 09:13 AM, Jason Grout wrote:
On 11/29/12 10:59 AM, Michael Droettboom wrote:
I've not had
much luck with Cython for this kind of thing in the past, but I know it
is popular.
I'm curious about what problems you've run into and how long it was. In
the past, Cython hasn't supported C++ very well, but the situation has
greatly improved recently. See
http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html for some
details.
Thanks,
Jason
------------------------------------------------------------------------------
Keep yourself connected to Go Parallel:
TUNE You got it built. Now make it sing. Tune shows you how.
http://goparallel.sourceforge.net
_______________________________________________
Matplotlib-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-devel
------------------------------------------------------------------------------
Keep yourself connected to Go Parallel:
INSIGHTS What's next for parallel hardware, programming and related areas?
Interviews and blogs by thought leaders keep you ahead of the curve.
http://goparallel.sourceforge.net
_______________________________________________
Matplotlib-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-devel
------------------------------------------------------------------------------
Keep yourself connected to Go Parallel:
INSIGHTS What's next for parallel hardware, programming and related areas?
Interviews and blogs by thought leaders keep you ahead of the curve.
http://goparallel.sourceforge.net
_______________________________________________
Matplotlib-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-devel