Eine Aktion kann in eine zeitliche Folge von Teil-Aktionen zerfallen; dem entspricht in der Programmiersprache eine strukturierte Anweisung, die angibt, welche Teilanweisungen in welcher Folge auszuführen sind.
Diese (rekursive) Zerlegung sowohl der Aktionen wie auch der strukturierten Anweisungen kann mehrstufig sein; das ist das Grundprinzip der strukturierten Programmierung, wobei man sich auf eine feste Menge von Zerlegungsmustern (Kontrollstrukturen) für Anweisungen beschränkt.
Die rekursive Zerlegung endet bei Anweisungen, die nicht weiter zerlegt werden können oder sollen. Dies sind (in Modula 2 und in ähnlichen Sprachen):
In vielen Programmiersprachen (beispielsweise in C und FORTRAN) wird statt " := " für den Zuweisungsoperator " = " geschrieben; das bietet Gelegenheit zur Verwechslung mit dem Vergleichsoperator, der dann anders geschrieben werden muß (" == " bzw. " .EQ. ")! Beides hat übrigens mit dem Gleichheitszeichen in der Mathematik, das die Tatsache einer bestehenden Gleichheit ausdrückt, nichts zu tun!
Die Argumente sind meist Ausdrücke, deren Wert das betreffende Teilproblem auswählt, können aber auch Namen (Referenzen) von lokal sichtbaren Objekten sein, auf die der Baustein Zugriff haben soll. Das Nähere regelt der Kontrakt (in Modula 2: mittels einer Prozedur-Vereinbarung).
Eine Variante des Prozeduraufrufs ist der Makro-Aufruf. Er kann äußerlich genauso aussehen (meist ist das nicht so!), wird aber technisch anders behandelt: in einem Vorlauf der Übersetzung wird die Realisierung des "schwarzen Kastens" an der Aufrufstelle selbst (mit den nötigen Änderungen) textuell eingesetzt. Modula 2 bietet dies nicht an, wohl aber C und "Verwandtschaft".