You cannot do any optimization when generating machine code that way. That's fine for a primitive compiler built for a school project, but not much else. (Even "no optimization" switch settings on a compile do a lot of optimizations, because otherwise the code quality is execrable.)
> That's fine for a primitive compiler built for a school project, but not much else.
Not true.
On the one hand, just see how many non-compiled languages are used outside of primitive school projects.
On the other hand, this simpler approach is actually faster for writing actually fqst compilers. Many modern compiled languages have compilers that work on the order of ~100ms on a simple file with 1k LoC, when it could (and arguably should) work on the order of ~1ms, IOW, imperceptible given the syscalls overhead.
A 100x faster compiler that generates meh code is more useful 99% of the time: when one is recompiling all the time during development.