[pypy-dev] PyPy to generate C/C++ code
Amaury Forgeot d'Arc
amauryfa at gmail.com
Wed Sep 15 01:11:28 CEST 2010
2010/9/15 Saravanan Shanmugham <sarvi at yahoo.com>:
> I don't expect this python compiler to be for full python but just a Restricted
> statically typed subset of python as defined by Shedskin.
>
> Yes. JIT annotation may not serve the purpose of generating a compiler.
> Hence the porting of the type inference engine and may be use JIT notations if
> it can be.
I've downloaded and read the source code of shedskin.
>From what I understand, here are some differences between PyPy and Shedksin.
- Shedskin analyses and generates code directly by walking the AST of a python
module. (there are two passes: the first to grab information about global types
and functions, the second to emit code)
- Shedskin does very little type inference. Shedskin's type system is based on
C++ templates, and once a variable's type has been determined, generic code is
emitted and the C++ compiler will select the correct implementation. Other
inference engines also work on the AST; Logilab's pylint, for example, works
much harder to check all instructions and the type of all variables. Shedskin
does not seem to need such power.
- On the other hand, PyPy analyzes imported modules, and works on the bytecode
of functions living in memory. It does a complete type inference and emits
low-level C code or Java intermediate representation.
- PyPy has its own way to write generic code and templates, the language for
meta-programming is Python itself! [I'm referring to loops that
generate classes and functions, and things like "specialize:argtype(0)",
"unrolling_iterable" combined with constant propagation].
In most cases, PyPy does not generate better code than Shedskin. When Shedskin
compiles code, it does it well. And its restrictions are easier to work with;
RPython is really tricky to get right sometimes.
Of course, PyPy goal is different: it does not only generate low-level C code,
it also generates a JIT compiler that can optimize calls at runtime - in the
context of an interpreter. I can't see which computations made there could be
applied to static code.
Bottom line: if you want to generate efficient C code from python, use (and
improve) Shedskin. If you want python code to run faster, don't translate
anything, and use the PyPy interpreter.
--
Amaury Forgeot d'Arc
More information about the Pypy-dev
mailing list