Math::Symbolic::Custom::CCompiler - Compile Math::Symbolic trees to C
use Math::Symbolic qw/:all/;
my $function = parse_from_string(... some expression ...);
# ... calculations ... see Math::Symbolic manpage
my $c_code = $function->to_c();
# $c_code now contains C code that does the same as the original
my $anon_subroutine = $function->to_compiled_c();
# Generates and compiles C code. Uses Inline::C to dynamically
# link the results. Returns an anonymous Perl subroutine that
# does the same as the original function.
# But in compiled C. (Ca. 1000x faster than the tree-walking
# involved with the value() method.)
This module extends the functionality of Math::Symbolic by offering facilities
to compile symbolic math trees (formulas) to C code. It also uses Inline::C to
compile and link the generated C code at run-time, thus allowing the user to
do symbolic calculations in Perl with Math::Symbolic and then use the results
in a fast numeric environment.
This software generates code. Code generators are difficult to test, but the
first release of the module is now 1.5 years old and I haven't received any
bug reports, so I consider it somewhat stable now.
Please read the manpage of Math::Symbolic::Compiler which comes with the
Math::Symbolic distribution. Most of the gotchas involved with compiling the
functions to Perl subroutines also apply to this module which compiles to C
Alternatively, you can use the module not for faster calculations from your Perl
program, but to generate C code for you. I have used it to generate an
implementation for (many!) Zernike Polynomials for work in C.
The module adds two methods to all Math::Symbolic objects. These are:
This method returns the C code generated from the function. Please note that the
code is extremely difficult to read for humans because variable and function
names have been generated to not clash with any reserved words. Feel free to
do search/replace on the results of you are bothered.
This code is not intended to be read by humans, but to be understood by C
The method takes one optional argument: An array reference. The referenced array
is to contain some or all of the identifier names that where in the original
mathematical formula. You can use the ' signature()
' method on a
Math::Symbolic object to get at the identifiers (variable names) that were
used. The order of the identifier names indicates the order in which the C
function parameters are to be mapped to the identifiers. Omitted identifiers
are appended to the list in alphabetic order. If no such array reference is
passed, the arguments are assumed to be in alphabetic order altogether.
Since this behaviour is equivalent to that of the compilation methods supplied
by Math::Symbolic::Compiler, it is suggested that you read the corresponding
manual for more detailed instructions.
This method generates the same code that ' to_c()
' generates and compiles
it using Inline::C and your local C compiler. The binary is then dynamically
linked to your instance of perl through some scary magic in Inline::C. Go
there and complain if you don't understand that because I, for sure, don't.
Inline::C also generates an Perl wrapper for the compiled C function. This is
then referenced and returned. (The original package sub is deleted to prevent
Please send feedback, bug reports, and support requests to one of the
contributors or the Math::Symbolic mailing list.
List of contributors:
Steffen M�ller, symbolic-module at steffen-mueller dot net
New versions of this module can be found on http://steffen-mueller.net or CPAN.
Copyright (C) 2003-2006, 2008, 2013 by Steffen M�ller
This library is free software; you can redistribute it and/or modify it under
the same terms as Perl itself, either Perl version 5.6 or, at your option, any
later version of Perl 5 you may have available.