Skip to main content
QUICK REVIEW

[論文レビュー] Multi-Level Languages are Generalized Arrows

Adam Megacz|arXiv (Cornell University)|Jul 16, 2010
Logic, programming, and type systems参考文献 62被引用数 6
ひとこと要約

本稿では、一般化された矢印を、Arrows と多段階言語の両方を一般化する圏的基盤として導入し、それらが同型な圏であることを証明する。これにより、ホスト言語とゲスト言語が部分集合・スーパーセット関係にない場合でも、異種メタプログラミングが可能になる。さらに、Coq で形式的に検証されたフレームワークを提供し、二段階の多段階プログラムを、ホスト言語における再統合写像を用いて、一段階の一般化された矢印項へと変換する。

ABSTRACT

Multi-level languages and Arrows both facilitate metaprogramming, the act of writing a program which generates a program. The arr function required of all Arrows turns arbitrary host language expressions into guest language expressions; because of this, Arrows may be used for metaprogramming only when the guest language is a superset of the host language. This restriction is also present in multi-level languages which offer unlimited cross-level persistence. This paper introduces generalized arrows and proves that they generalize Arrows in the following sense: every Arrow in a programming language arises from a generalized arrow with that language's term category as its codomain. Generalized arrows impose no containment relationship between the guest language and host language; they facilitate heterogeneous metaprogramming. The category having all generalized arrows as its morphisms and the category having all multi-level languages as its morphisms are isomorphic categories. This is proven formally in Coq, and the proof is offered as justification for the assertion that multi-level languages are generalized arrows. Combined with the existence of a particular kind of retraction in the host language, this proof can be used to define an invertible translation from two-level terms to one-level terms parameterized by a generalized arrow instance. This is ergonomically significant: it lets guest language providers write generalized arrow instances while the users of those guest languages write multi-level terms. This is beneficial because implementing a generalized arrow instance is easier than modifying a compiler, whereas writing two-level terms is easier than manipulating generalized arrow terms.

研究の動機と目的

  • 既存のメタプログラミングモデルにおける制限、すなわちホスト言語とゲスト言語が部分集合・スーパーセット関係にないといけないという制限に対処すること。
  • 一般化された矢印を、より広範な圏的枠組みとして導入することで、Arrows を従来の制約を超えて一般化すること。
  • 多段階言語と一般化された矢印の圏が同型であることを、圏論と Coq を用いて形式的に証明すること。
  • ゲスト言語の作成者が一般化された矢印インスタンスを実装できるようにすることで、ユーザーが多段階項を記述できる、実用的で使いやすいメタプログラミングを可能にすること。
  • Haskell を用いた概念実証実装を提供し、Coq で検証された証明から得たフラットターンパスを備えた変更済み GHC を使用すること。

提案手法

  • ホスト言語の項圏をコドメインとする圏における射として一般化された矢印を定義し、Arrow の arr 関数を一般化する。
  • 段階をラベル付けした項と、スタージングに用いる run 構文を持つ、多段階言語を圏として形式化する。
  • 圏論と Coq を用いて、一般化された矢印の圏と多段階言語の圏の間の同型を証明する。
  • ホスト言語(例:Haskell)における再統合写像を活用し、二段階の項から一段階の一般化された矢印項への逆写像が可能な翻訳を構築する。
  • Coq で抽出された証明を用いて、多段階プログラムを一般化された矢印コードに変換する新しいフラットターンパスを、変更済みの GHC コンパイラーに実装する。
  • 一般化された矢印インスタンスを用いて、コピー、ドロップ、適用といった多段階構文の意味論を型クラスメソッドでエンコードする。

実験結果

リサーチクエスチョン

  • RQ1Arrows を、ホスト言語のスーパーセットでないゲスト言語に対しても、異種メタプログラミングを可能にするように一般化できるか?
  • RQ2一般化された矢印の圏と多段階言語の圏の間に、圏的同型が存在するか?
  • RQ3ホスト言語に再統合写像が存在する場合、二段階のプログラムから一段階の一般化された矢印プログラムへの逆写像可能で使いやすい翻訳が可能か?
  • RQ4一般化された矢印の構造的特徴のうち、スタージング、run、リフレクションといった多段階言語構文に対応するものは何か?
  • RQ5Coq で得た形式的証明を抽出し、実際の言語(例:Haskell)向けのコンパイラー拡張にコンパイルするにはどうすればよいか?

主な発見

  • 一般化された矢印は、ゲスト言語がホスト言語のスーパーセットでなくてもよいという要件を排除することで、Arrows を一般化し、異種メタプログラミングを可能にする。
  • 一般化された矢印の圏と多段階言語の圏は同型であることが形式的に確立され、多段階言語が一般化された矢印の特別なケースであることが示された。
  • ホスト言語に再統合写像が存在する場合、二段階の多段階項から一段階の一般化された矢印項への逆写像可能な翻訳が可能であることが、変更済みの GHC を用いた Haskell で実証された。
  • 多段階言語と一般化された矢印の同型に関する Coq による検証済み証明は、正常に抽出され、GHC の新しいフラットターンパスにコンパイルされ、アプローチの実用性が裏付けられた。
  • 実装は、コピー、ドロップ、適用といった主要な構文を、一般化された矢印の型クラスを通じてサポートしており、フラットターンパスは再帰的および条件付きの項を正しく処理している。
  • 現在のフレームワークでは、型だけからどの一般化された矢印操作(例:GArrowCopy、GArrowDrop)が必要かを静的に特定できないため、コンパイラーにおける型追跡の強化が求められる。

より良い研究を、今すぐ始めましょう

論文の読解から最終レビューまで、研究時間を劇的に削減しましょう。

クレジットカード登録不要

このレビューはAIが作成し、人間の編集者が確認しました。