Parfois, lors de la programmation de l'usinage, vous pouvez rencontrer une situation dans laquelle un groupe de segments de programme apparaît plusieurs fois dans un seul programme ou est utilisé dans plusieurs programmes. Nous pouvons extraire ce groupe de segments de programme, les nommer et les stocker séparément ; ce groupe de segments de programme est appelé un sous-programme. Un sous-programme est un segment de programme d'usinage qui peut être appelé par des instructions de commande de machine-outil appropriées, et il a généralement une signification indépendante pendant l'usinage. Le programme d'usinage contenant l'instruction pour appeler le sous-programme de premier-niveau est appelé programme principal. L'instruction d'appel d'un sous-programme est également un segment de programme, qui comprend généralement l'instruction d'appel du sous-programme, le nom du sous-programme et le nombre d'appels. Les règles et formats spécifiques varient selon le système. Par exemple, pour la même instruction « appeler une fois le sous-programme numéro 55 », le système FANUC utilise « M98 P55. », tandis que le système américain AB utilise « P55x ».
Les sous-programmes peuvent être imbriqués, c'est-à-dire un niveau dans un autre. La relation entre les niveaux supérieur et inférieur est la même que la relation entre le programme principal et le sous-programme de premier-niveau. Le nombre maximum de niveaux imbriqués est déterminé par le système CNC spécifique. La forme et la composition d'un sous-programme sont en grande partie les mêmes que celles du programme principal : la première ligne est le numéro du sous-programme (nom) et la dernière ligne est l'instruction "fin du sous-programme", avec le corps du sous-programme entre les deux. Cependant, l'instruction de fin de programme principal termine le programme principal et réinitialise le système CNC ; ses instructions sont standardisées, chaque système utilisant M02 ou M30. L'instruction de fin de sous-programme, quant à elle, termine le sous-programme et revient au programme principal ou au sous-programme précédent. Ses instructions varient selon les systèmes ; par exemple, les systèmes FANUC utilisent M99, les systèmes Siemens utilisent M17 et les systèmes AB (American A/B) utilisent M02.

