Mercurial > hg > Papers > 2010 > jsst-shinya
comparison paper.tex @ 13:c113bb7d6381
modify preamble. correct typo.
author | Ryoma SHINYA <shinya@firefly.cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 27 Aug 2010 22:06:23 +0900 |
parents | c2aaa766746a |
children | bd07b27b2b97 |
comparison
equal
deleted
inserted
replaced
12:c2aaa766746a | 13:c113bb7d6381 |
---|---|
1 % Sample file for the use of compsoft style file. | 1 % Sample file for the use of compsoft style file. |
2 % | 2 % |
3 \documentclass{compsoft} | 3 \documentclass[T]{compsoft} |
4 % \documentclass[L]{compsoft} | 4 % \documentclass[L]{compsoft} |
5 % \documentclass[S]{compsoft} | 5 % \documentclass[S]{compsoft} |
6 % \documentclass[S,L]{compsoft} | 6 % \documentclass[S,L]{compsoft} |
7 % \documentclass[K]{compsoft} | 7 % \documentclass[K]{compsoft} |
8 % \documentclass[K,L]{compsoft} | 8 % \documentclass[K,L]{compsoft} |
11 | 11 |
12 % Preamble | 12 % Preamble |
13 % | 13 % |
14 % 「コンピュータソフトウェア」誌に掲載される論文の場合,次で | 14 % 「コンピュータソフトウェア」誌に掲載される論文の場合,次で |
15 % 巻数,号数,開始ページ,終了ページを指定する. | 15 % 巻数,号数,開始ページ,終了ページを指定する. |
16 \volNoPp{16}{5}{78}{83} | 16 % \volNoPp{16}{5}{78}{83} |
17 | 17 |
18 % ワークショップによる推薦論文の場合,ワークショップ名を指定する. | 18 % ワークショップによる推薦論文の場合,ワークショップ名を指定する. |
19 % \suisen{ワークショップ名} | 19 % \suisen{ワークショップ名} |
20 | 20 |
21 % 特集の場合,特集のタイトルを与える. | 21 % 特集の場合,特集のタイトルを与える. |
22 % \tokushu{特集のタイトル} | 22 % \tokushu{特集のタイトル} |
23 | 23 |
24 % 大会論文の場合,\taikai で開催年を指定する.ここで指定した年から | 24 % 大会論文の場合,\taikai で開催年を指定する.ここで指定した年から |
25 % 大会の回数は計算される. | 25 % 大会の回数は計算される. |
26 % \taikai{2009} | 26 \taikai{2010} |
27 | 27 |
28 % ここに,使用するパッケージを列挙する. | 28 % ここに,使用するパッケージを列挙する. |
29 \usepackage[dvips]{graphics} | 29 \usepackage[dvips]{graphics} |
30 | 30 |
31 % ユーザが定義したマクロなどはここに置く.ただし学会誌のスタイルの | 31 % ユーザが定義したマクロなどはここに置く.ただし学会誌のスタイルの |
55 % | 55 % |
56 % 出典情報は \shutten とすれば出力される. | 56 % 出典情報は \shutten とすれば出力される. |
57 \shutten | 57 \shutten |
58 % | 58 % |
59 % 受付年月日,記事カテゴリなどは自動的に生成される. | 59 % 受付年月日,記事カテゴリなどは自動的に生成される. |
60 \uketsuke{2010}{8}{25} | 60 \uketsuke{2010}{8}{27} |
61 % | 61 % |
62 % その他,脚注に入れるものがあれば,\note に記述する. | 62 % その他,脚注に入れるものがあれば,\note に記述する. |
63 %\note{脚注に入れる内容} | 63 %\note{脚注に入れる内容} |
64 } | 64 } |
65 | 65 |
69 当研究室では, Concinuation based C という, 状態遷移記述に適した C の下位 | 69 当研究室では, Concinuation based C という, 状態遷移記述に適した C の下位 |
70 言語を提案している.Continuation based C は ステートメントより大きく, 関数よりも小さなプログラ | 70 言語を提案している.Continuation based C は ステートメントより大きく, 関数よりも小さなプログラ |
71 ミング単位としてコードセグメントを持ち, コードセグメントからの継続を基本としている. | 71 ミング単位としてコードセグメントを持ち, コードセグメントからの継続を基本としている. |
72 本研究では, 与えられた正規表現から, 等価な 有限状態オートマトンに変換し, | 72 本研究では, 与えられた正規表現から, 等価な 有限状態オートマトンに変換し, |
73 オートマトンにおける状態遷遷移を Continuation based Cによる継続に変換する | 73 オートマトンにおける状態遷遷移を Continuation based Cによる継続に変換する |
74 正規表現コンパイラ を Python で実装した. なお, ここで言うコンパイルは, | 74 正規表現コンパイラ を Python で実装した. なお, ここで言うコンパイルとは, |
75 内部形式/中 間表現への変換だけでなく,実行時バイナリの生成までを指す.} | 75 プログラム内部での中間表現への変換だけでなく,実行時バイナリの生成までを指す.} |
76 % | 76 % |
77 \maketitle | 77 \maketitle |
78 | 78 |
79 \section{はじめに} | 79 \section{はじめに} |
80 コンパイラ理論の発展と共に, コンパイルにかかる時間はより短く, また得られ | 80 コンパイラ理論の発展と共に, コンパイルにかかる時間はより短く, また得られ |
238 | 238 |
239 \subsection{DFAから実行バイナリの生成}\label{subsection:compile} | 239 \subsection{DFAから実行バイナリの生成}\label{subsection:compile} |
240 DFAからの実行バイナリ生成には, 3種類の実装を行った. | 240 DFAからの実行バイナリ生成には, 3種類の実装を行った. |
241 | 241 |
242 \begin{enumerate} | 242 \begin{enumerate} |
243 \item DFA $\rightarrow$ Continuation based C $\rightarrow$ gccによるコンパ | 243 \item DFA $\rightarrow$ Continuation based C $\rightarrow$ GCCによるコンパ |
244 イル | 244 イル |
245 \item DFA $\rightarrow$ C $\rightarrow$ gccによるコンパイル | 245 \item DFA $\rightarrow$ C $\rightarrow$ GCCによるコンパイル |
246 \item DFA $\rightarrow$ LLVM中間表現 $\rightarrow$ LLVMによるコンパイル | 246 \item DFA $\rightarrow$ LLVM中間表現 $\rightarrow$ LLVMによるコンパイル |
247 \end{enumerate} | 247 \end{enumerate} |
248 % | 248 % |
249 | 249 |
250 以下, Continuation based C, LLVMの説明と, それを利用したDFAからの | 250 以下, Continuation based C, LLVMの説明と, それを利用したDFAからの |
251 実行バイナリ生成の方法を説明する. | 251 実行バイナリ生成の方法を説明する. |
252 | 252 |
253 \subsubsection{Continuation based C} | 253 \subsubsection{Continuation based C} |
254 Continuation based C(以下CbC)は, ... | 254 Continuation based C(以下CbC)は, プログラミングの基本単位としてコードセ |
255 本研究室での先行研究によりCbCコンパイラは, GNU C Compiler上で実装されて | 255 グメントを持ち, コードセグメント間の軽量継続を基本としたCの下位言語であ |
256 いる\cite{Y},本研究ではgcc-4.5上に実装されたCbCコンパイラを用いた. | 256 る. 本研究室での先行研究によりCbCコンパイラは, GNU C Compiler上で実装さ |
257 れており\cite{Y}, GCCの末尾再帰最適化を強制することで, 関数と同様の記述 | |
258 が可能で, かつ関数呼び出しに伴なうリターンアドレスの保存や,スタックの成 | |
259 長のない, ``引数付きgoto''として継続を実装している.本研究ではgcc-4.5上に | |
260 実装されたCbCコンパイラを用いた. | |
257 | 261 |
258 以下に, 正規表現 ``$(A|B)*C$''に対応するDFAと, DFAの各状態に対応するCbC | 262 以下に, 正規表現 ``$(A|B)*C$''に対応するDFAと, DFAの各状態に対応するCbC |
259 のコードセグメントの生成例を示す. | 263 のコードセグメントの生成例を示す. |
260 | 264 |
261 \newpage | |
262 \begin{figure}[t] | 265 \begin{figure}[t] |
263 \begin{center} | 266 \begin{center} |
264 \scalebox{0.60}{\includegraphics{fig5.eps}} | 267 \scalebox{0.60}{\includegraphics{fig5.eps}} |
265 \caption{正規表現``$(A|B)*C$''に対応するDFA} | 268 \caption{正規表現``$(A|B)*C$''に対応するDFA} |
266 \label{figure:dfasmaple} | 269 \label{figure:dfasmaple} |
314 えた, モジュール単位で利用可能なコンパイラ基盤である\cite{L}. | 317 えた, モジュール単位で利用可能なコンパイラ基盤である\cite{L}. |
315 | 318 |
316 CbC/Cによる実装では,DFAからCbC/Cのソースコードに変換し,GCCによってコンパ | 319 CbC/Cによる実装では,DFAからCbC/Cのソースコードに変換し,GCCによってコンパ |
317 イルを行っている. LLVMによる実装では, LLVMの中間表現であるLLVM-IRを,提供 | 320 イルを行っている. LLVMによる実装では, LLVMの中間表現であるLLVM-IRを,提供 |
318 されているAPIを用いて直接操作を行い, コンパイルを経て実行バイナリを得る. | 321 されているAPIを用いて直接操作を行い, コンパイルを経て実行バイナリを得る. |
319 PythonからLLVM APIの利用は, LLVM APIのPythonラッパーであるllvm-pyを使用した. | 322 PythonからLLVM APIの利用は, LLVM APIのPythonラッパーであるllvm-py\footnote{http://www.mdevan.org/llvm-py/}を使用した. |
320 | 323 |
321 \begin{figure}[t] | 324 \begin{figure}[t] |
322 \begin{center} | 325 \begin{center} |
323 \scalebox{0.60}{\includegraphics{fig7.eps}} | 326 \scalebox{0.60}{\includegraphics{fig7.eps}} |
324 \caption{LLVMを用いた実装} | 327 \caption{LLVMを用いた実装} |
340 | 343 |
341 {\bf 実験環境} | 344 {\bf 実験環境} |
342 \begin{itemize} | 345 \begin{itemize} |
343 \item CPU : Core 2 Duo 950 @3.0GHz | 346 \item CPU : Core 2 Duo 950 @3.0GHz |
344 \item Memory : 16GB | 347 \item Memory : 16GB |
345 \item GCC (c) : 4.0.1 | 348 \item GCC : 4.5.0 |
346 \item LLVM: 2.4 | 349 \item LLVM: 2.4 |
347 \end{itemize} | 350 \end{itemize} |
348 | 351 |
349 {\bf コンパイル}\\ | 352 {\bf コンパイル}\\ |
350 n個の単語を正規表現のOR演算で繋げたパターンに対し, 各実装のコンパイル時 | 353 n個の単語を正規表現の和集合演算 ``$|$''で繋げたパターンに対し, 各実装のコンパイル時 |
351 間の比較を行った. | 354 間の比較を行った. |
352 | 355 |
353 \begin{table}[h] | 356 \begin{table}[h] |
354 \caption{ベンチマーク:compile} | 357 \caption{ベンチマーク:compile} |
355 \label{table:benchmark1} | 358 \label{table:benchmark1} |
356 \begin{tabular}[t]{|l||l|l|l||l|} | 359 \begin{tabular}[t]{|l||l|l|l||l|} |
357 \hline | 360 \hline |
358 n (単語数)& 1 & 10 & 50 & 100 \\ | 361 n (単語数)& 1 & 10 & 50 & 100 \\ |
359 \hline | 362 \hline |
360 DFA変換[ms] & 0.19 & 3.28 & 22.2 & 73.8\\ | 363 DFA変換[ms] & 0.19 & 3.28 & 22.2 & 73.8\\ |
361 状態数[個]& 8 & 50 & 187 & 381\\ | 364 DFAの状態数 & 8 & 50 & 187 & 381\\ |
362 \hline | 365 \hline |
363 GCC-C [s] & 0.34 & 0.78 & 2.18 & 4.27\\ | 366 GCC-C [s] & 0.34 & 0.78 & 2.18 & 4.27\\ |
364 \hline | 367 \hline |
365 GCC-CbC[s] & 0.75 & 1.03 & 9.14 & 9.43\\ | 368 GCC-CbC[s] & 0.75 & 1.03 & 9.14 & 9.43\\ |
366 \hline | 369 \hline |
369 \end{tabular} | 372 \end{tabular} |
370 \end{table} | 373 \end{table} |
371 | 374 |
372 表\ref{table:benchmark1}から, LLVMによるコンパイルがGCCに比べ10倍程高速 | 375 表\ref{table:benchmark1}から, LLVMによるコンパイルがGCCに比べ10倍程高速 |
373 に行われている. LLVMMによる実装では,APIを通じて直接LLVMの中間表現を操作 | 376 に行われている. LLVMMによる実装では,APIを通じて直接LLVMの中間表現を操作 |
374 することで, I/Oやパース等のオーバーヘッドもない. | 377 することで, ファイルI/Oやパース等のオーバーヘッドもない. |
375 | 378 |
376 {\bf マッチング}\\ | 379 {\bf マッチング}\\ |
377 マッチング時間の比較では,様々な正規表現を用いて比較を行った結果, 3つの実 | 380 マッチング時間の比較では,様々な正規表現を用いて比較を行った結果, 3つの実 |
378 装でマッチング時間にあまり差が見られなかった. 生成されるコードはコードセ | 381 装でマッチング時間にあまり差が見られなかった. 生成されるコードはコードセ |
379 グメント/関数と, switch文によるシンプルな実装であることから, コンパイル | 382 グメント/関数と, switch文によるシンプルな実装であることから, コンパイル |
435 | 438 |
436 \item[complex-regex]複雑な正規表現でのマッチング\\ | 439 \item[complex-regex]複雑な正規表現でのマッチング\\ |
437 パターン :``$(Python|Perl|Pascall|Prolog|\\ | 440 パターン :``$(Python|Perl|Pascall|Prolog|\\ |
438 PHP|Ruby|Haskell|Lisp|Scheme)$''\\ | 441 PHP|Ruby|Haskell|Lisp|Scheme)$''\\ |
439 マッチ行数: 1503行\\ | 442 マッチ行数: 1503行\\ |
440 このパターンは,9個の単語をORで並べたもので,確実に含まれる文字列は存在せ | 443 このパターンは,9個の単語を和集合演算 ``$|$''で並べたもので,確実に含まれる文字列は存在せ |
441 ず,先の二つに比べてGNU grep は遅い結果となっている. | 444 ず,先の二つに比べてGNU grep は遅い結果となっている. |
442 | 445 |
443 GNU grep 2.5.4 は188秒と, 本実装及びGNU grep 2.6.3に対して非常に遅い結 | 446 GNU grep 2.5.4 は188秒と, 本実装及びGNU grep 2.6.3に対して非常に遅い結 |
444 果となっているが, これは後述する mbrtowc(3) によるマルチバイト文字の変換 | 447 果となっているが, これは後述する mbrtowc(3) によるマルチバイト文字の変換 |
445 処理によるオーバーヘッドによるものである. | 448 処理によるオーバーヘッドによるものである. |
446 \end{description} | 449 \end{description} |
447 | 450 |
448 3つのテストケースの結果を見てみると, 本実装はそれぞれ実行時間にあまり差 | 451 3つのテストケースの結果を見てみると, 本実装はそれぞれ実行時間にあまり差 |
449 がなく, またコンパイル時間はマッチングにかかる時間と比べて無視できるなっ | 452 がなく, またコンパイル時間はマッチングにかかる時間と比べて無視できるほど |
450 ている. また, complex-regexのテストケースではGNU grepよりも高速な結果が | 453 短い時間である. また, complex-regexのテストケースではGNU grepよりも高速 |
451 出ており, 本実装は(フィルタリングを用いない)純粋なDFAマッチングにおいて | 454 な結果が出ており, 本実装は(フィルタリングを用いない)純粋なDFAマッチング |
452 パターンに比べて検索対テキストファイルが十分に大きな場合の検索にコンパイ | 455 において, 本実装によって動的に生成されたコードの性能が高いことが分かる. |
453 ルの効果が発揮されていることが分かる. | |
454 | 456 |
455 \subsection{特徴} | 457 \subsection{特徴} |
456 本実験によって実装された正規表現評価器の特徴を, GNU grep との比較をはさ | 458 本実験によって実装された正規表現評価器の特徴を, GNU grep との比較をはさ |
457 みながら説明する. | 459 みながら説明する. |
458 | 460 |
482 いる. | 484 いる. |
483 2010年3月にリリースされた GNU grep 2.6 から, UTF-8に対して本実装と同様に | 485 2010年3月にリリースされた GNU grep 2.6 から, UTF-8に対して本実装と同様に |
484 内部的に対応することで, mbrtowc(3)による変換コストが無くなっている. | 486 内部的に対応することで, mbrtowc(3)による変換コストが無くなっている. |
485 \begin{figure}[!t] | 487 \begin{figure}[!t] |
486 \begin{center} | 488 \begin{center} |
487 \scalebox{0.50}{\includegraphics{fig6.eps}} | 489 \scalebox{0.40}{\includegraphics{fig6.eps}} |
488 \caption{正規表現``(あ$|$い)*う''に対応するDFA} | 490 \caption{正規表現``(あ$|$い)*う''に対応するDFA} |
489 \label{figure:multibyte-dfamaple} | 491 \label{figure:multibyte-dfamaple} |
490 \end{center} | 492 \end{center} |
491 \end{figure} | 493 \end{figure} |
492 | 494 |