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}