Many G-code dialects contain subprogram calls, loops, and conditionals that seem like they'd permit a physical quine. The standard RepRap firmware breaks the rules by taking input:
https://reprap.org/wiki/G-code#M98:_Call_Macro.2FSubprogram
but Fanuc and other dialects allow M97 to call a subroutine chained to the end of a program.
I work a lot with Aerotech's Aerobasic which is G code mixed with a basic like language. You can generate G code on the fly and execute it, manipulate files, call other programs, text boxes, menu boxes, etc.
I wrote a simple teach mode program that puts the machine into jog mode where you move the axes around and create points and associate a command for each, e.g. G0 rapid, G1 coordinated, G2 clockwise arc, G3 counterclockwise arc. Each move is then written to a file that is saved and loaded afterward for testing. Nice system but very costly.
G-code is like assembly language for CNC. It’s human readable, you can write it by hand if necessary, most machines will compile it internally to machine instructions, and there are a million different flavors with incompatible macros, etc. The flavor I’m most familiar with is Klipper’s interpreter, which will let you write macros, but that would technically be cheating since you could just stuff an entire program into a macro.
For anyone thinking of this, I promise to be suitably impressed (defined as "upvoting it when I see it on Hacker News") if anyone does manage to get a true G-code quine in this sense. Go for it.