論文発表:JavaScript向けの構文マクロシステムの実装


甫水 佳奈子,脇田 建,佐々木 晃:解析表現文法とSchemeマクロ展開器を用いたJavaScript向けHygienic構文マクロシステムの実装,情報処理学会論文誌プログラミング(PRO)6(2), 85-101, 2013-08-29 発行.

論文抄録: 本稿は,JavaScriptの構文拡張を可能にするHygienic構文マクロシステムの実装技法を提案する.Hygienic構文マクロシステムは,マクロ展開の前後で変数の束縛や参照関係を破壊しない安全な構文マクロシステムである.このHygienic構文マクロシステムを利用することによって,プログラミング言語の構文の自由な拡張が可能になる.しかし,Hygienic構文マクロシステムは,S式という一貫した構文構造を持つSchemeには標準で組み込まれているものの,その他の一般的なプログラミング言語に実装された例はほとんどない.本稿では,まず,汎用的なプログラミング言語におけるHygienic構文マクロシステムの実装の難しさを示し,次に,本研究が提案するJavaScript向けHygienic構文マクロシステムの実装技法について述べる.提案する実装技法では,マクロ構文の追加によって拡張されるJavaScript構文を解析するための拡張可能なパーザの実現に解析表現文法を用い,マクロ展開は既存のSchemeマクロ展開器に委ねる.マクロ展開においては,マクロを含むJavaScriptコードをそれと等価なS式へと変換し,Schemeマクロ展開器で展開を行った後に,JavaScriptコードに逆変換するという言語間相互変換を行う.これらの工夫によりわずか2,000行弱のコンパクトな実装によってJavaScriptに対する記述力が高いHygienic構文マクロシステムを実現できた.

C言語,M4,TeX などのマクロシステムに親しんでいる方は多いと思うのですが,Schemeに採用されたHygienic構文マクロはそれらのマクロシステムの嫌らしさに対する反省から設計された異次元のマクロシステムと言っていいです.例えていうならば,アセンブリプログラミングと構造化プログラミングの違い(Fortran 66 に代表される非構造的高級言語の時代が抜けていることに注目)と言っていいかもしれません.

ただ,残念なことにSchemeに採用されたこの高級マクロシステムは他のプログラミング言語にほとんど採用されていません.この論文は,Scheme以外の言語に採用しにくかった技術的な困難を明らかにするとともに,その問題点を解決するためのちょっと突飛なアイデアを提案しています.

半年ほど前に奄美大島で開催されたプログラミング研究会で発表し,論文誌にも投稿していた論文が晴れて再録されました.情報学広場から閲覧・購入可能です.個人的に会う機会のある方には,おっしゃていただければ別刷りを差し上げますので,お気軽にご連絡下さい.

この研究は,JSPS科研費23500034(汎言語的メタプログラミング基盤としての健全な構文マクロ機構の研究,脇田建代表)および23700043(逐次的拡張に基づくドメイン特化型言語の実現手法の研究)の助成を受けたものです.