Mercurial > hg > Papers > 2016 > kaito-master
view paper/appendix.tex @ 11:2d9b3ad3e524
result
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 14 Feb 2016 05:01:15 +0900 |
parents | |
children | 3afb4bfe1100 |
line wrap: on
line source
\chapter*{発表履歴} \addcontentsline{toc}{chapter}{発表文献} \begin{itemize} \item{Implementing Continuation based language in LLVM and Clang, Kaito TOKUMORI, Shinji KONO, LOLA 2015,Kyoto, July, 2015} \item {Continuation based C の LLVM/clang 3.5 上の実装について, 徳森海斗, 河野真治, 情報処理学会システムソフトウェアとオペレーティングシステム研究会, May, 2014} \end{itemize} \chapter{環境付き継続の計測に使用したソースコード} \begin{lstlisting}[frame=lrbt,label=gotowithenv,caption={}] #define LOOP 50000000 #include <stdio.h> __code print(int n,int result,int orig,__code(*print)(),__code (*exit1)(int, void*),void*exit1env); __code factorial(int n,int result,int orig,__code(*print)(int,int,int,__code(*)(),__code(*)(),void*),__code(*exit1)(int,void *), void *exit1env) { if (n<0) { printf("#0008:err %d!\n",n); goto (*exit1)(0,exit1env); } if (n==0) goto (*print)(n,result,orig,print,exit1,exit1env); else { result += n; n--; goto factorial(n,result,orig,print,exit1,exit1env); } } int calc(int n){ __code (*ret)(int,void *) = __return; void* env = __environment; goto factorial(n,1,n,print,ret,env); return 0; } int main( int ac, char *av[]) { int i; long ans; for(i=LOOP,ans=0;i>0;i--){ ans += calc(10); } printf("%ld\n",ans); } __code print(int n,int result,int orig,__code(*print)(),__code (*exit1)(int, void*),void*exit1env) { goto (*exit1)(result,exit1env); } \end{lstlisting} \chapter{計算を繰り返すコード (C)} \begin{lstlisting}[frame=lrbt,label=calc,caption={}] #define LOOP 500000000 #include <stdio.h> #include <stdlib.h> int func4(int a, int b){ return a+b; } int func3(int a, int b){ return func4(b,b/a); } int func2(int a, int b){ return func3(b,a*b); } int func1(int a, int b){ return func2(b,a+b); } int start_func(int loop){ int i, a; a = 0; for (i=0;i<loop;i++) a += func1(1,2); return a; } int main( int ac, char *av[]){ printf("%d\n",start_func(LOOP)); return 0; } \end{lstlisting} \chapter{計算を繰り返すコード (CbC)} \begin{lstlisting}[frame=lrbt,label=calcCbC,caption={}] #define LOOP 500000000 #include <stdio.h> #include <stdlib.h> __code code4(int a, int b, int loop, int ans){ goto start_code(ans+a+b, loop-1); } __code code3(int a, int b, int loop, int ans){ goto code4(b,b/a,loop, ans); } __code code2(int a, int b, int loop, int ans){ goto code3(b,a*b,loop, ans); } __code code1(int a, int b, int loop, int ans){ goto code2(b,a+b,loop, ans); } __code start_code(int ans, int loop){ if (loop>0) goto code1(1,2,loop, ans); else goto print(ans); } int main( int ac, char *av[]){ goto start_code(0,LOOP); return 0; } __code print(int a){ printf("%d\n",a); exit(0); } \end{lstlisting} \chapter{計算を繰り返すコード (Scheme)} \begin{lstlisting}[frame=lrbt,label=calcScheme,caption={}] (define LOOP 500000000) (define (print_ans ans) (print ans)) (define (code4 a b loop ans) (start_code (+ ans (+ a b)) (- loop 1))) (define (code3 a b loop ans) (code4 b (/ b a) loop ans)) (define (code2 a b loop ans) (code3 b (* a b) loop ans)) (define (code1 a b loop ans) (code2 b (+ a b) loop ans)) (define (start_code ans loop) (if (> loop 0) (code1 1 2 loop ans) (print_ans ans) )) (start_code 0 LOOP) \end{lstlisting}