Why Python is not both an interpreter and a compiler?

Cameron Simpson cs at zip.com.au
Mon Aug 31 05:59:54 EDT 2015


On 31Aug2015 01:35, Mahan Marwat <mahanmarwat at gmail.com> wrote:
>What I know about an interpreter and a compiler is: they both convert source code to machine code and the only difference is, an interpreter convert it, line by line while compiler convert the whole source file.

This is simplistic and misleading.

Compilation is the process of taking a program and converting it into an 
efficient binary form, attaching whatever else is needed (such a references to 
required libraries). Languages like C are usually compiled to machine code, and 
executed directly by hardware. Languages like Python are usually compiled to 
"byte code", effectively a machine code for a logical machine.

When hardware acts on machine code it is said to execute it. When a piece of 
software acts on byte code, it is said to "interpret" it. The main difference 
is the notional level of execution, and the corresponding level of abstraction 
in the machine code: machine code for a hardware CPU is normally very direct 
and contains instructions directly related to the hardware facilities exposed 
by the CPU (registers, memory, etc). Conversely, byte code (machine code for a 
more abstract interpreter) is more abstract: the basic elements will be higher 
level entities like strings or integers , and memory will be described by more 
abstract items like slots in call frames or names to look up in symbol tables.

>Now if we compile a C source file on C compiler, it will produce a small executable file. But if we compile (freeze) a Python source file on Python interpreter (using cx_freeze), it will produce a big executable file.

If you compile a C program with "static" linking you will get a much large 
program. Modern machines support dynamic library linking, where the needed 
libraries are attached to the executing program on the fly, largely when the 
program is started. That relies on the libraries being available in the 
filesystem when the program is invoked. By contrast a "staticly" linked program 
will get copies of the libraries installed into the executable when compiled.

>Now the thing is C compiler does not embed a C compiler inside our program, while the Python interpreter (cx_freeze, pytoexe) embed Python interpreter inside our program, what is the reason?

Chris Angelico has described why a Python interpreter is needed at runtime: 
Python can accept arbitrary Python code at runtime, so it needs to be able to 
compile it (to byte code) and interpret that byte code.

>The question is, why cx_freeze etc... embed Python interpreter inside our programs, they are unable to produce machine code like C compiler do?
>Cant we program a language, which is both interpreted and compiled? The core developer cant add the compiling functionality to Python?

You can go a long way there. There are alternatives to CPython which try to do 
this, such as Cython. A major obstacle to "complete" compilation is that Python 
is a dynamic language. Every variable may be bound to an object of any type at 
any time, so a lot of behaviour is dependent on the current binding, which may 
change.

Languages like C are staticly typed: their operations convert far more directly 
to machine operations (in fact, this is an explicit target of their design).  
Languages like Python aim for a more freindly and flexible programming syntax, 
and some of the price of that is more indirection between "byte code" and the 
underlying machine operations.

Cheers,
Cameron Simpson <cs at zip.com.au>

remember, information is not knowledge,
knowledge is not wisdom
wisdom is not truth
truth is not beauty
beauty is not love
love is not music
music is the best       - frank zappa



More information about the Python-list mailing list