thautwarm / diojit

Fully compatible CPython jit compiler. Optimising Dynamic, Interpreted, and Object-oriented(DIO) programs.
BSD 2-Clause "Simplified" License
118 stars 2 forks source link

for loop protocols for jit #14

Open thautwarm opened 3 years ago

thautwarm commented 3 years ago

Dynjit inherits the identical semantics from python bytecode, which is using GET_ITER and FOR_ITER to implement loops:

for i in xs:
   # do some

under dynjit, it is identical to

tmp = iter(xs)
while True:
   try:
      i = next(iter)
   except StopIteration:
      goto l:
   # do some
l:

The key point is, finding a protocol for, switching from pure Python code to optimized code when the types of iter and i got known.

Question: Should we follow the Python loop implementation, i.e., using __iter__? If so, exception check makes it impossible to make a positive enough performance gain. Even if __iter__ is jitted, exception check is still a disaster.

thautwarm commented 3 years ago

This have to been deferred until we implement bytecode -> untyped DIO IR transformation. I don't believe this is the most urgent. Efforts will be allocated for supporting JITing the most builtins and language features already allowed in DIO-JIT.