メモリ安全な可変エイリアシングの提供を目指す実験的プロジェクトであるValenプログラミング言語は、関数を後ろから辿ることで動作するボローチェッカーを実装しています。ほとんどのコンパイラやボローチェッカー(RustやValeのものなど)は、リージョン推論や安全性を判断するために順方向パスを実行しますが、Valenのアーキテクチャは関数の最後の文から始まり、最初に向かって処理を行います。この逆転は、メモリ安全性の特定の技術的課題、特に変数の最後の使用点の特定や、ループベースの無効化に伴う複雑な問題に対処するために設計されています。

このメカニズムは、多段階のコンパイルプロセスに依存しています。ソースを抽象構文木(AST)に解析し、静的型付けを行った後、コンパイラは「静的グルーピング」を実行します。このフェーズでは、参照が変数やデータ構造のどの部分を指しているかを正確に特定し、実質的に「パス」情報を変数の型に埋め込みます。最終的な安全性チェックのフェーズでは、コンパイラは逆方向のスキャンを実行します。コンパイラは、関数内で後で使用される変数の「保留(pending)」リストを維持します。スキャン中に「USE」イベントに遭遇すると、その変数は保留リストに追加されます。「MUTATE」イベントに遭遇したとき、コンパイラは保留リスト内の変数がその変更によって無効化されないことを確認します。もし変更が保留中の変数に影響を与える場合、コンパイラはuse-after-freeエラーとしてフラグを立てます。これにより、コンパイラはどの変数が関数の最後まで有効である必要があるかを既に把握しているため、競合を即座に特定できるのです。

この逆方向アプローチの主な動機の一つは、ループの処理と、複雑な「取得とナビゲート」操作の回避です。順方向のスキャンでは、その使用がループ内にネストされている場合や、その後の代入によって変数が「復活」するかどうかを確認するために先読みが必要な場合、変数の最後の使用を特定することが困難になることがあります。逆方向のスキャンは、最も最近の使用を自然に最初に特定するため、変数がまだ有効であるかどうかを判断するために必要な帳簿管理を簡素化します。しかし、このアプローチにも、異なる証明目標のためにコードを複数回スキャンする際のパフォーマンス維持など、独自の課題が存在します。Rustのような言語で使用される制約解決モデルから脱却することで、ValenはRustのエコシステムとの互換性を維持しながら、メモリ安全性のルールを簡素化するより構文指向のアルゴリズムを追求しています。