[Python-Dev] Re: Code Generation Idea Was: Bytecode idea
Jeff Epler
jepler@unpythonic.net
Thu, 27 Feb 2003 07:48:10 -0600
For my native-code translation system (which died an early death),
I intended to introduce a new attribute which would indicate what
(module) attributes could be considered constant. I think that for
whatever reason I decided to call this __solid__. So for instance, you
might write
import math
assert 'pi' in math.__solid__
__solid__ = ['sys', 'math', 'MYCONST', 'MyClass', 'myfun']
MYCONST = 22./7
class MyClass:
__solid__ = ['mymethod']
def mymethod(self): return MYCONST - math.pi
mymethod = staticmethod(jit(mymethod))
def myfun():
print MyClass.mymethod()
myfun = jit(myfun)
myfun()
This allows a whole range of optimizations. LOAD_GLOBAL optimizes to
LOAD_CONST. LOAD_CONST + LOAD_ATTR optimizes to LOAD_CONST. Then more
constant folding becomes possible.
In MyFun, the sequence
LOAD_GLOBAL MyClass
LOAD_ATTR mymethod
CALL_FUNCTION
can be reduced to
LOAD_CONST MyClass.mymethod
CALL_FUNCTION
which could even allow MyClass.mymethod to be inlined
In MyClass.mymethod, the arithmetic reduces from LOAD_GLOBAL,
LOAD_GLOBAL, LOAD_ATTR, BINARY_SUBTRACT to LOAD_CONST, LOAD_CONST,
BINARY_SUBTRACT with compiletime-known types which can be turned
into a single constant load.
In the most extreme case, the code (myfun + mymethod) could reduce to
the sequence LOAD_CONST, PRINT_ITEM, PRINT_NEWLINE, RETURN_NONE
avoiding all namespace lookups and function calls.
Jeff