Mercurial > hg > Papers > 2016 > kaito-master
diff paper/gotoWithEnv.tex @ 17:3afb4bfe1100
fix
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 15 Feb 2016 07:30:44 +0900 |
parents | e9a6d390a401 |
children |
line wrap: on
line diff
--- a/paper/gotoWithEnv.tex Sun Feb 14 20:07:43 2016 +0900 +++ b/paper/gotoWithEnv.tex Mon Feb 15 07:30:44 2016 +0900 @@ -1,16 +1,15 @@ \chapter{環境付き継続の実装} -環境付き継続を行うためには \_\_return, \_\_environment という特殊変数を用い, この実装にはいくつかの方法がある. GCC コンパイラでは nested function を, 以前の LLVM, Clang CbC コンパイラでは setjmp, longjmp を使用して実装を行っていた. これら二つの方法に加えて本研究では LLVM builtin の setjmp, longjmp を利用する実装を行った. 本章ではそれぞれに実装について述べる. +環境付き継続を行うためには \_\_return, \_\_environment という変数を用いる. 環境とはスタックの状態を指す. C の関数の環境を持って軽量継続を行い, 保存した環境に戻すことで, 環境を持たない code segment から関数に戻ることが可能になる. code segment から C の関数に戻るために保存しなければならないのはスタックポインタとフレームポインタのふたつである. 環境付き継続の実装にはいくつかの方法がある. GCC コンパイラでは nested function を, 以前の LLVM Clang CbC コンパイラでは setjmp, longjmp を使用して実装を行っていた. これら二つの方法に加えて本研究では LLVM builtin の setjmp, longjmp を利用する実装を行った. 本章ではそれぞれに実装について述べる. \section{nested function による実装} -GCC 上に実装した CbC コンパイラでは nested function を利用して環境付き継続の実装を行った. 実装の詳細は本論文の趣旨から大きくそれるので, どのようにじつげんしているかについてのみ記す. +GCC 上に実装した CbC コンパイラでは nested function を利用して環境付き継続の実装を行った\cite{gcc}. 実装の詳細は本論文の趣旨から大きくそれるので, どのようにじつげんしているかについてのみ記す. -具体的には, リスト\ref{code:cbcreturn2}の関数funcBをコンパイラは次のコード\ref{code:nestedcode}の様に解釈し, 内部コードセグメントを自動生成する. +具体的には, リスト\ref{code:cbcreturn2}の関数funcBをコンパイラは次のコード\ref{code:nestedcode}の様に解釈し, 内部 code segment を自動生成する. +6 行目から 20 行目が GCC により追加される処理である. 内部 code segment \verb|inner|は受け取った引数を関数の返り値として保持し, ラベル\verb|label|に jumpする. この時点で内部 code segment を抜けて元の関数 int の環境に復帰する. -6 行目から 20 行目が GCC により追加される処理である. 内部コードセグメント\verb|inner|は受け取った引数を関数の返り値として保持し, ラベル\verb|label|に jumpする. この時点で内部コードセグメントを抜けて元の関数 int の環境に復帰する. - -さらに jump 先も GCC により自動で追加される. しかしこの jump 先は\verb|inner|以外からは実行してはならない. そのため条件式が真にならない if 文で囲み、実行を回避している. jump 先での処理は, \verb|inner|内で代入された値を持ってリターンするのみである. +さらに jump 先も GCC により自動で追加される. しかしこの jump 先は\verb|inner|以外からは実行してはならない. そのため条件式が真にならない if 文で囲み, 実行を回避している. jump 先での処理は, \verb|inner|内で代入された値を持って reutnr するのみである. \begin{lstlisting}[frame=lrbt,label=code:cbcreturn2,caption={環境付き継続の例}] __code cs(int retval,__code(*ret)(int,void *),void *env){ @@ -23,7 +22,7 @@ } \end{lstlisting} -\begin{lstlisting}[frame=lrbt,label=code:nestedcode,caption={内部での解釈}] +\begin{lstlisting}[frame=lrbt,label=code:nestedcode,caption={GCC 環境付き継続の内部での解釈}] __code cs(int retval,__code(*ret)(int,void *),void *env){ goto ret(n, env); } @@ -61,7 +60,7 @@ return 0; } \end{lstlisting} -\begin{lstlisting}[frame=lrbt,label=autoCodeGenA,caption={内部での解釈}] +\begin{lstlisting}[frame=lrbt,label=autoCodeGenA,caption={LLVM clang の内部での解釈}] #include <setjmp.h> struct CbC_env {