Mercurial > hg > Papers > 2011 > nobu-prosym
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{引数渡し} |