Mercurial > hg > Papers > 2010 > jsst-shinya
view paper.tex @ 3:b00e4e5b5368
ver:2
author | Ryoma SHINYA <shinya@firefly.cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 14 Aug 2010 01:33:24 +0900 |
parents | 3bf6db862bc7 |
children | 22ad03d59b3f |
line wrap: on
line source
% Sample file for the use of compsoft style file. % \documentclass{compsoft} % \documentclass[L]{compsoft} % \documentclass[S]{compsoft} % \documentclass[S,L]{compsoft} % \documentclass[K]{compsoft} % \documentclass[K,L]{compsoft} % \documentclass[U]{compsoft} % \documentclass[U,L]{compsoft} % Preamble % % 「コンピュータソフトウェア」誌に掲載される論文の場合,次で % 巻数,号数,開始ページ,終了ページを指定する. \volNoPp{16}{5}{78}{83} % ワークショップによる推薦論文の場合,ワークショップ名を指定する. % \suisen{ワークショップ名} % 特集の場合,特集のタイトルを与える. % \tokushu{特集のタイトル} % 大会論文の場合,\taikai で開催年を指定する.ここで指定した年から % 大会の回数は計算される. % \taikai{2009} % ここに,使用するパッケージを列挙する. \usepackage[dvips]{graphics} % ユーザが定義したマクロなどはここに置く.ただし学会誌のスタイルの % 再定義は原則として避けること. \begin{document} % 論文のタイトル \title{実行時コンパイルを用いた正規表現評価器の実装} % 著者 % 和文論文の場合,姓と名の間には半角スペースを入れ, % 複数の著者の間は全角スペースで区切る % \author{新屋 良磨 % % ここにタイトル英訳 (英文の場合は和訳) を書く. % \ejtitle{Implimentation of Regular Expression Engine with Just-In-Time Compilation.} % % ここに著者英文表記 (英文の場合は和文表記) および % 所属 (和文および英文) を書く. % 複数著者の所属はまとめてよい. % \shozoku{Shinya Ryoma}{琉球大学工学部情報工学学科}% {Dept.\ of Information Engineering, Ryukyu University} % % 出典情報は \shutten とすれば出力される. \shutten % % 受付年月日,記事カテゴリなどは自動的に生成される. \uketsuke{1999}{8}{3} % % その他,脚注に入れるものがあれば,\note に記述する. %\note{脚注に入れる内容} } % % 和文アブストラクト % 和文アブストラクト \Jabstract{% 当研究室では, Concinuation based C という, 状態遷移記述に適した C の下位 言語を提案している.Continuous bsed C は ステートメントより大きく, 関数よりも小さなプログラ ミング単位としてコードセグメントを持ち, コードセグメントからの継続を基本としている. 本研究では, 与えられた正規表現から, 等価な 有限状態オートマトンに変換し, オートマトンにおける状態遷遷移を Continuous based C/Cによる継続/関数呼び出 しに変換する正規表現コンパイラを Python で実装した.} % \maketitle \section{はじめに} 近年, 実行時コンパイルによる高速化(Just-in-Time Compile)が様々 なプログラムで用いられている. これらは, コンパイラ理論の発展により 実行時コンパイルにかかるオーバーヘッドよりも, コンパイルによって得られる 機械語レベルのプログラムの実行速度が上回る場合において有効であり, たとえ ば Java の HotSpot や Python の PyPy など, 仮想マシンを持つ言語処理系の 最適化技術として利用されている. 実行時コンパイルが可能な対象として, 正規表現評価器に着目した. 現在,正規表現の評価器は, プログラミング言語の組み込み機能やライブラリ等, さまざまな実装が存在するが, それらの殆どは仮想マシン方式を採用している\cite{R2}. 仮想マシンを採用いた実装でも, 正規表現を内部表現に変換する処理を行ってお り, それらを ``コンパイル'' と呼ぶことが多い.本研究で実装した評価器の ``実行時コンパイル''とは, 正規表現を内部形式に変換することではなく, 正規 表現 から実行バイナリを生成することを指す(\ref{subsection:compile}節). 本研究では, 実行バイナリの生 成にはコンパイラ基盤であるLLVM, GCC を用いており,評価器全体の実装として はPythonで実装した. 本論文では, まず正規表現のコンパイル方法について説明し, 実装した評価器の 性能調査のために, 正規表現を用いてテキストマッチ処理を行う grep と同等の 機能を実装し, GNU grep との比較を行う. \section{正規表現} \subsection{正規表現によるテキストマッチ} 正規表現は与えられた文字列を受理するかどうかを判定できるパターンマッチン グの機構であり, sed, grep, awk を始めとするテキスト処理ツールに広く利用 されている. 正規表現には定められた文法によって記述され, 例えば,正規表現 ``$a*b$''は''$a$''の0回以上の繰り返し直後, ``$b$'' で終わる文字列(``$b$'' , ``$ab$'', ``$aaaab$'')を受理し, ``$a(b|c)$'' は ``$a$''で始まり,直後が ``$b$'' または ``$c$''で終わる文字列(``$ab$'', ``$ac$'') を受理する. \subsection{正規表現の演算}\label{subsection:regex} 本論文では, 以下に定義された演算をサポートする表現を正規表現として扱う. \begin{enumerate} \item {連接} 二つの言語$L$と$M$の連接($LM$)は, $L$に属する列を一つとり, そのあとに$M$に族する列を連 接することによってできる列全体から成る集合である. \item {集合和} 二つの言語$L$と$M$集合和($L|M$)は, $L$または$M$(もしくはその両方)に属する列全体からなる 集合である. \item {閉包} 言語$L$の閉包($L*$)とは, $L$の中から有限個の列を重複を許して取り出し, それらを連接してできる列全体の集合である. \end{enumerate} 正規表現は,この3つの演算について閉じておリ,この3つの演算によって定義され る表現は, 数学的には正則表現と定義されている. 本論文では,特に区別のない限り,正則表現と正規表現を同じものとして扱う. \subsection{grep} 正規表現は, テキストのパターンをシンプルに記述できるという利点から, テキ ストファイルから, 任意のパターンにマッチするテキストを検索するなどの用途 に使用される. GNU grep は, それを実現するソフトウェアの一つであり, 引数として与えられ たファイルから, 与えられた正規表現にマッチするテキストを含む行を出力する 機能を持っている. ``与えられた正規表現にマッチするテキストを含む''というのは, 行の先頭から 末尾まで正規表現によるマッチングを行い, 正規表現が受理状態になった時点で ``含む'' という解釈を行う.つまり, 正規表現 ''$(a|s)t$'' は, ''$at$''または'' $st$``を受理する正規表現であり, テキスト行''$math.$``の2~3文字目の''$at$''に一致す るので grep は ``$math.$'' を出力する. また正規表現''$a*$''は, ``$a$''の0回以上の繰 り返しを受理する正規表現であり, 空文字も受理するので, grep は全ての行を 出力することになる. \section{正規表現評価器の実装} 正規表現は等価なNFAに, またNFAは等価なDFAに変換することが可能である\cite{U}. 以 下にその変換手方を説明する. \subsection{正規表現からNFAへの変換} NFA({\it Non-deterministic finite-state machine}) は, 入力に対して複数の 遷移先持つ状態の集合であり, 遷移先が非決定的(Non-deterministic)である. 正規表現が, 等価なNFAに変換できるということを,\ref{subsection:regex}で定義 した3つの演算について対応するNFAに変換できることから示す. \begin{enumerate} \item {連接} 図\ref{figure:concat}は正規表現 ``AB'' に対応するNFAとなる. \item {集合和} 図\ref{figure:union}は正規表現 ``$A|B$''に対応するNFAとなる. \item {閉包} 図\ref{figure:star}は正規表現 ``A*''に対応するNFAとなる. \end{enumerate} \begin{figure}[tH] \begin{center} \scalebox{0.60}{\includegraphics{fig1.eps}} \end{center} \caption{``$A$''と``$B$''の連接} \label{figure:concat} \end{figure} \begin{figure}[tb] \begin{center} \scalebox{0.60}{\includegraphics{fig2.eps}} \end{center} \caption{``$A$''と``$B$''の集合和} \label{figure:union} \end{figure} \begin{figure}[tb] \begin{center} \scalebox{0.60}{\includegraphics{fig3.eps}} \end{center} \caption{``$A$''の閉包} \label{figure:star} \end{figure} 図\ref{figure:union}, \ref{figure:star}において, ラベルのない矢印は無条件 の遷移を現しており,$\varepsilon$-動作と呼ばれる. また, 二重丸で囲まれた 状態は受理状態を現しておリ, NFAにおいて入力が終了した時点で,受理状態を保 持している場合に限り, その文字列を受理したことになる. なお, NFAは同時に 複数の遷移先をもつことがあるので, テキストのマッチング途中で複数の状態を 保持することがある. 現在実装されている正規表現評価器の多くは, 正規表現を内部的にNFAに変換し て評価を行っている\cite{R1}. NFAによる実装は, 後述する後方参照や最長一致 に対応しやすいが, 同時に遷移する可能性のある複数の状態を保持する必要があ るため, 正規表現の複雑度に多じてマッチングの時間が多くなってしまう場合が ある. 文献\cite{R1}では, ``$a?a?a?aaa$'' のような ``$a?^na^n$'' のように 表現(``$a?$''は''a``か空文字''``を認識する拡張された正規表現お一つ)の評 価において, NFAベースの正規表現評価器では遷移する状態の数が増えてしまう でマッチングにかかる処理時間が$n$の指数的に増加する問題をベンチマーク 結果と共に指摘している. 文献\cite{K} では正規表現からNFAベースのマッチン グ処理を行う IBM 7094 の機械語を生成する例が紹介されている. \subsection{NFAからDFAへの変換} 非決定的な遷移を行うNFAから, 決定的な遷移を行うDFA({\it Deterministic finite-state machine})に変換する手法を説明する. なお, 遷移が決定的である ということは, 1つの入力に対して, 遷移する状態がただ1つであるということを 指す. NFAからDFAの変換には, 部分集合構成法(\it{subset construction})と呼ばれる 方法を利用する. 部分集合構成法では, NFAの ``同時に遷移する可能性のある状 態の集合''をDFAにおける ``状態''として扱う. !NFA, DFA の説明をもっと形式的に行います....! \subsection{DFAから実行バイナリの生成}\label{subsection:compile} DFAからの実行バイナリ生成には, 3種類の実装を行った. \begin{enumerate} \item ({\bf DFA -> Continuous based C -> gccによるコンパイル}) \item ({\bf DFA -> C -> gccによるコンパイル }) \item ({\bf DFA -> LLVM 中間表現 -> LLVMによるコンパイル}) \end{enumerate} % \section{評価} \begin{adjustvboxheight} % needed only when Appendix follows \begin{thebibliography}{99} \bibitem{U} Hopcroft, J, E. Motowani, R. D, Ullman. : オートマトン言 語理論計算論I (第二版), pp.~39--90. \bibitem{K} Thompson, K : Regular Expression Search Algorithm, 1968 \bibitem{R1} Cox, R : Regular Expression Matching Can Be Simple And Fast, 2007 \bibitem{R2} Cox, R : Regular Expression Matching: the Virtual Machine Approach, 2009 \bibitem{R3} Cox, R : Regular Expression Matching in the Wild, 2010 \bibitem{H} 長谷川 勇 : 国際正規表現ライブラリの開発 \end{thebibliography} \end{adjustvboxheight} % needed only when Appendix follows \end{document}