CPC README
CPC is a programming language designed for writing concurrent systems.
The CPC programmer manipulates cooperatively scheduled threads; the CPC program is then processed by the CPC translator, which produces highly efficient event-loop code. In the author's opinion, this approach gives the best of the two worlds: the convenience of programming with threads, and the low memory usage of event-loop code.
The semantics of CPC is defined as a source-to-source translation from CPC into plain C using a technique known as conversion into Continuation Passing Style.
- autoconf
- gcc (or another C compiler, but this is untested)
- Ocaml >= 3.12
- (optional) Latex, to build the cpc manual (in doc directory)
To build cpc, you juste have to run from the root directory:
./configure (or FORCE_PERL_PREFIX=1 ./configure --prefix=...)
make
make test (optional, run full CIL test suite)
make testcpc (optional, run CPC test suite)
make install (optional, as root unless you used --prefix=... above)
This will build the main executable (bin/cpc.native, or bin/cpc.byte if your platform does not support native OCaml compilation). It also builds the cpc runtime (in runtime directory) and a bunch of samples (in samples directory).
At last, if you want to clean everything: make uninstall make distclean
To compile a cpc program, use the wrapper in bin/cpc for .cpc files, just like you would use gcc for .c files. Since you need to link to the CPC runtime library, do not forget to use the following flags: -I cpc -lm -pthread -lcpc
For example:
bin/cpc -I include/cpc -lm -pthread -lcpc -o samples/loops samples/loops.cpc
If you want to inspect intermediate .c files generated by CPC, use --save-temps.
bin/cpc has the following useful options:
--stage n perform transformations up to stage n --pause step by step cps marking [*] --goto n choose the goto elimination method (0 <= n <= 2) 0 is the "safe" one (no optimisation), 1 is the "smart" one and 2 is the "too smart" one (trying to build smaller functions, thus ending with some unnecessary ones). 1 is the default and recommanded method. Other methods produce generally bigger and slower code. --tr cpc print (a lot of) debug messages --tr cpc_stats print some (raw) statistics --dumpcfg creates a cfg directory and dump the control flow graph of every cps function in it (in .dot files) --debug debug include debug printf in the generated code --out file output file --external-patch cpc_patch from cpc_runtime.h instead of inlining it. This is useful to remove some warnings if you use --check (which checks the correctness of the CIL AST after CPC transformations). This is now the default. Use --noexternal-patch to inline patching code. --packed build compact continuations. This saves some memory but yields unaligned memory accesses. It is broken on some architectures, and requires that every CPC code be compiled in packed mode (include the runtime, see cpc_runtime.h).
and a gazillion useless ones, inherited from CIL, that you might discover through bin/cpc --help. Using some of them might break cpc completely, so use at your own risk!
[*] In step by step mode, here is what you can do at each step:
d