=head1 NAME
C::Blocks - embeding a fast C compiler directly into your Perl parser
=for html
=head1 STATUS
Pre-Beta
=over
=item Better representation on CPAN Testers
Very few machines report this module as working on CPAN testers,
including nothing for a number of key platforms. This seems to crop up
on 64-bit operating systems in particular. Before clicking over to v0.5,
I want this to have passes on all major platforms.
=back
This project is currently pre-Beta. That means that I have nearly
managed to get it working on at least one Linux, Mac, and Windows
machine, and I have implemented the functionality and tests I had hoped
to implement in the Alpha stage. The present goal is to find and fix all
the ways that C::Blocks can break, i.e. expand
the test suite and get it to run it on as many platforms as
possible. Not only can you expect some segmentation faults on at least a
few operating system, but you can expect the current compiler setup API
to change once the distribution has reached a greater level of
stability. (The API will be ironed out during Beta.)
=head1 DESCRIPTION
This distribution contains C, a module that adds a few
lexically scoped keywords to your Perl parser. These keywords delimit C
code blocks, and (in the current implementation) the code within them
is compiled during Perl's bytecode compilation phase. The keywords
including C, C, C, and C. The keyword
C provides a simple typemap-like system.
In addition, this distribution contains C, which
loads Perl's C API. I may eventually include similar modules for all
standard C libraries, such as libstdio, libmath, etc. Since libperl is
itself compiled with these libraries, I suspect that most of them will
be redundant for most people.
It can be difficult to safely attach C structs to Perl variables. This
problem was solved for XS authors with the module L.
This distribution provides a port of that module called
C.
This distribution presently includes C, which
provides a rudimentary vector type. It serves an important role as a
testing module. It will almost certainly be spun off into its own module
by the time C v1.0 is released, so you should not rely on its
presence in the base distribution.
=head1 BUILD NOTES
On Debian systems using system Perl (C or otherwise), the
bad-symbol auto-detection runs much, much faster if you have
C installed. This is strongly recommended, if possible. If
you use Perlbrew, it will not matter because your local Perl will have
libperl available.
=head1 GOALS AND MILESTONES
I have a number of goals I would like to accomplish for this project.
The basic set of milestones are (1) make it work, (2) test the heck out
of it, (3) settle on an API, and (4) decide whether to throw in the
kitchen sink.
=head2 Pre-Alpha
The goal during the pre-alpha stage is to get things mostly working on
most platforms. Once this is accomplished, I will spin an Alpha release
on CPAN. I declared victory on this stage when I got libperl caching
working on all platforms, even though StretchyBuffer still gave trouble
on Windows.
=head2 Alpha CPAN Release, v0.01 - 0.49
The goal during the alpha stage is to vastly expand the test suite to
make sure that everything works properly. For the most part, this means
writing lots of tests of Perl's own C API. Additional tests for things
like scoping and memory duration could stand to be expanded as well.
Once I feel the test suite is robust, I move on to v0.5, beta.
The API for tweaking the compiler will still be considered in flux, so
substantial library development is discouraged during Alpha.
Also, I currently get a lot of warnings saying
warning: assignment from incompatible pointer type
This is a bug with the underlying extended symbol table handling and
struct type checking. I would like this to be fixed sooner rather than
later.
=head2 Beta CPAN Release, v0.50 - v0.99
After the distribution hits v0.50, it'll be time to begin settling on
an API to set up the compiler. The current API uses global variables,
but this almost certainly can be done better.
With the settling of the API, I also hope to make it easier to write
libraries that are export wrappers. The simplest example would be
something that, for the moment, I am calling C. This
module would make it easy to import a bunch of C::Blocks modules in
one shot, i.e.
use C::Blocks::lib qw(perl gsl prima);
would be equivalent to
use C::Blocks::libperl;
use C::Blocks::libgsl;
use C::Blocks::libprima;
Of course, I've not yet decided if I want to call all libraries
C, so this still needs some thought.
Another important thing that'll come either during Alpha or Beta is
switching to C and C. I used the keyword API
for prototyping because it was easy for me to get started, but the
newer API is the preferred method for this sort of stuff.
Finally, I want to create a module that helps automate the symbol table
load/dump functionality and symbol verification currently under
development for use with libperl. Once it's working for libperl, I want
to create author tools for L and L
so that build-time symbol table caching is easy.
=head2 v1.0
When C::Blocks hits v1.0, it'll have a solid test suite and stable API.
From v1.0 onward, it'll simply be a question of what to include in the
distribution itself.
=over
=item Simple C-based Object System?
I plan to write a module that makes it easy to write single-inheritance
object oriented C code. My current plans are to steal from Prima, which
does this sort of thing exceptionally well.
=item XS::Object::Magic
I like XS::Object::Magic, and I think I'd like to distribute a
C::Blocks module with that functionality within C::Blocks itself.
=item Generate Inline::C, XS, ExtUtils::Depends
Right now the C code gets compiled at Perl's parse time. Once the C
code is out of the prototyping stage, it would be nice to be able to
automatically extract it and generate .h and .c files that can be
compiled by the system's optimizing compiler. I need to write author
tools that would allow this to be done using Inline::C, or to generate
XS files with the proper scoping. Of course, it would also make sense
for the contents of those header files to be accessible to other XS
authors via ExtUtils::Depends.
=item Utilize ExtUtils::Depends
There is a lot of overlap between C and ExtUtils::Depends,
and undoubtedly users of C would like to have access to
functions and data structures that are made available through
ExtUtils::Depends. It would be nice to provide some sort of automatic
C::Blocks wrapper for ExtUtils::Depends based modules.
=item Threadsafe
The Tiny C Compiler uses lots of global variables and is therefore not
threadsafe. I would like to contribute back to the project by
encapsulating all of that global state into the compiler state object,
where it belongs. Others in the tcc community have expressed interest
in getting this done, so it is a welcome contribution.
=back
=head1 SEE ALSO
This module uses a special fork of the Tiny C Compiler. The fork is
located at L, and is distributed
through the Alien package provided by L. To learn more
about the Tiny C Compiler, see L and
L. The fork is a major
extension to the compiler that provides extended symbol table support.
For other ways of compiling C code in your Perl scripts, check out
L, L, L, and L.
For mechanisms for calling C code from Perl, see L and
L.
If you just want to mess with C struct data from Perl, see
L.
If you're just looking to write fast code with compact data structures,
L may be just the ticket. It produces highly
optmized code from a subset of the Perl language itself.
=head1 AUTHOR
David Mertens (dcmertens.perl@gmail.com)
=head1 BUGS
Please report any bugs or feature requests for the Alien bindings at
the project's main github page:
L.
=head1 SUPPORT
You can find documentation for this module with the perldoc command.
perldoc C::Blocks
You can also look for information at:
=over 4
=item * The Github issue tracker (report bugs here)
L
=item * AnnoCPAN: Annotated CPAN documentation
L
=item * CPAN Ratings
L
=item * Search CPAN
L
L
=back
=head1 ACKNOWLEDGEMENTS
This would not be possible without the amazing Tiny C Compiler or the
Perl pluggable keyword work. My thanks goes out to developers of both
of these amazing pieces of technology.
=head1 LICENSE AND COPYRIGHT
Code copyright 2013-2015 Dickinson College. Documentation copyright
2013-2015 David Mertens.
This program is free software; you can redistribute it and/or modify it
under the terms of either: the GNU General Public License as published
by the Free Software Foundation; or the Artistic License.
See http://dev.perl.org/licenses/ for more information.
=cut