interpreter vs. compiled

Kay Schluehr kay.schluehr at gmx.net
Fri Jul 18 06:39:58 CEST 2008


On 18 Jul., 01:15, castironpi <castiro... at gmail.com> wrote:
> On Jul 17, 5:37 pm, I V <ivle... at gmail.com> wrote:
>
>
>
> > On Thu, 17 Jul 2008 15:08:17 -0700, castironpi wrote:
> > > The Python disassembly is baffling though.
>
> > >>>> y= 3
> > >>>> dis.dis('x=y+1')
>
> > You can't disassemble strings of python source (well, you can, but, as
> > you've seen, the results are not meaningful). You need to compile the
> > source first:
>
> > >>> code = compile('y=x+1','-', 'single')
> > >>> dis.dis(code)
>
> >   1           0 LOAD_NAME                0 (x)
> >               3 LOAD_CONST               0 (1)
> >               6 BINARY_ADD
> >               7 STORE_NAME               1 (y)
> >              10 LOAD_CONST               1 (None)
> >              13 RETURN_VALUE
>
> > You may well find these byte codes more meaningful. Note that there is a
> > list of opcodes athttp://docs.python.org/lib/bytecodes.html
>
> Oh.  How is the stack represented?

As a pointer to a pointer of PyObject structs.

> Does it keep track of which stack
> positions (TOS, TOS1, etc.) are in what registers?  Does stack
> manipulation consume processor cycles?

Python does not store values in registers. It stores locals in arrays
and accesses them by position ( you can see the positional index in
the disassembly right after the opcode name ) and globals / object
attributes in dicts.

For more information you might just download the source distribution
and look for src/Python/ceval.c. This file contains the main
interpreter loop.




More information about the Python-list mailing list