annotate resume/handout.tex @ 10:3d9addf62d0b

organized repository.
author kent <kent@cr.ie.u-ryukyu.ac.jp>
date Tue, 16 Feb 2010 14:35:36 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 \documentclass[twocolumn, a4j, twoside]{jarticle}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 \usepackage{master_proc}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 %\usepackage[dvips]{graphicx}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 \usepackage[dvipdfm]{graphicx}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 \usepackage{listings}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 \usepackage{multirow} %% tabularの上下の結合
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 \usepackage{slashbox} %% tabularでの斜め線
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 % dvipdfm を使って PDF ファイルに日本語の栞をつける
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 % \usepackage[dvipdfm]{color}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 % \usepackage[dvipdfm,bookmarks=true,bookmarksnumbered=true,%
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 % bookmarkstype=toc]{hyperref}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 \lstdefinelanguage{cbc}[]{C}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 {morekeywords={code,\_\_return}}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 \lstset{
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 language=cbc,%
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 %stringstyle=\ttfamily,%
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 stringstyle=,%
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 basicstyle=\small\ttfamily,%
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 commentstyle=\itshape\rmfamily,%
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 %identifierstyle=\color{blue}\bfseries,%
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 keywordstyle=\bfseries,%
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 framesep=5pt,%
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 showstringspaces=false,%
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 frameround=ftft,%
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 frame=trBL,
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 framextopmargin=2pt,
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 framexbottommargin=3pt,
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 emphstyle=\underbar,
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 %frame=tRBl,
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 %numbers=left,stepnumber=1,numberstyle=\footnotesize%
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 }%
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 \jtitle{組込み向け言語Continuation based CのGCC上の実装}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 \etitle{Implementation of the Continuation based C on GCC}%英文タイトル
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 \author{与儀健人} %著者名
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 \studentid{088511J} %学籍番号
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 \teacher{河野真治} %指導教官
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 \begin{document}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 \maketitle
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 \section{はじめに}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 企業システムの多様化、IT導入の加速により、ソフトウェアは大規模化・複雑
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 化する傾向にある。また家電製品のデジタル化も進み、組み込みシステムの需
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 要も増大している。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 それにともないハードウェアは驚異的な進歩を遂げてきた。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 しかしハードウェアの進歩に対し、ソフトウェアはその進歩に追いついていな
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 い。オブジェクト指向が発明され、Javaなどが注目されているが、ガベージコ
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 レクタや実行時コンパイルは余分な処理が必要となる。軽量かつ高速な応答が
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 要求される Real-time処理や組込み用途には適さない。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
55
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 PlayStation3にはCellという特殊なCPUが採用され注目されている。しかしプ
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 ログラミングは格段に難しく複雑になった。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 ハードウェアの進化や数学的検証にソフトウェアが対応するためには、これま
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 でとは違う新たな視点を持ったプログラミング言語が望ましい。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 我々はこれらの問題に取り組むため、Continuation based C(以下CbC)とい
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 う言語を提案している。Continuationとはプログラムの次の実行処理を表現す
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 る制御構造で、継続とも呼ばれている。CbCではCからサブルーチンやループ制
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 御を除き、代わりに継続をベースとした実行制御を行う。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 これまでCbCのコンパイルには、micro-cをベースとしたコンパイラが用いられ
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 てきた。加えて2008年の研究においてGCCをベースとしたCbCコンパイラが開発
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 され、継続処理の実装が行われた。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 本研究ではGCCベースのコンパイラにおいて残るCbCの機能の実装を行い、実用
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 的な CbCプログラムの動作を目指す。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
73
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
74
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 \section{Continuation based C (CbC)}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
76
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 CbCは、スタックを保持しない継続、``軽量継続''をプログラミング記述のベ
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 ースとした言語である。関数の代わりとなるそれぞれの処理単位は
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 ``コードセグメント''と呼ばれる。CbCではこのコードセグメントにより、状
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 態遷移を直接プログラムとして記述することができる。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
81
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 以下では簡単なCbC記述の例として階乗計算を行うコードセグメントを例示す
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 る。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 \begin{lstlisting}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 code factor0(int prod, int x,
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 code (*next)(int)) {
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 if (x >= 1) {
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 goto factor0(prod*x, x-1, next);
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 } else {
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 goto (*next)(prod);
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 }
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 } \end{lstlisting}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
93
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 この例の様にコードセグメントへの継続では、自分自身に対して継続すること
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 でループ制御を実現する事ができる。また、例にあるようにポインタの参照先
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 に継続する``間接継続''も可能になっている。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
97
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
98
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 \section{軽量継続の実装方法}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
100
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 初代のCbCコンパイラであるmicro-cは元より軽量継続を意識して開発されてお
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 り、コードセグメントに適した設計がなされている。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 しかしGCCではメンテナンス性の理由からそのような深いレベルでの実装は好
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 ましくない。既に入念に設計され実際に使われている関数と関数呼び出しを利
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 用して軽量継続を実装する。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 \subsection{末尾呼出による軽量継続}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 末尾呼出とはリターン文直前の関数呼び出しのことで、GCCの最適化の一つで
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 ある。通常の関数呼び出しは復帰後に元の環境に戻るが、この末尾呼び出しの
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 場合はその必要がなく、call命令の代わりにjmp命令を使うことができる。そ
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 してスタックを余計に積むこともない(図\ref{fig:tailcallstack})。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 \begin{figure}[htpb]
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 \begin{center}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 \includegraphics[width=.40\textwidth]{figures/tailcallstack.eps}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 \end{center}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 \caption{末尾呼出と通常呼出のスタックの変化}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 \label{fig:tailcallstack}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 \end{figure}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
119
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 この特徴は軽量継続のそれとほぼ同じである。構文解析にてこの最適化を強制
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 した関数呼出を生成することで、軽量継続の実装ができる。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
122
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
123
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 \subsection{fastcallによる高速化}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
125
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 以上で軽量継続は可能になったが、
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 これだけではCbC用に入念に設計されたmicro-cよりも良い性能を出すことはで
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 きない。特にx86アーキテクチャにおいての高速化を行う必要がある。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 x86の関数呼出規約では全ての引数はスタックに確保するため、メモリアクセ
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 スが多い。 fastcallを用いてこの関数規約を変更しスタックでなくレジスタ
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 を使用するように変更する。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
132
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 これによりメモリアクセスが減り、十分な高速化が得られた。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 \ref{sec:eval}には測定結果が見られる。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
135
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 \section{環境付き継続の実装}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
137
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 既存のソフトウェアを無駄にしないためにも、新しい言語が受け入れられるた
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 めにも、既存の言語との互換性は必須である。 CbCでは環境付き継続という形
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 でC との互換性を担保している。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
141
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 こちらはCの関数内から先ほどのコードセグメントfactor0に継続する例である。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 \begin{lstlisting}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 int caller() {
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 goto factor0(1, i, __return);
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 }
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 \end{lstlisting}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 本来は継続した場合、元の環境に復帰することはできないが、ここでは復帰の
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 ために \verb|__return|という特殊なコードセグメントをfactor0に渡してい
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 る。この特殊なコードセグメントは\verb|factor0|が処理を終える際に間接継
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 続として引数xと共に継続対象となり、その時、関数\verb|caller|は返り値x
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 を伴って復帰する。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
153
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 この環境付き継続の実装にはsetjmp()/longjmp()を使った方法も考えられるが
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 、ポータビリティのため、ここではGCCの拡張機能でもある内部関数を用いて
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 実装を行った。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
157
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
158
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 \section{メンテナンス性の向上に関する取り組み}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
160
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 新しいコンパイラはGCCをベースとした。GCCの本家でのアップデートリリース
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 は年5回ほどあり、CbCコンパイラもこれに追従するのが望ましい。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 \begin{figure}[h]
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 \begin{center}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 \includegraphics[width=.45\textwidth]{figures/gcc-repository.eps}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 \end{center}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 %\caption{<+caption text+>}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 %\label{fig:<+label+>}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 \end{figure}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
170
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 このメンテナンスのため、CbCコンパイラの管理に分散バージョン管理を用い
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 、GCC本家のリリースを追従するリポジトリとCbC開発用のリポジトリの2つを
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 管理する手法を用いた。この手法により、アップデートの手順が明確になり、
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 重要な変更点のみに集中できるようになった。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
175
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 \section{評価}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
177
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 \subsection{micro-cとの速度比較}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 GCCベースのコンパイラとmicro-cをベースとしたコンパイラで生成した実行フ
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 ァイルの速度差を比較する。次の表がその結果である。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 \begin{table}[h]
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 \centering
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 \begin{tabular}{|c|c|c|c|} \hline
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 & \multicolumn{2}{c|}{GCC} & \multirow{2}{*}{micro-c} \\ \cline{2-3}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 &最適化なし&速度最適化& \\ \hline
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 x86/OS X & 5.901 & 2.434 & 2.857 \\ \hline
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 x86/Linux & 5.732 & 2.401 & 2.254 \\ \hline
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 ppc/OS X &14.875 & 2.146 & 4.811 \\ \hline
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 ppc/Linux &19.793 & 3.955 & 6.454 \\ \hline
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 ppc/PS3 &39.176 & 5.874 &11.121 \\ \hline
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 \end{tabular}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 %\caption{GCCとmicro-cの速度比較(単位: 秒)}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 %\label{tab:speed-mc-vs-gcc}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 \end{table}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 x86に特化したコンパイラであるmicro-cとほぼ伍角の速度を得られた。また
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 PowerPCにおいてはいずれの環境でもmicro-cの倍近い速度を計測することがで
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 きた。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
198
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 \subsection{前バージョンとのとの速度比較}\label{sec:eval}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 次に、前回の実装時におけるGCCベースコンパイラと、今回改善したコンパイ
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 ラとの速度比較を次の表に示す。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 \begin{table}[h]
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 \centering
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 \begin{tabular}{|c|c|c|c|c|} \hline
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 & \multicolumn{2}{c|}{新バージョン} &
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 \multicolumn{2}{c|}{前バージョン} \\ \hline
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 最適化 & なし & あり & なし & あり \\ \hline
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 x86/OS X & 5.907 & 2.434 & 4.668 & 3.048 \\ \hline
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 x86/Linux & 5.715 & 2.401 & 4.525 & 2.851 \\ \hline
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 \end{tabular}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 %\caption{GCC-4.2.3ベースとGCC-4.4.2ベースの速度比較(単位: 秒)}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 %\label{tab:speed-old-vs-new}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 \end{table}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
214
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 新バージョンでは最適化を行わない場合に速度の低下が見られた。これは末尾
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 呼出の強制のために行った処理が影響したものであり、予想通りの結果であっ
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 た。この速度低下は最適化によりカバーされ得る。実際に最適化を行った場合
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 は15--20\%ほど旧バージョンより高速化に成功している。こちらはfastcallに
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 よる影響だと考えられる。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
220
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
221
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
222 \section{まとめと今後の課題}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
223
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 本研究による成果を以下にあげる。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 \begin{itemize}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 \item GCCをベースとしたCbCコンパイラがCbCのフルセットとして利用可能
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
227 となった
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 \item CbCが20以上の多数のアーキテクチャに対応
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
229 \item CbCの高速化(特にx86について大幅に改善された)
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
230 \item デバッガとしてgdbが使用可能になった
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 \end{itemize}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
232
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
233 今後の課題を以下に述べる。
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 \begin{itemize}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 \item Real-time、組込み向けに実用的な例題の作成
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
236 \item タブロー法を用いた検証手法の確立
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 \item オブジェクティブなCbCの設計
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
238 \item スケジューラを使ったCbCの並列化
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
239 \end{itemize}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
240
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
241 \begin{thebibliography}{9}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
242 \bibitem{bib:kono-april-2008}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
243 河野真治. ``Implementing Continuation based language in GCC'',
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
244 Continuation Festa 2008, April, 2008
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
245
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
246 \bibitem{kent} 与儀健人, 河野真治.
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
247 ``組み込み向け低レベル言語CbCのGCCによる実装'',
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
248 第6回ディペンダブルシステムワークショップ, July, 2008
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
249
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
250 \bibitem{bib:kono-march-2008}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 河野真治. ``検証を自身で表現できるハードウェア、ソフトウェア記述言
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
252 語 Continuation based C と、そのCell への応用'',
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
253 電子情報通信学会VLSI設計技術研究会, March, 2008
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
254 \end{thebibliography}
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
255
3d9addf62d0b organized repository.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
256 \end{document}