コンピュータプログラミングにおいて、ワンパスコンパイラとは、各コンパイル単位を一度だけ処理し、各ソースステートメントまたは宣言を順次、最終的なマシンコードに近いものに変換するコンパイラのことです。これに対し、マルチパスコンパイラは、ソースコードとマシンコードの間の段階を経てプログラムを1つ以上の中間表現に変換し、各パスでコンパイル単位全体を再処理します。
ワンパスコンパイラは、最初は前方ジャンプのアドレスを未解決のままにしておく必要があります。これらは、別の完全なパスを実行する必要なく、さまざまな方法(例えば、前方ジャンプとターゲットのテーブル)で処理できます。一部の名目上ワンパスコンパイラは、アセンブリ言語を生成し、アセンブラに前方参照の整理を任せることで、実質的に「責任転嫁」を行っていますが、これにはアセンブラでの1回以上のパスが必要です。
ワンパスコンパイラはマルチパスコンパイラよりも小さく、高速です。[ 1 ]
1パスコンパイラは、利用可能な情報の範囲が限られているため、マルチパスコンパイラほど効率的なプログラムを生成できません。多くの効果的なコンパイラ最適化では、基本ブロック、ループ(特にネストされたループ)、サブルーチン、またはモジュール全体に対して複数回のパスが必要です。中には、プログラム全体に対してパスが必要なものもあります。
ワンパスコンパイルを目的としたプログラミング言語の基本要件は、ラベルを除くすべてのユーザー定義識別子を、使用前に宣言する必要があるということです。
一部のコンピュータハードウェア(例:x86)では、分岐命令に短分岐と長分岐があります。分岐先が約127バイト以内であれば短分岐、そうでなければ長分岐となります。1パスコンパイラはすべてのジャンプが長分岐であると仮定する必要がありますが、マルチパスコンパイラはジャンプ距離をチェックし、より短いコードを生成できる可能性があります。
文の識別に予約語やストロップ語ではなく文脈に依存する言語も問題を引き起こす可能性があります。以下の例はFortran 77からのものです。
IF (B) l1,l2 ! 双方向分岐、ここで B はブール/論理式です IF (N) l1,l2,l3 ! 3分岐、ここでNは数値式 IF (B) THEN ! 条件ブロック開始 IF (B) THEN = 3.1 ! 変数への条件付き代入 THEN IF (B) X = 10 ! 単一の条件文 IF (B) GOTO l4 ! 条件付きジャンプ IF (N) = 2 ! IF という名前の添え字付き変数への代入 DO 12 I = 1,15 ! カウント制御ループの開始 DO 12 I = 1.15 ! 変数に値 1.15 を代入します。DO12Iどのような種類の文であるかを判断するために、文全体をスキャンする必要があります。そうして初めて翻訳が可能になります。したがって、曖昧な可能性のある文は、少なくとも2回処理する必要があります。