PLエンジン(PL Engine)とSQLエンジン(SQL Engine)は相互に連携して動作します。SQLは直接PLエンジンにアクセスでき、例えばSQL文ではユーザー定義関数を使用できます。また、PLはSPIインターフェースを通じてSQLエンジンにアクセスし、式の計算やSQL文の実行を行うことができます。
両者の相互作用は以下の図に示されています:

PL Engineは、Parser、Resolver、Code Generator、Compiler、Executor、PL Cacheの6つのモジュールで構成されており、そのうちParser、Resolver、Code Generator、Compilerが完全なPLコンパイルプロセスを形成します。以下の図を参照してください:

Parser(構文解析器)
ParserはPL構文を解析し、構文ツリー(Parse Tree)を生成するために使用されます。PLエンジンとSQLエンジンはそれぞれ独立したParserを実装していますが、両者のParserは冗長な処理を行わないように設計されています。OBServer内では、クエリ文字列はまずPL Parserに入力されて解析され、SQL文であることが判明した場合はSQLエンジンに引き継がれて解析されます。
Resolver(意味解析器)
Resolverは意味解析を行い、変数のスコープや静的SQLにおけるデータオブジェクトのスキーマなどをチェックし、各PL文に対応する抽象構文木(AST)構造およびグローバルなAST構造を生成します。ASTには、PLで定義された基本情報や生成されたグローバルシンボルテーブル、グローバルラベルテーブル、グローバル例外テーブルなどの情報が格納されています。各文のASTには、これらのグローバルテーブルへのロジック情報が記録されています。
Code Generator(コードジェネレータ)
Code GeneratorはLLVMが提供するインターフェースを使用してASTをさらに翻訳し、ASTツリーを中間表現(IR)コードに変換します。IRコードは、翻訳プロセスが正確であるかどうかを確認するために使用されます。
Compiler(コンパイラ)
Compilerは、即時コンパイル(JIT)を通じてIRコードをマシンコードに変換し、実行可能なPLオブジェクトとして出力します。
Executor(実行エンジン)
Executorは、コンパイルされたPL実行可能オブジェクトと入力パラメータに基づいて実行環境を構築し、関数ポインタを呼び出して関数の結果を取得します。
PL Cache(実行計画キャッシュモジュール)
PL CacheはPL Engineの内部メカニズムであり、PL Engineは外部に対してIDによるProcedureまたはFunctionの実行インターフェースを統一的に提供します。外部からはPLのキャッシュメカニズムを意識する必要はなく、PL Engineを通じてPLを実行するだけで済みます。PL Cacheはハッシュテーブルであり、Key(ProcedureまたはFunctionのID)によってValue(PL実行オブジェクト)を検索し、Schemaへのアクセスを通じてPL実行可能オブジェクトの有効性をチェックします。無効な場合は直ちに削除されます。PL Cacheは、毎回PLを再コンパイルすることを回避し、PLの実行効率を向上させるために使用されます。そのため、匿名ブロック(Anonymous Block)にはキャッシュを使用する必要はありません。
PL Engineは外部にExecuteインターフェースを提供しており、そのパラメータにはPL ID、実行パラメータparams、実行環境Context、および実行結果Result(Functionにのみ有効)が含まれます。まず、IDに基づいてPL Cache内にコンパイル済みのPL実行可能オブジェクトが存在するかどうかを検索します。存在する場合は、さらにVersionが利用可能かどうかを確認します。PL Cache内に利用可能なPL実行可能オブジェクトがない場合は、コンパイルプロセスを呼び出してコンパイルを行い、コンパイル後の結果をPL CacheにキャッシュしてからExecutorに渡して実行します。コンパイルの結果はバイナリコードのメモリアドレスであり、Executorはこのメモリアドレスを関数ポインタに変換し、実行パラメータと実行環境を渡して結果を得ます。