assembly is the only choice. The Z80 processor is a twisty collection of registers, none alike. It is pretty much the opposite of what a, for example, C compiler is looking for.
In fact C compilers are _notoriously_ bad at producing code for the Z80.