Emacs lisp can be compiled into bytecode (*.elc files) for faster execution.
Native compilation takes bytecode and compiles (all while doing some smart things like type and value propagation) it into machine code utilising libgccjit.
By default the native compiler kicks in as soon as Emacs finds a bytecompiled file without a machine code equivalent. The resulting machine code is cached then for future use so this only happens once per a single *.elc file.
At least this is what i remember from the last time I checked the code :-)