The composition of the language is important, as it defines the tools which the program can use to solve the problem. If we give the language too diverse a set of operators, the evolver will take too long to converge on a solution. If we leave out crucial operators, the evolver will never solve the problem.
The environmental interaction operators are necessary to allow the program to affect the network. Flow control is necessary to allow a program of finite size to solve an arbitrarily sized network. Arithmetic and logic operators provide a way for programs to modify the raw input they read from the network, and produce meaningful output. We added two variables to the language because we could not create a solution manually without them.
Since several programs will be running simultaneously in the network, we needed some way to simulate parallel execution. This is done by evaluating one instruction from each program sequentially. After each program has run once, the state of the network is update to reflect the changes made during the run. To prevent endless loops, we place a maximum cap on the number of executed operators.