- Any operation may take operands (parameters, arguments). Example: function foo($arg1, $arg2, $arg3)
- Any operands may have attributes. Example: f(long int $arg1, fancy blue dishwasher $arg2)
- The reader (compiler or interpreter) takes operation + operands and produces instructions that will have the desired effect. This can be done at runtime or at compile time.
Operations, operands, and attributes might be seen respectively as Verbs, Nouns, and Adjectives.
The question of what instructions are to run depends upon the attributes
of the operands. For the simplest example, the code "2 + x" will produce
different instructions depending upon the attributes of x.
small int x = 42
return 2 + x // add ax, 2
long int x = 42
return 2 + x // add eax, 2
float x = 42.0
return 2 + x // fadd(42.0) ; adds to st0
At some point the system determines "x is an int, use integer add"
or "x is a float, use floating point add". The process of compilation
can be described as the resolution of high-level code to lower-level
implementation. This may involve translation through intermediary
languages.
An interpreted high-level language will make these determinations at
run time. A compiler may make the process more efficient by stripping out
all of these determinations at compile time. At the most extreme of efficiency
the reader may determine that the code will always produce the same
result (42+2 = 44) and insert the resulting value rather than the
code to produce it.
Optimization vs. reuse
A downside of such optimizations is that it becomes
impossible to modify the behavior of a program at runtime if the
behavior-determining code is optimized out. Correspondingly, an
advantage to keeping code unoptimized is that the program may be
modified by a wrapper that changes the resolution of a function call.
A system could provide the best of both worlds by using an object format
that stores both the optimized version and a high-level interpretation, and
recompiling on the fly when directed to change part of the program. To allow
the recompilation of one subroutine at a time, instead of rebuilding the
whole program, the metadata may include a catalogue of entry points.