Soms kunt u bij het programmeren van bewerkingen een situatie tegenkomen waarin een groep programmasegmenten meerdere keren in één programma voorkomt, of in meerdere programma's wordt gebruikt. We kunnen deze groep programmasegmenten eruit halen, ze een naam geven en ze afzonderlijk opslaan; deze groep programmasegmenten wordt een subroutine genoemd. Een subroutine is een bewerkingsprogrammasegment dat kan worden opgeroepen door geschikte besturingsinstructies voor werktuigmachines, en heeft over het algemeen een onafhankelijke betekenis tijdens de bewerking. Het bewerkingsprogramma dat de instructie bevat om de subroutine van het eerste-niveau op te roepen, wordt het hoofdprogramma genoemd. De instructie om een subroutine aan te roepen is ook een programmasegment, dat doorgaans bestaat uit de subroutine-oproepinstructie, de naam van de subroutine en het aantal oproepen. De specifieke regels en formaten variëren afhankelijk van het systeem. Voor dezelfde instructie "bel één keer subroutine nummer 55" gebruikt het FANUC-systeem bijvoorbeeld "M98 P55.", terwijl het Amerikaanse AB-systeem "P55x" gebruikt.
Subroutines kunnen worden genest, dat wil zeggen, het ene niveau in het andere. De relatie tussen het bovenste en onderste niveau is dezelfde als de relatie tussen het hoofdprogramma en de subroutine van het eerste-niveau. Het maximale aantal geneste niveaus wordt bepaald door het specifieke CNC-systeem. De vorm en samenstelling van een subroutine zijn grotendeels dezelfde als die van het hoofdprogramma: de eerste regel is het subroutinenummer (naam), en de laatste regel is de "subroutine end" -instructie, met de subroutine ertussen. De eindinstructie van het hoofdprogramma beëindigt echter het hoofdprogramma en reset het CNC-systeem; de instructies zijn gestandaardiseerd, waarbij elk systeem M02 of M30 gebruikt. De subroutine-eindinstructie beëindigt daarentegen de subroutine en keert terug naar het hoofdprogramma of de vorige subroutine. De instructies variëren per systeem; FANUC-systemen gebruiken bijvoorbeeld M99, Siemens-systemen gebruiken M17 en AB-systemen (Amerikaanse A/B) gebruiken M02.

