comparison Paper/nobu-prosym.tex @ 31:db9735be2bf1

modify
author Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
date Mon, 21 Nov 2011 06:55:07 +0900
parents d80535a49459
children 8bf53f6b1256
comparison
equal deleted inserted replaced
30:998df5441c3b 31:db9735be2bf1
439 この時のスタックの様子を表したのが図\ref{fig:cs_prog}となる. 439 この時のスタックの様子を表したのが図\ref{fig:cs_prog}となる.
440 数字の 1 と 2 は \verb+cs_b+ の引数をスタックに乗せる順を表している. 440 数字の 1 と 2 は \verb+cs_b+ の引数をスタックに乗せる順を表している.
441 CbC ではこの問題を一時変数に引数の値を代入することで問題を解決している. 441 CbC ではこの問題を一時変数に引数の値を代入することで問題を解決している.
442 442
443 \subsubsection{一時変数へのコピー} 443 \subsubsection{一時変数へのコピー}
444 一時変数へのコピーは, goto が行われた時の, コードセグメントの Generic Tree 生成時に行われる. 444 一時変数へのコピーは, goto が行れるコードセグメントの Generic Tree を生成時する時に行われる.
445 445
446 図\ref{fig:cbc_replace}に示す \verb+cbc_replace_arguments+ 関数が実際のコードとなる. 446 図\ref{fig:cbc_replace}に示す \verb+cbc_replace_arguments+ 関数が実際のコードとなる.
447 %\begin{figure} 447 %\begin{figure}
448 %\lstinputlisting[language=c]{source/cbc_replace_arguments.c} 448 %\lstinputlisting[language=c]{source/cbc_replace_arguments.c}
449 %\caption{引数の一時変数へのコピー} 449 %\caption{引数の一時変数へのコピー}
492 492
493 GCC内部では, \verb+__return+ は, 関数内で定義された \verb+_cbc_internal_return+関数へのポインタを返す. 493 GCC内部では, \verb+__return+ は, 関数内で定義された \verb+_cbc_internal_return+関数へのポインタを返す.
494 戻値は, \verb+cbc_internal_return+ 関数内で定義された変数\verb+retval+を通して返される(Listing\ref{code:_ret_val}). 494 戻値は, \verb+cbc_internal_return+ 関数内で定義された変数\verb+retval+を通して返される(Listing\ref{code:_ret_val}).
495 495
496 \begin{figure}[h] 496 \begin{figure}[h]
497 \begin{footnotesize}
497 \begin{minipage}[b]{.45\textwidth} 498 \begin{minipage}[b]{.45\textwidth}
498 \begin{lstlisting}[caption=環境付き継続を行うコード,label=code:_ret_val] 499 \begin{lstlisting}[caption=環境付き継続を行うコード,label=code:_ret_val]
499 __label__ _cbc_exit0; 500 __label__ _cbc_exit0;
500 static int retval; 501 static int retval;
501 void _cbc_internal_return(int retval_, 502 void _cbc_internal_return(int retval_,
509 } 510 }
510 _cbc_internal_return; 511 _cbc_internal_return;
511 \end{lstlisting} 512 \end{lstlisting}
512 \end{minipage} 513 \end{minipage}
513 \hfill 514 \hfill
515 \end{footnotesize}
514 \end{figure} 516 \end{figure}
515 517
516 \subsubsection{環境付き継続の問題} 518 \subsubsection{環境付き継続の問題}
517 現在環境付き継続は 519 現在環境付き継続は
518 このコードを GCC 内部で生成することで実現している. これは正しく動作しているが, 520 このコードを GCC 内部で生成することで実現している. これは正しく動作しているが,
519 \verb+retval+に static を指定してしまうと, 521 \verb+retval+に static を指定してしまうと,
520 スレッドセーフな実装でなくなる. 522 スレッドセーフな実装でなくなる.
521 これを通常の変数にすると, 関数内の関数は closure として実装される. しかし, GCC 4.6 と Lion の 523 これを通常の変数にすると, 関数内の関数は closure として実装される. しかし, GCC 4.6 と Lion の
522 組合せでは closure は正しく動作してないことがわかった. 524 組合せでは closure は正しく動作してないことがわかった.
523 Thread local 変数を用いると, やはり closure が出力されてしまう. 525 Thread local 変数を用いると, やはり closure が出力されてしまう.
524 本来は, 戻値用のレジスタが使用されれば問題ないが, 戻値の型は整数やポインタとは限らず, 526 本来, 戻値用のレジスタが使用されれば問題ないが, 戻値の型は整数やポインタとは限らず,
525 浮動小数点や構造体自体である可能性があり複雑である. 527 浮動小数点や構造体自体である可能性があり複雑である.
526 一つの解決策はレジスタ渡しと考えているが, 他の方法もありえる. 少し重いが setjmp を用いた実装方法もある. 528 一つの解決策はレジスタ渡しと考えているが, 他の方法もありえる. 少し重いが setjmp を用いた実装方法もある.
527 529
528 530
529 \subsection{引数渡し} 531 \subsection{引数渡し}