メモリオーダリング
多くの言語は文の境界をシーケンスポイントとして扱い、次のステートメントが実行される前に、ある文のすべての効果が完了するように強制する。これにより、コンパイラは表現されたステートメント順に対応するコードを生成することになる。しかし、ステートメントはしばしばより複雑で、内部の関数呼び出しを含むことがある。
マシンレベルでは、関数を呼び出すには、通常、関数呼び出しのためのスタックフレームを設定する必要があり、これにはマシンメモリへの多くの読み取りと書き込みが含まれる。ほとんどのコンパイル言語では、コンパイラは都合の良いように関数呼び出しf、g、hの順序を自由に決めることができ、その結果、プログラムのメモリ順序が大規模に変更される。純粋な関数型言語では、関数呼び出しが目に見えるプログラムの状態(戻り値以外)に副作用を与えることは禁じられており、関数呼び出しの順序によるマシンメモリの順序の違いは、プログラムのセマンティクスにとって取るに足らないものとなる。手続き型言語では、呼び出された関数は、I/O操作の実行や、プログラムのグローバルスコープ内の変数の更新などの副作用を持つ可能性があり、いずれもプログラムモデルに目に見える効果をもたらす。
このような効果を気にするプログラマは、元のソースプログラムをより厳密に表現することができる。
ステートメントの境界がシーケンスポイントとして定義されているプログラミング言語では、関数呼び出しf、g、hが正確な順序で実行されなければならない。