`constant` values are baked in at compile time and can never change; they must be simple literal expressions. `immutable` values are set exactly once, inside the constructor, and thereafter live in bytecode rather than storage — cheap to read forever after.
RATE: constant(uint256) = 5
TOKEN: immutable(address)
@deploy
def __init__(token: address):
TOKEN = tokenNeither costs an SLOAD to read, which makes both far cheaper than a regular storage variable for values that never (or rarely) change after deployment.