just-in-time compiler
graph TD A[Source Code] --> B[Bytecode / IR] B --> C[Interpreter] C --> D{Hot Spot?} D -->|Yes| E[JIT Compiler] D -->|No| C E --> F[Native Machine Code] F --> G[Execution] C --> G
See also: thoughts/jit.py
toy example for branch optimization:
import numpy as np
import numpy.typing as npt
cache: list[npt.NDArray[np.float32]] = []
def dct_jit(x: npt.NDArray[np.float32]) -> npt.NDArray[np.float32]:
global cache
x_tuple = tuple(x)
if x_tuple in cache:
return cache[x_tuple]
N = len(x)
result = np.zeros(N)
for k in range(N):
sum_val = 0
for n in range(N):
sum_val += x[n] * np.cos(np.pi * k * (2 * n + 1) / (2 * N))
result[k] = sum_val
cache[x_tuple] = result
return result