Mercurial > hg > Papers > 2021 > anatofuz-master
changeset 64:f431abfba3b2
update
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 03 Feb 2021 14:45:20 +0900 |
parents | eaa7a127027b |
children | e88c0e26d331 |
files | paper/chapter/02-cbc.tex paper/drawio/cbc_vs_c.drawio paper/drawio/cbc_vs_c.pdf paper/master_paper.pdf paper/src/cbc_example_test.c paper/src/cbc_example_test_void.s |
diffstat | 6 files changed, 90 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/chapter/02-cbc.tex Wed Feb 03 13:30:03 2021 +0900 +++ b/paper/chapter/02-cbc.tex Wed Feb 03 14:45:20 2021 +0900 @@ -32,17 +32,30 @@ 逆に次の継続に渡すDataGearをOutputDataGearと呼ぶ。 \section{CbCを使った例題} -ソースコード\ref{src:cbcexample_test}にCbCを使った例題を示す。 +ソースコード\ref{src:cbcexample_test}にCbCを使った例題を、 ソースコード\ref{src:cbcexample_test_c}に通常のCで実装した例題を示す。 +この例では構造体\texttt{struct test}をcodegear1に渡し、その次にcodegear2に継続している。 +codegear2からはcodegear3にgotoし、 最後にexitする。 \lstinputlisting[label=src:cbcexample_test, caption=CbCの例題]{src/cbc_example_test.cbc} +\lstinputlisting[label=src:cbcexample_test_c, caption=ソースコード\ref{src:cbcexample_test}のCでの実装]{src/cbc_example_test.c} +CbCの場合は継続で進んでいくが、 C言語での実装はvoid型の返り値を持つ関数呼び出しで表現される。 +\texttt{codegear3}に遷移したタイミングで、 CbCはmain関数のスタックしか持たないが、 C言語ではcodegear1、codegear2のスタックをそれぞれ持つ違いがある。(図\ref{fig:cbc_vs_c}) + +\begin{figure}[tb] + \begin{center} + \includegraphics[width=150mm]{./drawio/cbc_vs_c.pdf} + \end{center} + \caption{CbCとCの処理の差} + \label{fig:cbc_vs_c} +\end{figure} -この例では構造体\texttt{struct Test}をcodegear1に渡し、その次にcodegear2に継続している。 -codegear2からはcodegear3にgotoし、 最後にexitする。 -この例題をアセンブラに変換した結果をソースコード\ref{src:cbcexample_test_asm}に示す。 +実際に軽量継続になっているかを、この例題をアセンブラに変換した結果を見比べて確認する。 \lstinputlisting[label=src:cbcexample_test_asm, caption=ソースコード\ref{src:cbcexample_test}のアセンブラの一部]{src/cbc_example_test.s} -初回のmainからcodeGear1への継続は、 CbCコンパイラの仕様上関数呼び出しが行われる。 -それ以外のcodegear2からcodegear3などのgotoは、jmp命令が実行される。 -jmp命令はプログラムカウンタを切り替えるのみの命令であるため、 callと違いスタックの操作をしていないことが分かる。 +\lstinputlisting[label=src:cbcexample_test_asm_void, caption=ソースコード\ref{src:cbcexample_test_c}のアセンブラの一部]{src/cbc_example_test_void.s} +codegear1からcodegear2への移動の際に、CbCとCで発行されるアセンブラの命令を比較する。 +CbCの例題の場合のアセンブラのソースコード\ref{src:cbcexample_test_asm}はcodegear2へ25行目でjmp命令を使って遷移している。 +対してC言語での実装の場合(ソースコード\ref{src:cbcexample_test_asm_void})は21行目でcallqを使っている。 +jmp命令はプログラムカウンタを切り替えるのみの命令であり、 callは関数呼び出しの命令であるためにスタックの操作が行われる。
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/drawio/cbc_vs_c.drawio Wed Feb 03 14:45:20 2021 +0900 @@ -0,0 +1,1 @@ +<mxfile host="Electron" modified="2021-02-03T05:38:08.997Z" agent="5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/14.1.8 Chrome/87.0.4280.88 Electron/11.1.1 Safari/537.36" etag="TdDdmdpX1gq3JtKqRWhF" version="14.1.8" type="device"><diagram id="UcpAmoSUQrcBs8Q8-mIn" name="ページ1">7VpLU9swEP41OdKJLct2jhAoHNqZztChj5uwhe2iWK4sk4Rf31Ukx8+Q0LxoygWkT9J6tZ92tdrJAI0ns2tBsvgzDykb2MNwNkCXA9seeR78VcBcA+7I0UAkklBDVgXcJs/UgEODFklI88ZEyTmTSdYEA56mNJANjAjBp81pD5w1v5qRiHaA24CwLvotCWWsUd/2KvyGJlFcftlyR3pkQsrJZid5TEI+rUHoaoDGgnOpW5PZmDJlu9Iuet3HFaNLxQRN5SYLHEvcFCT/enZlP+M4u/5JirszbHST83LDNIT9my4XMuYRTwm7qtALwYs0pErqEHrVnE+cZwBaAP6iUs4NmaSQHKBYTpgZpbNEfq+1fyhRH7DpXc6M5EVnbjq5FPxxSQECRGuu1F1pEAPlvBABfcEKtjlYRERUvjAPLWmD4075hEoxh3WCMiKTp6YexBy8aDmv4gYahp5XUGWUfCKsMF8a2C4DdS8eOGy4TqL7u+DlwFm+oOEcJlijbFYNQitS/wNwWeVolAirlAgKaqF6SveQMAYOqA7DNE4kvc3Iwr5TCAFNqlfR9kSFpLOXiesaulzgGpcyMcXGpj+tPNQq3S6ueac/3BM37rsble6xgRs5x3QjtH83sv8NN0LYeWNu5OyfG/RvcIOdtxbivO258fu4iTjEtQ05AXvKpvEJS6IU2gHYlQoAlNUTSN/OzcAkCUMdbiloQu4XolQkzHiSyoWR8MUAXypZEGG1tgvRO2DR9vFaFnEPifa+SPTfSXw1iY63PkwelMTR1iTC9ntIHN+PT5VDrxVN/S6F7iEptKwOh2N9R13DHaXcrGPyZrr46jtJ0WkyScvfURreuqMwxl3HsNyuWd29mXX1GynPSPr38a1JTj2/03JXuMnb58wZHZ2z1Qn5LjlDJ8QZOjpnfYn6Cw9gyu75tP72XQAwEHORPIPFCFNgGp6rip26RRjJ8yR4rbH/5kUMJIj5cpHq1FapbrVs0SvXDXb3bi5vg7UPZx3fugdlTSZSYhs/sM0XvqibuZYI+c1ziNrnS2/UrKpXIluCMGoJslqCtCE6guB0kHltmskcVirsWS3HcRsVUmhoiZUjLG26hW/grdOz/ngGuRQ72fwMNR9KuCfEOQdN0Nz3CLdphDtWPHKx2zw07TCyaTxqC3LwYeIRMuWB/cajfRVu/qd45HjHjkd9lZuWkfOYZKoZFILNLwQJHlUysS6FrfLdzSLQA0uyOzNbtW92aHWvZfWeW6Cv5mmVZbbdm337Wku/8+QS6DlV7/GHrcKA5X3oMnnQgkspePdFs5MlEW/AIdoNh9CtfgehL77qxyTo6g8=</diagram></mxfile> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/cbc_example_test.c Wed Feb 03 14:45:20 2021 +0900 @@ -0,0 +1,35 @@ +extern int printf(const char*,...); + +typedef struct test { + int number; + char* string; +} TEST; + + +void codegear1(TEST); +void codegear2(TEST); +void codegear3(TEST); + +void codegear1(TEST testin){ + TEST testout; + testout.number = testin.number + 1; + testout.string = testin.string; + codegear2(testout); +} + +void codegear2(TEST testin){ + TEST testout; + testout.number = testin.number; + testout.string = "Hello"; + codegear3(testout); +} + +void codegear3(TEST testin){ + printf("number = %d\t string= %s\n",testin.number,testin.string); + exit(0); +} + +int main(){ + TEST test = {0,0}; + codegear1(test); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/cbc_example_test_void.s Wed Feb 03 14:45:20 2021 +0900 @@ -0,0 +1,34 @@ + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + subq $32, %rsp + movl %edi, %eax + movq %rsi, %rcx + movq %rcx, %rdx + movq %rax, -32(%rbp) + movq %rdx, -24(%rbp) + movl -32(%rbp), %eax + addl $1, %eax + movl %eax, -16(%rbp) + movq -24(%rbp), %rax + movq %rax, -8(%rbp) + movl -16(%rbp), %edx + movq -8(%rbp), %rax + movl %edx, %edi + movq %rax, %rsi + call codegear2 + nop + leave + .cfi_def_cfa 7, 8 + ret + .cfi_endproc +.LFE0: + .size codegear1, .-codegear1 + .section .rodata +.LC0: + .string "Hello" + .text + .globl codegear2 + .type codegear2, @function