How feasible would it be to compile Python (possibly via an intermediate C representation) into machine code?
Presumably it would need to link to a Python runtime library, and any parts of the Python standard library which were Python themselves would need to be compiled (and linked in) too.
Also, you would need to bundle the Python interpreter if you wanted to do dynamic evaluation of expressions, but perhaps a subset of Python that didn't allow this would still be useful.
Would it provide any speed and/or memory usage advantages? Presumably the startup time of the Python interpreter would be eliminated (although shared libraries would still need loading at startup).
Nuitka is a Python to C++ compiler that links against libpython. It appears to be a relatively new project. The author claims a speed improvement over CPython on the pystone benchmark.
Psyco is a kind of just-in-time (JIT) compiler: dynamic compiler for Python, runs code 2-100 times faster, but it needs much memory.
In short: it run your existing Python software much faster, with no change in your source but it doesn't compile to object code the same way a C compiler would.
This doesn't compile Python to machine code. But allows to create a shared library to call Python code.
If what you are looking for is an easy way to run Python code from C without relying on execp stuff. You could generate a shared library from python code wrapped with a few calls to Python embedding API. Well the application is a shared library, an .so that you can use in many other libraries/applications.
Here is a simple example which create a shared library, that you can link with a C program. The shared library executes Python code.
The python file that will be executed is
pythoncalledfromc.py
:You can try it with
python2 -c "import pythoncalledfromc; pythoncalledfromc.main('HELLO')
. It will output:The shared library will be defined by the following by
callpython.h
:The associated
callpython.c
is:You can compile it with the following command:
Create a file named
callpythonfromc.c
that contains the following:Compile it and run:
This is a very basic example. It can work, but depending on the library it might be still difficult to serialize C data structures to Python and from Python to C. Things can be automated somewhat...
Nuitka might be helpful.
Also there is numba but they both don't aim to do what you want exactly. Generating a C header from Python code is possible, but only if you specify the how to convert the Python types to C types or can infer that information. See python astroid for a Python ast analyzer.
The answer is "Yes, it is possible". You could take Python code and attempt to compile it into the equivalent C code using the CPython API. In fact, there used to be a Python2C project that did just that, but I haven't heard about it in many years (back in the Python 1.5 days is when I last saw it.)
You could attempt to translate the Python code into native C as much as possible, and fall back to the CPython API when you need actual Python features. I've been toying with that idea myself the last month or two. It is, however, an awful lot of work, and an enormous amount of Python features are very hard to translate into C: nested functions, generators, anything but simple classes with simple methods, anything involving modifying module globals from outside the module, etc, etc.
Try Python → 11l → C++ transpiler.
py2c ( http://code.google.com/p/py2c) can convert python code to c/c++ I am the solo developer of py2c.