With a compiler I actually know pretty well what instructions will be generated by every high-level statement that I write, and when in doubt the compiler will list them for me to examine.
Coding with an LLM could be at most compared with some kind of non-deterministic and non-documented compiler, where you could not predict in any way how it will generate assembly code, so every time when you compile a program you have to also list the generated assembly code and then you must read carefully the assembly code and think hard to determine if it really does what you want.
Of course that does not mean that an LLM is useless for coding or that there are no tasks that can be vibe-coded without worries.
But for anything of long-term importance, like a product delivered to a customer, reviewing carefully a lot of LLM-generated code is not guaranteed to be a simpler task than writing that code yourself. In some cases it may be more productive to partition the new code into code generated by an LLM according to your instructions and code that you write yourself.