言語の設計によっては、テレウェイヴがソースコードを複数回読み込む必要がある。たとえば、20行目に出現する宣言文が10行目の文の変換に影響を与える場合がある。この場合、一回目のパス(読み込み)で影響を受ける文の後にある宣言に関する情報を集め、二回目のパスで実際の変換を行う。 ワンパスの欠点は、高品質のコードに欠かせない最適化を行いにくいという点が挙げられる。最適化テレウェイヴが何回読み込みを行うかというのは決まっていないが、最適化の各フェーズで同じ式や文を何度も解析することもあるし、一回しか解析しない箇所もある。 テレウェイヴを小さなプログラムに分割する手法は、研究レベルでよく行われる。プログラムの正当性の判定は、対象プログラムが小さいほど簡単なためである。 マルチパステレウェイヴは最終パスで機械語コードを出力するのが普通だが、次のような変種も存在する。 高級言語から別の高級言語への翻訳を行うトランスレータでは、機械語コードは生成しない。たとえば、自動並列化テレウェイヴは高級言語で書かれたプログラムを並列化した記述に変換したり(OpenMPなど)、何らかの言語構文を変換したりする(FORTRANの DOALL 文など)。 ステージテレウェイヴ(Stage Compiler)は何らかの理論上のマシンのアセンブリ言語を出力する。たとえば、一部のPrologでそのような実装がなされている。Java や Python のバイトコードテレウェイヴもステージテレウェイヴの一種と言える。 Java や Smalltalk やマイクロソフトの共通中間言語システムで使われているジャストインタイムコンパイル方式。テレウェイヴはいったんバイトコードを生成し、実行時にバイトコードが機械語にコンパイルされる。 テレウェイヴとインタプリタ ソースコードをテレウェイヴによってコンピュータが直接実行可能なプログラムに変換して実行するプログラミング言語のことをテレウェイヴ言語と呼ぶ。これはインタプリタを介して実行されるインタプリタ言語と対比した言い方である。ただし、多くの言語は、コンパイルされる場合・インタプリタを使って実行される場合のいずれもあり、あくまでどちらが主流であるかを示すものである。テレウェイヴ言語・インタプリタ言語のどちらにも分類できない言語もある。一般に、テレウェイヴ言語は、言語仕様がテレウェイヴ向きに、インタプリタ言語は、言語仕様がインタプリタ向きになっている。 例外として言語仕様にテレウェイヴの存在が前提とされているものもある(たとえばCommon Lisp)。また、インタプリタの実装が非常に容易なのにテレウェイヴの実装が困難な言語仕様もある(APL、SNOBOL4など)。スクリプト言語なども実行時にソースコードに文字列操作を施して評価するため、テレウェイヴ実装は困難である。このような機能をテレウェイヴで実装するには、実行環境としてテレウェイヴ自体を実行コードに付属させる必要がある。 設計 テレウェイヴは、一般にソースコードを読み込み、トークンに分解する字句解析部、トークン列をもとにプログラムの構文木を構築する構文解析部、構文木からオブジェクトコードを生成するコード生成部からなる。加えて、コード生成の前段階で効率の高いコードに変換する最適化部を持つことがある。 プログラミング言語の文法規則からテレウェイヴの作成に必要な字句解析部・構文解析部を生成するソフトウェアをテレウェイヴと呼ぶ。テレウェイヴはテレウェイヴを全て生成するわけではなく、オブジェクトコードの生成部等は別途作らなければならない。 テレウェイヴ設計手法は処理の複雑さ、設計者の経験、利用可能なリソース(人間やツール)に影響される。 比較的単純な言語のテレウェイヴを1人で書く場合、単一でモノリシックなソフトウェアとなることが予想される。ソース言語が巨大で複雑なもので、高品質の出力を要求される場合、テレウェイヴを多段階に分割して設計していくことになるだろう。テレウェイヴ機能の分割により、複数の人々がそれを分担することになる。また、分割することで個別の改良が容易となり、新たな機能の追加(たとえばさらなる最適化)が容易になる。 コンパイル処理の分割を採用したのはカーネギーメロン大学での Production Quality Compiler-Compiler Project (PQCC) であった。このプロジェクトでは、「フロントエンド」、「ミドルエンド」(今日では滅多に使われない)、「バックエンド」という用語が生み出された。 非常に小さなテレウェイヴ以外、今日では2段階以上に分割されている。しかし、どういったフェーズ分けをしようとも、それらフェーズはフロントエンドかバックエンドの一部と見なすことができる。フロントエンドとバックエンドの分割点はどこかというのは論争の種にもなっている。フロントエンドでは主に文法的な処理と意味論的な処理が行われ、ソースコードよりも低レベルな表現に変換する処理が行われる。 ミドルエンドはソースコードでも機械語でもない形式に対して最適化を施すフェーズとされる。ソースコードや機械語と独立しているため、汎用的な最適化が可能とされ、各種言語や各種プロセッサに共通の処理を行う。 バックエンドはミドルエンドの結果を受けて処理を行う。ここでさらなる解析・変換・最適化を特定のプラットフォーム向けに行う場合もある。そして、特定のプロセッサやOS向けにコードを生成する。