On 31Aug2015 01:35, Mahan Marwat <mahanmar...@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 <c...@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
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to