annotate Paper/anatofuz.tex @ 98:b360b0159390 default tip

update
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Fri, 11 Jan 2019 14:08:33 +0900
parents 0c012cbdf385
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
a758898008e6 add tex and Makefile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 % withpage: ページ番号をつける (著者確認用)
a758898008e6 add tex and Makefile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 % english: 英語原稿用フォーマット
a758898008e6 add tex and Makefile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 \documentclass{ipsjprosym}
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
4 %\documentclass[withpage, english]{ipsjprosym}
2
a758898008e6 add tex and Makefile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5
11
ea10413281c5 tweak Makefile and create reference.bib
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
6 \usepackage[dvipdfmx]{graphicx}
2
a758898008e6 add tex and Makefile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 \usepackage{latexsym}
11
ea10413281c5 tweak Makefile and create reference.bib
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
8 \usepackage{comment}
14
56f4ac0231ee tweak tex and add bibfile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
9 \usepackage{listings}
56f4ac0231ee tweak tex and add bibfile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
10 \lstset{
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
11 language=C,
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
12 tabsize=2,
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
13 frame=single,
53
27cb6c89b7d2 fix about returned comment
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
14 basicstyle={\tt\footnotesize}, %
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
15 identifierstyle={\footnotesize}, %
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
16 commentstyle={\footnotesize\itshape}, %
55
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
17 keywordstyle={\footnotesize\ttfamily}, %
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
18 ndkeywordstyle={\footnotesize\ttfamily}, %
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
19 stringstyle={\footnotesize\ttfamily},
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
20 breaklines=true,
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
21 captionpos=b,
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
22 columns=[l]{fullflexible}, %
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
23 xrightmargin=0zw, %
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
24 xleftmargin=1zw, %
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
25 aboveskip=1zw,
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
26 numberstyle={\scriptsize}, %
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
27 stepnumber=1,
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
28 numbersep=0.5zw, %
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
29 lineskip=-0.5ex,
14
56f4ac0231ee tweak tex and add bibfile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
30 }
56f4ac0231ee tweak tex and add bibfile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
31 \renewcommand{\lstlistingname}{Code}
56f4ac0231ee tweak tex and add bibfile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
32 \usepackage{caption}
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
33 \captionsetup[lstlisting]{font={small, tt}}
11
ea10413281c5 tweak Makefile and create reference.bib
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
34 \usepackage{url}
2
a758898008e6 add tex and Makefile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 \begin{document}
a758898008e6 add tex and Makefile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
37 % Title, Author %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3
154c6acc0e23 add_abst
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
38 \title{CbCを用いたPerl6処理系}
154c6acc0e23 add_abst
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
39
154c6acc0e23 add_abst
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
40 %\affiliate{IPSJ}{情報処理学会}
154c6acc0e23 add_abst
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
41 \affiliate{IERYUKYU}{琉球大学工学部情報工学科}
2
a758898008e6 add tex and Makefile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
42
3
154c6acc0e23 add_abst
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
43 \author{清水 隆博}{Takahiro SHIMIZU}{IERYUKYU}[anatofuz@cr.ie.u-ryukyu.ac.jp]
154c6acc0e23 add_abst
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
44 \author{河野 真治}{Shinji KONO}{IERYUKYU}[kono@ie.u-ryukyu.ac.jp]
2
a758898008e6 add tex and Makefile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45
3
154c6acc0e23 add_abst
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
46 %概要
2
a758898008e6 add tex and Makefile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 \begin{abstract}
3
154c6acc0e23 add_abst
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
48 スクリプト言語であるPerl5の後継言語としてPerl6が現在開発されている.
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
49 Perl6は設計と実装が区分されており様々な処理系が開発されている.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
50 現在主流なPerl6はRakudoと言われるプロジェクトである.
53
27cb6c89b7d2 fix about returned comment
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
51 RakudoではPerl6自体をNQP(NotQuitPerl)と言われるPerl6のサブセットで記述し, NQPをVMが解釈するという処理の流れになっている.
76
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 75
diff changeset
52 このVMは任意のVMが選択できるようになっており,主に利用されているVMにCで書かれたMoarVMが存在する.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
53 MoarVMはJITコンパイルなどをサポートしているが, 全体的な起動時間及び処理速度がPerl5と比較し非常に低速である.
24
d8f77d0a3452 update environemt return and bib
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
54 この問題を解決するためにContinuation based C (CbC)という言語を一部用いてMoarVMの書き換えを行う.
71
79c887a307c9 fix abst
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
55 CbCはCよりも細かな単位で記述が可能である為, 言語処理系の実装に適していると考えられる.
76
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 75
diff changeset
56 CbCに関する今までの研究においては, 言語処理系にCbCを利用した事例が少ない.
74
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 72
diff changeset
57 その為, 本稿ではCbCを言語処理系に用いた場合の利点やデバッグ手法などについても述べる.
3
154c6acc0e23 add_abst
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
58
154c6acc0e23 add_abst
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
59
2
a758898008e6 add tex and Makefile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 \end{abstract}
a758898008e6 add tex and Makefile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61
a758898008e6 add tex and Makefile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 \begin{jkeyword}
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
63 プログラミング言語, コンパイラ, CbC, Perl6, MoarVM
2
a758898008e6 add tex and Makefile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 \end{jkeyword}
a758898008e6 add tex and Makefile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65
a758898008e6 add tex and Makefile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 \maketitle
a758898008e6 add tex and Makefile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67
a758898008e6 add tex and Makefile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 % Body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
53
27cb6c89b7d2 fix about returned comment
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
69 \section{はじめに}
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
70 当研究室ではContinuation Based C(以下CbC)という言語を開発している.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
71 CbCはCよりきめ細やかな単位で実装する事が可能である為, 言語処理系に応用すれば効率的な開発,実行が出来ると期待される.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
72 現在活発に開発が進んでいる言語にPerl6がある.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
73 Perl6はMoarVMと呼ばれるVMを中心としたRakudoと呼ばれる実装が現在の主流となっている.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
74 Rakudoは処理速度が他のプログラミング言語と比較しても非常に低速である.
53
27cb6c89b7d2 fix about returned comment
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
75 その為, 現在日本国内ではPerl6を実務として利用するケースは概ね存在しない.
27cb6c89b7d2 fix about returned comment
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
76 Perl6の持つ言語機能や型システムは非常に柔軟かつ強力であるため, 実用的な処理速度に達すれば, 言語の利用件数が向上することが期待される.
74
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 72
diff changeset
77 その為本稿では, CbCを用いた言語処理系の実装の一例としてMoarVMをCbCで書き換えたCbCMoarVMを提案する.
67
60a15dd5023c fix abst
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 66
diff changeset
78
60a15dd5023c fix abst
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 66
diff changeset
79 CbCをMoarVMの実装として利用した場合, CbCの持つ機能によってMoarVMの高速化を中心とした改良に有益な効果があると推測出来る.
60a15dd5023c fix abst
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 66
diff changeset
80 また, 現在までのCbCを用いた研究においては言語処理系への応用例が少ない.
74
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 72
diff changeset
81 従って, 本稿はCbCをスクリプト言語の実装に適応した場合, どのような利点やプログラミング上の問題点に遭遇するか, CbCの応用としての側面でも行う.
67
60a15dd5023c fix abst
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 66
diff changeset
82 この際にCbCを用いた言語処理系のデバッグを行う際には, CbCを使わずに記述されたオリジナルの言語処理系との並列デバッグが必要となる.
76
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 75
diff changeset
83 従ってMoarVMにCbCを適応した場合, どのようにすれば並列デバッグが行えるかについても述べる.
74
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 72
diff changeset
84 本稿ではまずCbC, Perl6の特徴及び現在の実装について述べ, CbCで書き換えたMoarVMについてデバッグ手法も含め解説する.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 72
diff changeset
85 研究にあたり, 得られたCbCを言語処理系に適応した場合の利点と欠点について述べ, 今後の展望について記載する.
4
1035c41fc2db add abstract
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
86
10
9c172999d70e tweak Papers for CbC abstract
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
87 \section{CbC}
9c172999d70e tweak Papers for CbC abstract
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
88 \subsection{CbCの概要}
9c172999d70e tweak Papers for CbC abstract
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
89 CbCは当研究室で開発しているプログラミング言語である.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
90 Cレベルでのプログラミングを行う場合, 本来プログラマが行いたい処理の他にmallocなどを利用したメモリのアロケートやエラーハンドリングなどを記述する必要がある.
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
91 これらの処理をmeta computationと呼ぶ.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
92 これらmeta computationと通常の処理を分離することでバグの原因がmeta computation側にあるか処理側にあるかの分離などが可能となる.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
93 しかしC言語などを用いたプログラミングでmeta computationの分離を行おうとすると, それぞれ事細かに関数やクラスを分割せねばならず容易ではない.
44
571f6ffcccf8 mv CodeSegment to CodeGear and Datasegment to Datagear
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
94 CbCでは関数よりmeta computationを細かく記述する為にCodeGearという単位を導入した.
571f6ffcccf8 mv CodeSegment to CodeGear and Datasegment to Datagear
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
95 またCodeGearの実行に必要なデータをDataGearという単位で受け渡す.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
96 CbCではCodeGear, DataGearを基本単位として記述するプログラミングスタイルを取る.
10
9c172999d70e tweak Papers for CbC abstract
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
97
44
571f6ffcccf8 mv CodeSegment to CodeGear and Datasegment to Datagear
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
98 \subsection{CodeGearとDataGear}
571f6ffcccf8 mv CodeSegment to CodeGear and Datasegment to Datagear
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
99 CbCではCの関数の代わりにCodeGearを導入する.
53
27cb6c89b7d2 fix about returned comment
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
100 CodeGearはCの関数宣言の型名の代わりに\_\_codeと書くことで宣言できる.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
101 \_\_codeはCbCコンパイラの扱いはvoidと同じ型であるが, CbCプログラミングではCodeGearである事を示す識別子としての意味で利用する.
44
571f6ffcccf8 mv CodeSegment to CodeGear and Datasegment to Datagear
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
102 CodeGear間の移動はgoto文によって記述する.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
103 \lstinputlisting[label=cbcexample, caption=cbc\_example.cbc]{./src/cbc_example.cbc}
53
27cb6c89b7d2 fix about returned comment
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
104 Code\ref{cbcexample}に示すCbCのコードではmain関数からcg1, cg2に遷移し, 最終的にdataの値が2となる.
27cb6c89b7d2 fix about returned comment
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
105 CodeGear間の入出力の受け渡しは引数を利用し行う.
27cb6c89b7d2 fix about returned comment
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
106
27cb6c89b7d2 fix about returned comment
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
107 あるCodeGearの実行に必要なデータを, DataGearと呼ぶ.
27cb6c89b7d2 fix about returned comment
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
108 DataGearにはCodeGearで実行される関数や変数などの情報を含む.
27cb6c89b7d2 fix about returned comment
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
109 Code\ref{cbcexample}に示す例では, CodeGearに渡す引数datapが, 一種のDataGearと言える.
16
ed882dba29f6 add about threaded code and jlisting.sty
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
110
17
b2a795a294c4 update Moarvm bytecodes and perlcc
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
111 \subsection{軽量継続}
22
fb4c1b408c9f add sample codes and tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 21
diff changeset
112 %TBD
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
113 CbCでは次のCodeGearに移行する際, Cのgoto文を利用する.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
114 通常のCの関数呼び出しの場合, スタックポインタを操作しローカル変数などをスタックに保存する.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
115 CbCの場合スタックフレームを操作せず, レジスタの値を変更せずそのまま次のCodeGearに遷移する事が可能である.
24
d8f77d0a3452 update environemt return and bib
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
116 通常Sechemeのcall/ccなどの継続は現在の位置までの情報を環境として所持した状態で遷移する.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
117 対してCbCは環境を持たず遷移する為, 通常の継続と比較して軽量であることから軽量継続であると言える.
22
fb4c1b408c9f add sample codes and tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 21
diff changeset
118 CbCは軽量継続を利用するためレジスタレベルでのきめ細やかな実装が可能となっている.
10
9c172999d70e tweak Papers for CbC abstract
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
119
9c172999d70e tweak Papers for CbC abstract
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
120 \subsection{現在の実装}
9c172999d70e tweak Papers for CbC abstract
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
121 CbCは現在主要なCコンパイラであるgcc及びllvmをバックエンドとしたclang上の2種類の実装が存在する.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
122 gccはバージョン9.0.0に, clangは7.0.0に対応している.
14
56f4ac0231ee tweak tex and add bibfile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
123
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
124 %\subsection{CbCコンパイラのバグ}
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
125 %% 局所変数のポインタを握ったままgotoするとtail callにならない
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
126 %CbCコンパイラは現在も開発中であり幾つかのバグが発見されている.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
127 %まずCodeGear内で宣言した局所変数のポインタを大域変数の配列などに保存した状態でgotoしてしまうとtail call最適化が無効となる.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
128 %これはただの関数呼び出しになってしまう為, 直接的な被害はないもののCbCとしての利点が損なわれてしまう.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
129 %%また本来は操作しないはずのスタック領域の操作が入ってしまうため, プログラマの意図と反したスタックポインタなのど操作が行われてしまいバグが発生する可能性が存在する.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
130 %また, CbCの挙動としてCodeGearへの遷移時には軽量継続を行う為スタック領域の操作は行われないはずである.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
131 %しかし, 現状は配列にCodeGearのアドレスを代入し, 間接的に軽量継続を行おうとすると, スタック領域の操作が通常の関数呼び出しの様に行われてしまう.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
132 %%これは一部CbCコンパイラが利用しているgcc側のref-zoneという機能が影響していたが
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
133 %
10
9c172999d70e tweak Papers for CbC abstract
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
134 \subsection{CbCとCの互換性}
55
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
135 CbCコンパイラはコンパイル対象のソースコードがCbCであるかどうかを判断する.
44
571f6ffcccf8 mv CodeSegment to CodeGear and Datasegment to Datagear
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
136 この際にCodeGearを利用していない場合は通常のCプログラムとして動作する.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
137 その為今回検証するMoarVMのビルドにおいてもCbCで書き換えたソースコードがあるMoarVMと, 手を加えていないオリジナルのMoarVMの2種類を同一のCbCコンパイラでビルドする事が可能である.
24
d8f77d0a3452 update environemt return and bib
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
138
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
139 またCからCbCへの遷移時に, 再びCの関数に戻るように実装したい場合がある.
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
140 その際は環境付きgotoと呼ばれる手法を取る.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
141 これは\_CbC\_return及び\_CbC\_environmentという変数を使用する.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
142 この変数は\_CbC\_returnが元の環境に戻る際に利用するCodeGearを指し, \_CbC\_environmentは復帰時に戻す元の環境である.
58
8e5e2521d1db insert space after ,
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
143 復帰する場合, 呼び出した位置には帰らず, 呼び出した関数の終了する位置に帰る.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
144 \lstinputlisting[label=cbcreturn, caption=環境付き継続の例]{./src/return.cbc}
51
baba702fb22b fix typo
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 50
diff changeset
145 Code\ref{cbcreturn}に示す例ではc\_funcから環境付き継続でcgに継続している.
baba702fb22b fix typo
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 50
diff changeset
146 通常c\_funcの返り値は-1であるが, cgから環境付き継続でmainに帰る為にcgから渡される1がtestの値となる.
10
9c172999d70e tweak Papers for CbC abstract
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
147
9
8e80522a88bd tweek mindmap and wrote table of contents for Paper
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
148
14
56f4ac0231ee tweak tex and add bibfile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
149 \subsection{言語処理系におけるCbCの応用}
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
150 CbCを言語処理系, 特にスクリプト言語に応用すると幾つかの箇所に置いて利点がある.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
151 CodeGearはコンパイラの基本ブロックに相当する.
44
571f6ffcccf8 mv CodeSegment to CodeGear and Datasegment to Datagear
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
152 その為従来のスクリプト言語では主にcase文で記述していた命令コードディスパッチの箇所をCodeGearの遷移として記述する事が可能である.
64
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
153 通常の言語処理系では命令コードディスパッチ部分は巨大なcase文となり, この部分を実装したCファイルが巨大化してしまう.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
154 CodeGearを導入することで巨大なcase文をCodeGearとして分割する事が可能となり, 処理のモジュール化が可能となる.
65
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
155 また, CodeGearとCodeGear間の遷移は軽量継続で行われる為, レジスタレベルでの最適化も可能となる.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
156
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
157 CbCは状態を単位として記述が可能であるため, 命令コードなどにおける状態を利用するスクリプト言語の実装は応用例として適していると考えられる.
14
56f4ac0231ee tweak tex and add bibfile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
158
9
8e80522a88bd tweek mindmap and wrote table of contents for Paper
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
159 \section{Perl6の概要}
5
06f3183ef6c3 add about Perl6
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
160 この章では現在までのPerl6の遍歴及びPerl6の言語的な特徴について記載する.
62
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
161
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
162
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
163 \subsection{Perl6の構想}
9
8e80522a88bd tweek mindmap and wrote table of contents for Paper
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
164 Perl6は2002年にLarryWallがPerlを置き換える言語として設計を開始した.
8e80522a88bd tweek mindmap and wrote table of contents for Paper
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
165 Perl5の言語的な問題点であるオブジェクト指向機能の強力なサポートなどを取り入れた言語として設計された.
62
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
166 Perl5は設計と実装が同一であり, Larryらによって書かれたC実装のみだった.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
167 Perl6は設計と実装が分離している.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
168 言語的な特徴としては, 独自にPerl6の文法を拡張可能なGrammar, Perl5と比較した場合のオブジェクト指向言語としての進化も見られる.
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
169 またPerl6は漸進的型付け言語である.
62
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
170 従来のPerlの様に変数に代入する対象の型や, 文脈に応じて型を変更する動的型言語としての側面を持ちつつ, 独自に定義した型を始めとする様々な型に, 静的に変数の型を設定する事が可能である.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
171
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
172 Perl6は言語仕様及び処理実装がPerl5と大幅に異なっており, 言語的な互換性が存在しない.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
173 従って現在ではPerl6とPerl5は別言語としての開発方針になっている.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
174 Perl6は現在有力な処理系であるRakudoから名前を取りRakuという別名がつけられている.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
175
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
176 %\subsection{Rakudo以前の処理系}
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
177 %Perl6の実装は様々なものが実装された.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
178 %まず2005年に唐鳳によってHaskellで実装されたPugs\cite{pugs}が登場した.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
179 %
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
180 %その後Pythonとの共同動作環境としてParrot\cite{parrot}が実装された.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
181 %ParrotはPASMと呼ばれるバイトコードを解釈可能なレジスタマシンである.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
182 %ParrotでのPerl6の実装はNQP(NotQuitPerl)と呼ばれるPerl6のサブセットでPerl6を記述するというアイディアの基実装された.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
183 %ParrotVMは2006年のversion8.1.0が最後のリリースである.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
184 %こちらもPugsと同様に現在のPerl6プロジェクトでは歴史的な実装とされている.
9
8e80522a88bd tweek mindmap and wrote table of contents for Paper
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
185
5
06f3183ef6c3 add about Perl6
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
186
06f3183ef6c3 add about Perl6
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
187 \subsection{Rakudo}
06f3183ef6c3 add about Perl6
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
188
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
189
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
190 RakudoとはNQP, NQPに基づくPerl6を基にしたプロジェクトである.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
191 NQPとは, 以前のPerl6処理系であるParrot\cite{parrot}で, 構想に上がったPerl6のサブセットである.
6
6dcf1143dc8f add about NQP
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
192 RakudoがPerl6のコンパイラかつインタプリタであると考えても良い.
22
fb4c1b408c9f add sample codes and tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 21
diff changeset
193 Rakudoは図\ref{fig:perl6construction}に示す構成になっている.
14
56f4ac0231ee tweak tex and add bibfile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
194 Rakudoにおけるコンパイラとは厳密には2種類存在する.
58
8e5e2521d1db insert space after ,
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
195 まず第1のものがPerl6, もしくはNQPをMoarVM, JVMのバイトコードに変換するNQPコンパイラである.
14
56f4ac0231ee tweak tex and add bibfile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
196 次にそのNQPが出力したバイトコードをネイティブコードに変換するVMの2種類である.
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
197 このVMは現在MoarVM, JavaVMを選択可能である.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
198 Rakudo及びNQP projectではこのNQPコンパイラの部分をフロントエンド, VMの部分をバックエンド\cite{rani1}と呼称している.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
199 NQPで主に書かれ, MoarVMなどNQPが動作する環境で動くPerl6のことをRakudoと呼ぶ.
60
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
200 Perl6はNQP以外にもNQPを拡張したPerl6自身で書かれている箇所が存在し, これはNQPコンパイラ側でMoarVMが解釈可能な形へ変換を行う.
6
6dcf1143dc8f add about NQP
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
201
22
fb4c1b408c9f add sample codes and tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 21
diff changeset
202 \begin{figure}[ht]
fb4c1b408c9f add sample codes and tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 21
diff changeset
203 \begin{center}
fb4c1b408c9f add sample codes and tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 21
diff changeset
204 \includegraphics[width=70mm]{fig/perl6nqp.pdf}
fb4c1b408c9f add sample codes and tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 21
diff changeset
205 \end{center}
60
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
206 \caption{Rakudoの構成}
22
fb4c1b408c9f add sample codes and tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 21
diff changeset
207 \label{fig:perl6construction}
fb4c1b408c9f add sample codes and tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 21
diff changeset
208 \end{figure}
fb4c1b408c9f add sample codes and tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 21
diff changeset
209
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
210 \subsection{MoarVM}
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
211 MoarVMとはRakudoで主に開発が進められているVMである.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
212 Perl6及びNQPの専用処理系であり, レジスタマシンである.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
213 MoarVMはNQPから与えられたMoarVMのバイトコードを実行する.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
214
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
215 MoarVMのバイトコードインタプリタはsrc/core/interp.cで定義されている.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
216 この中の関数MVM\_interp\_runで命令に応じた処理を実行する.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
217 関数内では命令列が保存されているcur\_op, 現在と次の命令を指し示すop, Threadの環境が保存されているThreadcontextなどの変数を利用する.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
218 命令実行は大きく二種類の動作があり, Cのgotoが利用できる場合はCode\ref{orig_macro}に示すMVM\_CGOTOフラグが立ちラベル遷移を利用する.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
219 goto文が利用できない場合は巨大なcase文として命令を実行する.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
220
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
221 ラベル遷移を利用する場合はCode\ref{oplabelsh}に示すラベルテーブルLABELSにアクセスし, テーブルに登録されているアドレスを取得し, マクロNEXTで遷移する.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
222 Code\ref{dispatch_c}に示すno\_opは何もせず次の命令に移動する為, goto NEXT;のみ記述されている.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
223
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
224 \lstinputlisting[label=orig_macro, caption=interp.cのマクロ部分]{./src/orig_macro.c}
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
225 \lstinputlisting[label=oplabelsh, caption=ラベルテーブルの一部分]{./src/oplabels.h}
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
226
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
227 \lstinputlisting[label=dispatch_c, caption=オリジナル版MoarVMのバイトコードディスパッチ]{./src/dispatch.c}
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
228
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
229 %interp.cでは命令コードのディスパッチはマクロを利用したcur\_opの計算及びラベルの遷移, もしくはマクロDISPATCHが展開するswitch文で行われていた.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
230 この為MoarVM内の命令コードに対応する処理は, 命令ディスパッチが書かれているCソースファイルの, 特定の場所のみに記述せざるを得ない.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
231 その為命令コードのモジュール化などが行えず, 1ファイル辺りの記述量が膨大になってしまう.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
232 また各命令コードに対応する処理は, ラベルジャンプもしくはswitch文に展開されてしまう為, Threaded Codeの実装を考えた場合, 大幅なコードの改修が要求される.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
233 デバッグ時には, Cレベルでのデバッグ時にはアドレスと実際に呼ばれる箇所を確認する事に手間がかかる.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
234
6
6dcf1143dc8f add about NQP
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
235 \subsection{NQP}
14
56f4ac0231ee tweak tex and add bibfile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
236
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
237 RakudoにおけるNQP\cite{nqp}は現在MoarVM, JVM上で動作する.
55
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
238 NQPはPerl6のサブセットであるため, 主な文法などはPerl6に準拠しているが幾つか異なる点が存在する.
62
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
239 NQPは最終的にはNQP自身でブートストラップする言語であるが, ビルドの最初にはすでに書かれたMoarVMのバイトコードを必要とする.
65
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
240 このMoarVMのバイトコードの状態をStage0と言う.%い, バイトコードが付随するソースディレクトリ内のディレクトリ名として設定されている.
55
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
241 Perl6の一部はNQPを拡張したもので書かれている為, Rakudoを動作させる為にはMoarVMなどのVM, VMに対応させる様にビルドしたNQPがそれぞれ必要となる.
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
242 現在のNQPではMoarVM, JVMに対応するStage0はそれぞれMoarVMのバイトコード, jarファイルが用意されている.
57
6f876697210c fix notation for MoarVMBytecode
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
243 MoarVMのModuleLoaderはStage0にあるMoarVMのバイトコードで書かれた一連のファイルが該当する.
9
8e80522a88bd tweek mindmap and wrote table of contents for Paper
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
244
34
f01d5bc55dea tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
245
55
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
246 Stage0にあるファイルをMoarVMに与えることで, NQPのインタプリタが実行される様になっている.
57
6f876697210c fix notation for MoarVMBytecode
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
247 これはStage0の一連のファイルは, MoarVMのバイトコードなどで記述されたNQPコンパイラのモジュールである為である.
55
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
248 NQPのインタプリタはセルフビルドが完了すると, nqpというシェルスクリプトとして提供される.
68
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 67
diff changeset
249 このシェルスクリプトは, ライブラリパスなどを設定してMoarVMの実行バイナリであるmoarを起動するものである.
53
27cb6c89b7d2 fix about returned comment
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
250 %NQPは6modelと呼ばれるオブジェクトモデルを採用としている.%が, これを構築する為に必要なNQPCORE,正規表現系のQRegex,MoarVMのModuleLoaderなどがMoarVMBytecodeで記述されている.これらMoarVMBytecodeの拡張子は.MoarVMである.
27cb6c89b7d2 fix about returned comment
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
251 %MoarVMに対してStage0のディレクトリにライブラリパスを設定し, nqp.MoarVMを実行させることでnqpの対話型環境が起動する.
9
8e80522a88bd tweek mindmap and wrote table of contents for Paper
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
252
23
7689b70a1a79 create stagenqp.pdf and tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
253 \begin{figure}[ht]
7689b70a1a79 create stagenqp.pdf and tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
254 \begin{center}
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
255 \includegraphics[width=70mm]{fig/tgraph.pdf}
23
7689b70a1a79 create stagenqp.pdf and tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
256 \end{center}
7689b70a1a79 create stagenqp.pdf and tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
257 \caption{NQPのビルドフロー}
7689b70a1a79 create stagenqp.pdf and tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
258 \label{fig:nqpbuild}
7689b70a1a79 create stagenqp.pdf and tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
259 \end{figure}
5
06f3183ef6c3 add about Perl6
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
260
38
7d9b01a98b9a update about moarvm bytecodes
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
261 NQPのビルドフローを図\ref{fig:nqpbuild}に示す.
76
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 75
diff changeset
262 RakudoによるPerl6に処理系はNQPにおけるnqpと同様に, moarにライブラリパスなどを設定したperl6というシェルスクリプトである.
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
263 このperl6を動かすためにはself buildしたNQPコンパイラが必要となる.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
264 その為にStage0を利用してStage1をビルドしNQPコンパイラを作成する.
58
8e5e2521d1db insert space after ,
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
265 Stage1は中間的な出力であり, 生成されたNQPファイルはStage2と同一であるが, MoarVMのバイトコードが異なる.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
266 Perl6では完全なセルフコンパイルを実行したNQPが要求される為, Stage1を利用してもう一度ビルドを行いStage2を作成する.
34
f01d5bc55dea tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
267
53
27cb6c89b7d2 fix about returned comment
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
268 Perl6のテストスイートであるRoast\cite{roast}やドキュメントなどによって設計が定まっているPerl6とは異なりNQP自身の設計は今後も変更になる可能性が開発者から公表されている.
34
f01d5bc55dea tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
269 現在の公表されているNQPのオペコードはNQPのリポジトリ\cite{nqpopcode}に記述されているものである.
f01d5bc55dea tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
270
f01d5bc55dea tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
271
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
272 %\subsection{Rakudo Perl6}
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
273 %Rakudo実装上におけるPerl6はRakudo Perl6と呼ばれているGitリポジトリで管理されているプログラムのことである.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
274 %前述した通りRakudo Perl6はPerl6のサブセットであるNQPを用いて記述されている.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
275 %従ってyaccやlexと言ったPerl5の文字解析, 構文解析に利用していたプログラムは利用せず, NQP側で構文定義などを行っている.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
276 %NQPはNQP自身でBootstrappingされている為, Rakudo Perl6のbuild時にはNQPの実行環境として要したVM, それに基づいてbuildしたNQPがそれぞれ必要となる.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
277 %
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
278 %
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
279 %
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
280 %\subsection{現在のPerl6}
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
281 %Perl6の言語仕様\cite{perl6design}とその時点での実装状況をまとめた公式ドキュメント\cite{perl6doc}は分離している.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
282 %従来は言語仕様は自然言語の仕様書であったが, 現在はテストスイートであるRoast\cite{roast}そのものと定義されている.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
283 %現在のPerl6の仕様を読む場合Roastを確認し, 現在Rakudo上に実装されている機能を見る場合は公式ドキュメントを確認する必要がある.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
284 %
43
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
285 \subsection{処理速度}
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
286 現在のPerl6が他のプログラミング言語と比較した場合どのような違いがでるのか計測した.
53
27cb6c89b7d2 fix about returned comment
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
287 macOSの/var/log/system.logファイルから正規表現でログ中のプログラムが書き込んだ回数を個別に数え上げるというものである.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
288 今回はファイルを231Kと3GBの二種類用意し, どの様な違いが出るのか測定した.
43
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
289
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
290 測定した環境は次の通りである.
75
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
291 今回は現在広く使用されているスクリプト言語であるPerl5を計測対象に追加した.
74
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 72
diff changeset
292 またRakudoの処理系による処理時間の差を計測する為にMoarVM, JVMに構築したPerl6の処理速度を計測を行った.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 72
diff changeset
293 JVM自体の処理時間とRakudoを構築したJVMの速度の差を見るために, 同様のプログラムをJava10でも行った.
43
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
294
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
295 \begin{itemize}
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
296 \item Perl6 (MoarVM) ver.2018.04.01
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
297 \item Perl6 (JVM) 2018.06-163-g612d071b8 built on JVM
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
298 \item Java 10
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
299 \item Perl5
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
300 \end{itemize}
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
301
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
302 測定した結果を表\ref{tbl001}に示す. 測定結果の単位は秒である.
43
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
303
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
304 \begin{table}[htb]
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
305 \begin{tabular}{|l|c|c|c|c|c|} \hline
75
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
306 FileSize & MoarVM & Perl6 on JVM & Java & Perl5\\ \hline
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
307 231K & 0.86 & 21.48 & 0.27 & 0.04 \\
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
308 3G & 2331.08 & 1665.56 & 48.85 & 41.35\\ \hline
43
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
309 \end{tabular}
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
310 \caption{ログファイル処理時間の計測結果}\label{tbl001}
43
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
311 \end{table}
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
312
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
313 計測結果からファイルサイズが小さい場合はMoarVMよりJVMに乗せたPerl6が低速であるが, ファイルサイズが大きい場合はJavaのJITが働くためMoarVMより高速に動いていると推測できる.
43
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
314
74
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 72
diff changeset
315
43
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
316 %# 計測(3GB)
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
317
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
318 %* Perl5c
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
319 % * 41.35s
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
320 %* Ruby
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
321 % * 574.52s
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
322 %* Python
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
323 % * 101.16s
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
324 %* Java
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
325 % * 48.85s
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
326 %* Perl6(Moar)
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
327 % * 2331.08s
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
328 %* Perl6(JVM)
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
329 % * 1665.56s
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
330
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
331 %# 参考(231K)
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
332
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
333 %* Perl5
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
334 % * 0.04s
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
335 %* Ruby
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
336 % * 0.15s
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
337 %* Python
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
338 % * 0.06s
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
339 %* Java
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
340 % * 0.27s
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
341 %* Perl6(Moar)
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
342 % * 0.86s
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
343 %* Perl6(JVM)
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
344 % * 21.48s
f4d4cbf62aea add detail
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
345
9
8e80522a88bd tweek mindmap and wrote table of contents for Paper
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
346
10
9c172999d70e tweak Papers for CbC abstract
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
347 \section{CbCによるMoarVM}
13
80944267f9c7 tweak tex and mv footnote sites
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
348 この章では改良を行ったPerl6処理系であるMoarVMについて述べる.
68
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 67
diff changeset
349 今回改良を行ったMoarVMは2018.04.01であり, 利用したNQPは2018.04-3-g45ab6e3バージョンである.
15
8580ad6c50dd tweak .tex and bib
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
350 \subsection{方針}
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
351 %Rakudo処理系の処理速度はNQPコンパイラ側の処理速度, 実行環境であるMoarVMなどのVM環境の主に2種類が影響していると考えられる.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
352 %NQP側はNQPで書かれている為, NQPの記述を修正すれば高速化することも考えられるが, 今回はVM側の処理系に着目した.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
353 %Rakudoが動作するVMは複数存在するが, MoarVMが現在主流の処理系である.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
354 %MoarVM自身はCで記述されているため, CbCを導入する事が可能である.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
355 %CbCの持つCodeGearや軽量継続を導入する事で, 通常のMoarVMと比較してよりきめ細やかな実装が出来ると推測される.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
356 %CodeGearをThreadedCodeなどに応用する事で, MoarVMの高速化が見込める.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
357 %また, CbCに関する今までの研究においては, CbCを言語処理系に応用した例が少ない為, CbCを言語処理系に適応した場合の挙動などを確認したい.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
358 %その為, 本稿ではCbCをMoarVMに導入したCbCMoarVMを実装する.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
359 %
74
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 72
diff changeset
360
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
361 MoarVMの中心は, バイトコードを解釈する, バイトコードインタプリタ部分である.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
362 その為CbCを用いて, MoarVMのバイトコードインタプリタ部分を記述し直し, CbCMoarVMとして実装する.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
363 CbCのCodeGearはコンパイラの基本ブロックに該当する.
44
571f6ffcccf8 mv CodeSegment to CodeGear and Datasegment to Datagear
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
364 従ってMoarVMにおける基本ブロックの箇所をCodeGearに書き換える事が可能である.
17
b2a795a294c4 update Moarvm bytecodes and perlcc
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
365
57
6f876697210c fix notation for MoarVMBytecode
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
366 \subsection{MoarVMのバイトコードのディスパッチ}
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
367 %MoarVMのバイトコードインタプリタはsrc/core/interp.cで定義されている.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
368 %この中の関数MVM\_interp\_runで命令に応じた処理を実行する.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
369 %関数内では命令列が保存されているcur\_op, 現在と次の命令を指し示すop, Threadの環境が保存されているThreadcontextなどの変数を利用する.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
370 %命令実行は大きく二種類の動作があり, Cのgotoが利用できる場合はCode\ref{orig_macro}に示すMVM\_CGOTOフラグが立ちラベル遷移を利用する.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
371 %それ以外の場合は巨大なcase文として命令を実行する.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
372 %
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
373 %ラベル遷移を利用する場合はCode\ref{oplabelsh}に示すラベルテーブルLABELSにアクセスし, テーブルに登録されているアドレスを取得し, マクロNEXTで遷移する.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
374 %Code\ref{dispatch_c}に示すno\_opは何もせず次の命令に移動する為, goto NEXT;のみ記述されている.
39
e216aa15e656 update cbc_next
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
375
78
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
376 %このラベルテーブルの中身はラベルが変換されたアドレスであるため, 実際に呼ばれている命令コードの名前はデバッガレベルでは確認できない.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
377 %巨大なcase文として実行された場合, 実行時間が遅いだけでなく, ラベル遷移と共存させて記述を行っている為Cのソースコードにおける可読性も低下する.
17
b2a795a294c4 update Moarvm bytecodes and perlcc
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
378
39
e216aa15e656 update cbc_next
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
379
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
380 %\lstinputlisting[label=orig_macro, caption=interp.cのマクロ部分]{./src/orig_macro.c}
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
381 %\lstinputlisting[label=oplabelsh, caption=ラベルテーブルの一部分]{./src/oplabels.h}
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
382 %
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
383 %\lstinputlisting[label=dispatch_c, caption=オリジナル版MoarVMのバイトコードディスパッチ]{./src/dispatch.c}
39
e216aa15e656 update cbc_next
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
384
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
385 interp.cでは命令コードのディスパッチはマクロを利用したcur\_opの計算及びラベルの遷移, もしくはマクロDISPATCHが展開するswitch文で行われていた.
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
386 このディスパッチ方法では, ラベルジャンプや巨大なcase文として記述する必要があり, ファイルが冗長になるなどの問題が生じる.
78
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
387
61
db9c52b9c219 add detail moarvm problem
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
388 CbCMoarVMではこの問題を解決するために, それぞれの命令に対応するCodeGearを作成し, 各CodeGearの名前を要素として持つCbCのCodeGearのテーブルを作成した.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
389 このCodeGearのテーブルを参照するCodeGearはcbc\_nextであり, この中のマクロNEXTはinterp.cのマクロNEXTをCbC用に書き直したものである.
39
e216aa15e656 update cbc_next
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
390
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
391 \lstinputlisting[label=cbc_dispatch_c, caption=CbCMoarVMのバイトコードディスパッチ]{./src/cbc-interp-next.cbc}
17
b2a795a294c4 update Moarvm bytecodes and perlcc
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
392
54
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 53
diff changeset
393
70
bb09f3bd682f add detail interp structure
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 69
diff changeset
394 Code\ref{cbc_dispatch_c}に示す変更例では, マクロNEXTなどの引数に変数iを導入している.
bb09f3bd682f add detail interp structure
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 69
diff changeset
395 このiとは, バイトコードインタプリタ内で利用するMoarVMのレジスタ情報などが,格納された, 構造体へのポインタである.
bb09f3bd682f add detail interp structure
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 69
diff changeset
396 iが示す構造体INTER,及びiの型であるポインタINTERPはCode\ref{interp}に示すように宣言している.
bb09f3bd682f add detail interp structure
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 69
diff changeset
397 これはマクロ内部で現在の命令を示すopや命令列cur\_opなどにアクセスする必要があるが, CbCのCodeGearを適応した場合に元のマクロの記述方法ではアクセスできない為に導入したものである.
bb09f3bd682f add detail interp structure
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 69
diff changeset
398 \lstinputlisting[label=interp, caption=MoarVMの情報を格納した構造体INTER]{./src/INTERP.h}
54
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 53
diff changeset
399
44
571f6ffcccf8 mv CodeSegment to CodeGear and Datasegment to Datagear
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
400 \subsection{命令実行箇所のCodeGearへの変換}
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
401 ラベルテーブルやcase文のswitch相当の命令実行箇所をCbCに変換し, CodeGearの遷移として利用する.
70
bb09f3bd682f add detail interp structure
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 69
diff changeset
402 interp.cはCode\ref{dispatch_c}に示す様にマクロOPを利用して記述されている.
39
e216aa15e656 update cbc_next
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
403
22
fb4c1b408c9f add sample codes and tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 21
diff changeset
404
70
bb09f3bd682f add detail interp structure
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 69
diff changeset
405 OP(.*)の.*に該当する箇所はバイトコードの名前である.通常このブロックにはLABELから遷移, またはswtich-caseによって分岐する為, バイトコードの名前は配列LABELSの添字に変換されている.
59
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
406 そのため対象となるCodeGearをLABELSの並びと対応させ, Code\ref{cbcoplabelsh}に示すCodeGearの配列CODESとして設定すればCodeGearの名前は問わない.
53
27cb6c89b7d2 fix about returned comment
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
407 今回はCodeGearである事を示す為に接頭辞としてcbc\_をつける.
17
b2a795a294c4 update Moarvm bytecodes and perlcc
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
408
49
933dbfa8f06f add oplabels
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
409 \lstinputlisting[label=cbcoplabelsh, caption=CodeGear配列の一部分]{./src/oplables-cbc-codes.h}
31
5b5fb929c67f update abotu MoarBM
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
410
83
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
411 Code\ref{cbc_codesegs_c}に示す命令の実行処理でMoarVMのレジスタであるreg\_baseや, 命令列cur\_opなどの情報を利用しているが, これらはMVM\_interp\_run内のローカル変数として利用している.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
412 ラベルを利用しているオリジナル版では同一関数内であるためアクセス可能であるが, CodeGear間の移動で命令を表現するCbCではアクセスできない.
70
bb09f3bd682f add detail interp structure
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 69
diff changeset
413 その為Code\ref{interp}に示す様に, インタプリタの情報を集約した構造体interを定義する.
bb09f3bd682f add detail interp structure
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 69
diff changeset
414 この構造体へのポインタであるINTERP型の変数iをCodeGearの入出力として与える.
44
571f6ffcccf8 mv CodeSegment to CodeGear and Datasegment to Datagear
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
415 CodeGear内ではINTERPを経由することでインタプリタの各種情報にアクセスする.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
416 CodeGear間の遷移ではレジスタの値の調整は行われない為, 入力引数を使ってレジスタマッピングを管理できる.
83
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
417 INTERPのメンバであるMoarVMのレジスタそのものをアーキテクチャのレジスタ上に乗せる事が可能となる.
27
df723be56106 add about INTERP section
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
418
44
571f6ffcccf8 mv CodeSegment to CodeGear and Datasegment to Datagear
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
419 命令実行中のCodeGearの遷移を図\ref{fig:perl6cbcinter}に示す.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
420 この中で実線で書かれている部分はCbCのgoto文で遷移し, 波線の箇所は通常のCの関数呼び出しとなっている.
22
fb4c1b408c9f add sample codes and tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 21
diff changeset
421
68
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 67
diff changeset
422 現在のCbCMoarVMは次の命令セットのディスパッチをcbc\_nextが行っている.
83
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
423 cbc\_nextから命令コードに対応するCodeGearに継続し, CodeGearからcbc\_nextに継続するサイクルが基本の流れである.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
424 CodeGear内からCの関数は問題なく呼ぶ事が可能であるため, Cの関数を利用する処理は変更せず記述する事ができる.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
425 また変換対象はswitch文であるため, breakせず次のcaseに移行した場合に対応するように別のCodeGearに継続し,その後cbc\_nextに継続するパターンも存在する.
27
df723be56106 add about INTERP section
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
426
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
427 \lstinputlisting[label=cbc_codesegs_c, caption=CbCMoarVMのバイトコードに対応するCodeGear]{./src/cbc_codesegs.cbc}
22
fb4c1b408c9f add sample codes and tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 21
diff changeset
428
20
2bf64cfb91b1 add CbC evaluation and CbCinterp fig
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
429 \begin{figure}[ht]
2bf64cfb91b1 add CbC evaluation and CbCinterp fig
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
430 \begin{center}
2bf64cfb91b1 add CbC evaluation and CbCinterp fig
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
431 \includegraphics[width=70mm]{fig/cbc_next.pdf}
2bf64cfb91b1 add CbC evaluation and CbCinterp fig
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
432 \end{center}
32
43e0cf46d40b add cbc_codesegs.cbc
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
433 \caption{CbCにおけるMoarVMバイトコードインタプリタ内の状態遷移}
22
fb4c1b408c9f add sample codes and tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 21
diff changeset
434 \label{fig:perl6cbcinter}
20
2bf64cfb91b1 add CbC evaluation and CbCinterp fig
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
435 \end{figure}
2bf64cfb91b1 add CbC evaluation and CbCinterp fig
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
436
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
437 バイトコードの数は膨大である為, すべてを手作業で変換する事は望ましくない.
74
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 72
diff changeset
438 従ってPerlScriptを用いてinterp.cからCbCのCodeGearを自動生成するスクリプトを作成した.
31
5b5fb929c67f update abotu MoarBM
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
439 このスクリプトでは以下の修正手続きを実行する.
5b5fb929c67f update abotu MoarBM
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
440
5b5fb929c67f update abotu MoarBM
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
441 \begin{itemize}
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
442 \item OP(.*)の.*部分をCodeGearの名前として, 先頭にcbc\_をつけた上で設定する.
31
5b5fb929c67f update abotu MoarBM
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
443 \item cur\_opなど構造体INTERのメンバ変数はポインタiから参照するように修正する
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
444 \item GC対策のためマクロMVMROOTを使い局所変数のポインタをスタックに積む箇所は, 局所変数をstatic化する
31
5b5fb929c67f update abotu MoarBM
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
445 \item 末尾のgoto NEXTをgoto cbc\_next(i)に修正する
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
446 \item case文で下のcase文に落ちている箇所は, case文に対応するCodeGearに遷移する様にgoto文を付け加える
31
5b5fb929c67f update abotu MoarBM
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
447 \end{itemize}
5b5fb929c67f update abotu MoarBM
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
448
5b5fb929c67f update abotu MoarBM
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
449
39
e216aa15e656 update cbc_next
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
450 上記Code\ref{cbc_codesegs_c}ではcbc\_const\_i8などがcase文の下のcase部分に該当するcbc\_const\_i64に遷移する様に変換されている.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
451 またcbc\_pushcompscではMVMROOTに局所変数scを渡している為, これをstaticで宣言し直している.
38
7d9b01a98b9a update about moarvm bytecodes
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
452
22
fb4c1b408c9f add sample codes and tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 21
diff changeset
453 現在CbCで記述されたOSであるGearsOSにはInterfaceが導入されている.
58
8e5e2521d1db insert space after ,
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
454 これはJavaのinterface, Haskellの型クラスに該当する概念であり, 次のCodeGearにInterface経由で継続する事が可能である.
64
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
455 Interfaceは現在のCbCMoarVMの実装には用いていないが, 今後ThreadedCodeの実装を行うにあたり命令コードディスパッチ箇所に導入を検討している.
31
5b5fb929c67f update abotu MoarBM
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
456
75
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
457
29
765dc5c49ae1 halfway add about test and debugging for MoarVM
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
458 \section{MoarVMのデバッグ}
765dc5c49ae1 halfway add about test and debugging for MoarVM
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
459
765dc5c49ae1 halfway add about test and debugging for MoarVM
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
460 MoarVM自体のデバッグはMoarVMのリポジトリにテストコードが付随していない為単体では実行不可能である.
78
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
461 また, CbCを用いて言語処理系の改良時を行う際に, 処理系のデバッグを行う場合は, CbCを用いないオリジナルの処理系との並列デバッグが必要となる.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
462 MoarVM自体にはデバッグを支援するツールが存在しない為, MoarVM自体のデバッグ方法や, CbCを用いた処理系との並列デバッグについて独自の手法を考案する必要がある.
74
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 72
diff changeset
463 本稿ではMoarVMのデバッグにおけるCデバッガの使用方法とMoarVMのテスト方法についても示す.
57
6f876697210c fix notation for MoarVMBytecode
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
464
6f876697210c fix notation for MoarVMBytecode
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
465 \subsection{MoarVMのバイトコードのデバッグ}
68
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 67
diff changeset
466 MoarVMの実行バイナリであるmoarに対して, MoarVMのバイトコードをdumpオプションを付けて読み込ませると, バイトコードがMoarVMによるアセンブリコードとして出力される.
65
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
467 しかしこれはMoarVMが実行したバイトコードのトレースではなく, MoarVMのバイトコードを変換したものに過ぎない.
57
6f876697210c fix notation for MoarVMBytecode
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
468 また, 明らかに異なる挙動を示すオリジナルのMoarVMと, CbCで書き換えたCbCMoarVM両者のmoarを利用しても同じ結果が返ってきてしまう.
6f876697210c fix notation for MoarVMBytecode
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
469 そのため今回のMoarVMのバイトコードインタプリタの実装のデバッグにはこの方法は適さない.
17
b2a795a294c4 update Moarvm bytecodes and perlcc
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
470 従って実際に実行した命令を確認するにはgdbなどのCデバッガを利用してMoarVMを直接トレースする必要がある.
25
7a2d604607d8 add debugging MoarVM
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
471
34
f01d5bc55dea tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
472 CbC側はCode\ref{cbc_b}に示す様にcbc\_nextにbreak pointを設定する.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
473 オリジナル側は次のオペコードの設定のマクロにダミーの関数を呼び出すように修正し, そこにbreak pointを設定する.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
474 CbC側ではCodeGearの名前をデバッガ上で直接確認できるが, オリジナル版はLABLEの配列の添え字から自分でどのオペコードに対応しているかをデバッガの外で探す必要がある.
25
7a2d604607d8 add debugging MoarVM
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
475
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
476 添字を確認するためにはCode\ref{orig_b}に示すようにオリジナルのMoarVMの場合cur\_opの値をMVMuint16のポインタでキャストし, これが指す値を出力する.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
477 break pointを掛けているダミー関数ではcur\_opにアクセスする事が出来ない為, スタックフレームを一つupする必要がある.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
478 \lstinputlisting[label=cbc_b, caption=CbCMoarVMに対してのbreak point設定]{./src/cbc_breakpoint.txt}
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
479 \lstinputlisting[label=orig_b, caption=オリジナル版MoarVMに対してのbreak point設定]{./src/origin_b_set.txt}
20
2bf64cfb91b1 add CbC evaluation and CbCinterp fig
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
480
17
b2a795a294c4 update Moarvm bytecodes and perlcc
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
481
b2a795a294c4 update Moarvm bytecodes and perlcc
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
482 \subsection{MoarVMの並列デバッグ手法}
b2a795a294c4 update Moarvm bytecodes and perlcc
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
483 しかしMoarVMが実行する命令は膨大な数がある.
68
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 67
diff changeset
484 その為gdbなどのCデバッガで, オリジナルのMoarVMと, 一部をCbCで記述したCbCMoarVMの並列デバッグを手動で全て行うことは困難である.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
485 Perlなどのスクリプトを用いて自動的に解析したいため, ログを残す為にscriptコマンドを実行した状態でgdbを起動する.
59
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
486 トレースでは実行した命令名のみ取得できれば良い為, Code\ref{cbc_b}, \ref{orig_b}でbreak pointにcommandとして設定している様に,設定されたcur\_opの値を出力し続けるのみの動きを導入する.
25
7a2d604607d8 add debugging MoarVM
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
487
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
488 実際に実行したログ・ファイルの一部をそれぞれCode\ref{debug_origmoar}, \ref{debug_cbcmoar}に示す.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
489 \lstinputlisting[label=debug_origmoar, caption=オリジナル版MoarVMのバイトコードのトレース]{./src/origin_breakpoint.txt}
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
490 \lstinputlisting[label=debug_cbcmoar, caption=CbCMoarVMのバイトコードのトレース]{./src/trace_cbc.txt}
25
7a2d604607d8 add debugging MoarVM
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
491
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
492 オリジナル版では実際に実行する命令処理はラベルに変換されてしまう為名前をデバッガ上では出力できないが, CbCでは出力する事が可能である.
58
8e5e2521d1db insert space after ,
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
493 CbCとオリジナルのCODES, LABELの添字は対応している為, ログの解析を行う際はそれぞれの添字を抽出し違いが発生している箇所を探索する.
50
619edd118aab add about test
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
494 これらはscriptコマンドが作成したログを元に異なる箇所を発見するスクリプトを用意し自動化する.(Code \ref{logs2})
619edd118aab add about test
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
495 \lstinputlisting[label=logs2, caption=バイトコードの差分検知の一部分]{./src/logs2.txt}
25
7a2d604607d8 add debugging MoarVM
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
496
58
8e5e2521d1db insert space after ,
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
497 違いが生じている箇所が発見できた場合, その前後のCodeGear及びディスパッチ部分にbreak pointをかけ, それぞれの変数の挙動を比較する.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
498 主にcbc\_return系の命令が実行されている場合は, その直前で命令を切り替えるcbc\_invoke系統の命令が呼ばれているが,この周辺で何かしらの違いが発生している可能性が高い.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
499 また主に次のCodeGearに遷移する際にCbCコンパイラのバグが生じている可能性もある為, アセンブラレベルの命令を確認しながらデバッグを進めることとなる.
19
3e4ffa621ae9 add after work
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
500
47
6fc015dd380b fix fig lines
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
501 \subsection{MoarVMのテスト方法}
17
b2a795a294c4 update Moarvm bytecodes and perlcc
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
502
47
6fc015dd380b fix fig lines
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
503 MoarVMは単体で実行する事が不可能である.
69
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 68
diff changeset
504 またNQPのリポジトリに付随するテストはNQPで書かれている.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 68
diff changeset
505 従ってNQPを解釈可能な, NQPのセルフビルド時に生成されるシェルスクリプトnqpが必要である.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 68
diff changeset
506 その為, シェルスクリプトnqpを生成出来ない場合, MoarVMのテストを行う事が出来ない.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 68
diff changeset
507 CbCMoarVMはNQPのセルフビルドが現時点では達成出来ない為, 通常ではテストが実行出来ない.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 68
diff changeset
508 しかし, MoarVMのバイナリmoarはMoarVMのバイトコードを読み込むことはNQPをセルフビルドしなくとも可能である.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 68
diff changeset
509
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 68
diff changeset
510 その為, 正常に動作しているMoarVMのバイナリmoarとnqpを用意し, このnqp側からMoarVMのバイトコードにNQPで記述されたテストを変換する.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 68
diff changeset
511 変換されたMoarVMのバイトコードはバイナリmoarに渡す事で実行可能であり, テストを行う事が出来る.
17
b2a795a294c4 update Moarvm bytecodes and perlcc
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
512
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
513 %\subsection{CbCコンパイラによるバグ}
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
514 %これまでのCbCに関する研究においては, 複数個の入出力をCodeGearに与えるユースケースで利用していた.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
515 %CbCコンパイラ自身はそれぞれ用意したテストスイートを通化するものの, MoarVMの様な巨大なプロジェクトのCodeGearをコンパイルを実行する場合, 予期せぬバグが発生した.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
516 %主にCodeGear間のgotoにおけるtail callフラグの除去や, DataGearとして渡している構造体の変数のアドレスがスタックポインタの値より上位に来てしまい, 通常のCの関数をcallした際にローカル変数の領域がDataGearのアドレスの周辺を利用してしまう.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
517 %その為DataGearの構造体の値が書き換わり, CからDataGearにreturnした際にDataGearの構造体が破壊されるバグである.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
518 %このバグは先程の並列デバッグを行いながらプログラムカウンタや変数の動きをトレースする事などで発見することが出来る.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
519 %現状ではCbCコンパイラがプログラマの意図と反する挙動を取るためCbCコンパイラのバグを回避するプログラミングが要求されている.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
520 %本来コンパイラ側のバグを回避するプログラミングをプログラマに要求する事は好ましくない.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
521 %従ってCbCコンパイラ自身の信頼性を向上させる事も今後の課題となっている.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
522 %
74
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 72
diff changeset
523
16
ed882dba29f6 add about threaded code and jlisting.sty
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
524
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
525 \section{CbCMoarVMの利点と欠点}
20
2bf64cfb91b1 add CbC evaluation and CbCinterp fig
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
526 MoarVMの様な巨大なスクリプト言語処理系にCbCを適応した所現在までに複数の利点と欠点が発見された.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
527 本章ではまず利点を述べ, 次に現段階でのCbCを適応した場合の欠点について考察する.
20
2bf64cfb91b1 add CbC evaluation and CbCinterp fig
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
528
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
529
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
530 オリジナルのMoarVMでは命令コードに対応する箇所はラベルジャンプ, もしくはswitch文で実装されていた.
20
2bf64cfb91b1 add CbC evaluation and CbCinterp fig
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
531 その為同じCファイルに命令コードの実行の定義が存在しなければならない.
2bf64cfb91b1 add CbC evaluation and CbCinterp fig
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
532 今後MoarVMに新たなバイトコードが導入されていく事を考えるとinterp.cが巨大になる可能性がある.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
533 関数単位での処理の比重が偏る事に加え,
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
534 switch文中に書かれている処理は他の関数から呼ぶ事が出来ないため, 余計な手間がかかる箇所が発生すると考えられる.
2
a758898008e6 add tex and Makefile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
535
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
536
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
537 CbCMoarVMの場合, CodeGearとして基本ブロックを記述出来る為オリジナルのMoarVMの様にswtich文のブロック中に書く必要性が無くなる.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
538 その為類似する命令系をコード分割し, モジュール化する事が可能である.
29
765dc5c49ae1 halfway add about test and debugging for MoarVM
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
539 またCbCはgoto文で遷移する以外は通常のCの関数と同じ扱いをする事が可能である.
44
571f6ffcccf8 mv CodeSegment to CodeGear and Datasegment to Datagear
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
540 従ってCodeGear内部の処理を別の箇所から使用する事も可能となる為再利用性も向上する.
29
765dc5c49ae1 halfway add about test and debugging for MoarVM
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
541
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
542
58
8e5e2521d1db insert space after ,
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
543 ThrededCodeを実装する場合, 通常命令ディスパッチの箇所と, 実際に実行される命令処理を大幅に変更しなければならない.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
544 CbCを用いた実装の場合, 命令処理はただのCodeGearの集合である.
44
571f6ffcccf8 mv CodeSegment to CodeGear and Datasegment to Datagear
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
545 その為CodeGearをThrededCodeに対応した並びとして選択する事ができれば命令処理部分の修正をほぼせずにThrededCodeを実現する事が可能である.
29
765dc5c49ae1 halfway add about test and debugging for MoarVM
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
546
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
547 またCodeGearはバイトコードレベルと同じ扱いができるため, ThrededCodeそのものを分離して最適化をかける事が可能である.
44
571f6ffcccf8 mv CodeSegment to CodeGear and Datasegment to Datagear
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
548 これもCodeGearが関数単位として分離できる事からの利点である.
29
765dc5c49ae1 halfway add about test and debugging for MoarVM
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
549
2
a758898008e6 add tex and Makefile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
550
20
2bf64cfb91b1 add CbC evaluation and CbCinterp fig
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
551 MoarVMのバイトコードインタプリタの箇所はオリジナルの実装ではラベルジャンプを用いて実装されている.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
552 その為, 直接ラベルにbreak pointをかける事が出来ない.
59
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
553 作業者がデバッガが読み込んでいるCソースコードの位置を把握し, 行番号を指定してbreak pointを設定する必要があった.
20
2bf64cfb91b1 add CbC evaluation and CbCinterp fig
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
554
59
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
555 CbCMoarVMの場合, CodeGear単位でバイトコードの処理単位を記述している為, 通常の関数と同じく直接CodeGearにbreak pointをかける事が可能である.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
556 これはCプログラミングの関数に対してのデバッグで, 状態ごとにbreak pointをかける事が出来ることを意味する.
20
2bf64cfb91b1 add CbC evaluation and CbCinterp fig
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
557 通常のC言語で言語処理系を実装した場合と比較して扱いやすくなっていると言える.
58
8e5e2521d1db insert space after ,
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
558 さらにラベルテーブルでの管理の場合, 次のバイトコード箇所は数値でしか確認できず, 実際にどこに飛ぶのかはラベルテーブル内と数値を作業者が手作業で確認する必要があった.
20
2bf64cfb91b1 add CbC evaluation and CbCinterp fig
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
559 スクリプトなどを組めば効率化は出来るがデバッガ上で完結しない為手間がかかる.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
560 CbC実装ではCODESテーブル内は次のCodeGearの名前が入っている為, 数値からCodeGearの名前をデバッガ上で確認する事が出来る
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
561
31
5b5fb929c67f update abotu MoarBM
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
562
5b5fb929c67f update abotu MoarBM
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
563 現在MoarVMはLuaJit\cite{luajit}を搭載しJITコンパイルを行っている.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
564 LuaJITそのものをCbCに適応させるわけではないが, CbCのABIにJITされたコードを合わせる事が可能であると推測できる.
9
8e80522a88bd tweek mindmap and wrote table of contents for Paper
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
565 % \subsection{単純なループ処理の測定}
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
566 % 簡単な例題としてfor文を用いて100000回ループさせ, ある変数をインクリメントするというプログラムを作成する.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
567 % 今回の評価対象としてPerl6は2018年4月にリリースされたMoarVM, NQP,Rakudoの実装を用いる.
9
8e80522a88bd tweek mindmap and wrote table of contents for Paper
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
568 % Perl5は5.26.2を利用した.
20
2bf64cfb91b1 add CbC evaluation and CbCinterp fig
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
569
9
8e80522a88bd tweek mindmap and wrote table of contents for Paper
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
570 % \begin{table}[htb]
8e80522a88bd tweek mindmap and wrote table of contents for Paper
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
571 % \begin{tabular}{|c|c|c|} \hline
8e80522a88bd tweek mindmap and wrote table of contents for Paper
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
572 % ループ回数 & Perl5 (sec) & Perl6(sec) \\ \hline \hline
8e80522a88bd tweek mindmap and wrote table of contents for Paper
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
573 % 1000000 & 0.131 & 1.444 \\ \hline
8e80522a88bd tweek mindmap and wrote table of contents for Paper
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
574 % 10000000 & 0.131 & 1.444 \\ \hline
8e80522a88bd tweek mindmap and wrote table of contents for Paper
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
575 % 100000000 & 3.258 & 124.69 \\ \hline
8e80522a88bd tweek mindmap and wrote table of contents for Paper
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
576 % \end{tabular}
8e80522a88bd tweek mindmap and wrote table of contents for Paper
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
577 % \end{table}
77
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 76
diff changeset
578 しかし, 言語処理系は広く使われる為に著名なOSSなどを利用して開発するのが望ましいが, CbCプロジェクトの認知度が低いという現状がある.
29
765dc5c49ae1 halfway add about test and debugging for MoarVM
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
579
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
580 また, CbCコンパイラが現在非常にバグを発生させやすい状態になっている.
77
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 76
diff changeset
581 CbCコンパイラはgccとllvm/clang上に実装している為, これらのアップデートに追従する必要がある.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
582 しかしコンパイラのバージョンに応じてCbCで利用するコンパイラ内のAPIが異なる場合が多く, APIの変更に伴う修正作業などを行う必要がある.
20
2bf64cfb91b1 add CbC evaluation and CbCinterp fig
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
583
58
8e5e2521d1db insert space after ,
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
584 CbCMoarVMではCからCodeGearへ, CodeGearからCへの遷移などが複数回繰り返されているが, この処理中のCodeGearでのtail callの強制が非常に難関である.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
585 tail callの強制には関数定義の箇所や引数, スタック領域のサイズ修正などを行う必要がある.
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
586 現在のCbCコンパイラのバグではCodeGear内部での不要なスタック操作命令を完全に排除しきれていない.
20
2bf64cfb91b1 add CbC evaluation and CbCinterp fig
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
587
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
588 またCodeGearからCに帰る場合, 環境付き継続を行う必要がある.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
589 Cの関数の末尾でCodeGearを呼び出している場合など環境付き継続を使用しなくても良いケースは存在するが, 頻繁にCとCbCを行き来する場合記述が冗長になる可能性はある.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
590
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
591 \section{Threaded Code}
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
592 現在のMoarVMは次の命令をバイトコードからディスパッチし決定後, ラベルジャンプを利用し実行している.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
593 この処理ではディスパッチの箇所にコストが掛かってしまう.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
594 CbCをMoarVMに導入することで, バイトコード列を直接サブルーチンコールの列に置き換えてしまう事が可能である.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
595 これはCbCが基本ブロックの単位と対応している為である.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
596 CbCでは現在ディスパッチを行うCodeGearであるcbc\_nextを利用しているが, Threaded Codeを実装するにあたり,
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
597 cbc\_nextと次のCodeGearに直接遷移するcbc\_fixt\_nextの実装を予定している.
9
8e80522a88bd tweek mindmap and wrote table of contents for Paper
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
598
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
599 また段階的に現在8バイト列を1命令コードとして使用しているが, これを16バイトなどに拡張し2命令を同時に扱えるように実装する事なども検討している.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
600
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
601 %CbCはCodeGearで末尾最適化(Tail call optimization)を行う.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
602 %これはCodeGearは必ず関数呼び出しではなくgotoで次の状態に遷移する為にスタック領域の操作が必要とならない為である.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
603 %現在のCbCコンパイラの実装ではCodeGearからCの関数に戻る場合は末尾最適化を切り, CodeSegment間の遷移では末尾最適化が行われる.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
604 %末尾最適化を応用することでContinuation-passingスタイルのThreaded Codeの実装が可能となる.\cite{threadedcode}
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
605 %またCodeGear自体を直接次の遷移先として設定することも可能であるため, CbCならThrededCodeを実装するアプローチが複数検討出来る.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
606
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
607 %現在のCbCMoarVMは次の命令セットのディスパッチをcbc\_nextというCodeGearで処理している.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
608 %これは元のMoarVMの命令ディスパッチで行われる現在のオペコードを示すcur\_opと命令列opの操作及び次のラベルに遷移するマクロに該当する.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
609 %CbCMoarVMではラベルに対しての遷移の代わりにMoarVMの命令のCodeGearの集合体である配列CODESにアクセスし, その要素であるCodeSegmentに対して遷移する形を取っている.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
610 %この一連の処理がオーバーヘッドになる為, 今後はcbc\_fixt\_nextというCodeGearを導入し直接次の命令に該当するCodeSegmentへgotoする様に実装する予定である.
2
a758898008e6 add tex and Makefile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
611
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
612 Perl5においてはperlccというモジュールが開発されている.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
613 これはPerl5内部で利用しているPerlバイトコードを, PerlのC APIであるXS言語の様なCのソースファイルに埋め込み,それをCコンパイルでコンパイルするというものである.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
614 perlccを利用することでPerlインタプリタが無い状況でも可動するバイナリファイルを作成する事が可能である.
59
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
615 しかしperlccはPerlスクリプトが複雑になるほど正確にCに移植を行う事が出来ず, 現在ではPerlのコアモジュールから外されている.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
616 perlccはPerlのバイトコードをCへの変換のみ行う為, Cで実装されているPerl経由で実行した場合と処理速度はほぼ変わらない.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
617 またperlccで生成されたCのソースコードは難解であり, これをデバッグするのが困難でもある.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
618 MoarVMでthreaded codeを実現出来た場合, その箇所のみCbCプログラムとして切り出す事が可能である為perlccと似たツールを作成することも可能である.
76
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 75
diff changeset
619 C言語でもperlccの様に内部構造をCの関数化すればThrededCodeの様な物を構築できるが, CbCと比較して処理の単位が明確ではない為高速化は見込めない.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 75
diff changeset
620 また, CbCのCodeGearは基本ブロックそのものである為, CbCプログラムとして切り出す場合, CodeGearをそのまま出力すればよく, 生成されたCbCプログラム自体もperlccと比較して扱いやすい.
59
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
621 CbCを用いたThrededCodeでperlccの様なツールを作成した場合, CodeGearの単位が正常に機能すればCbCのCodeGearがThrededCodeをより効率化出来ると推測できる.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
622
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
623
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
624 CbCのCodeGearはgoto文で遷移するため, 次のCodeGearが一意に決定している場合Cコンパイラ側でインライン展開する事が可能である.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
625 CodeGearがインライン展開される限界については別途研究する必要があるが, CbCを利用した場合CodeGear単位でインライン展開が可能である.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
626 その為, ThrededCodeを実装する場合に決定した次のCodeGearをインライン展開する事が可能である.
63
98f4d19f474d fix typo
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
627 従ってThreadedCodeを実現するにあたり新たな処理系を開発する必要がなく, 既存の資源を利用してThreadedCodeが実現出来る.
59
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
628 これを繰り返す事でperlccなどと比較してより高速化したThrededCodeが実現できる.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
629
80
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 79
diff changeset
630 CbCを使わずにバイトコードディスパッチの箇所を改良する際に, 関数ポインタを利用する場合も考えられる.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 79
diff changeset
631 この場合は, 関数ポインタの配列を作成し, 次の命令コードに対応する関数をポインタ経由で実行する.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 79
diff changeset
632 Cの関数ポインタを利用した場合, CbCと同様に処理のモジュール化は可能である.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 79
diff changeset
633 しかし, CbCとは違い軽量継続ではなく関数呼び出しで処理をする為, Cのスタックフレームが非常に巨大になる.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 79
diff changeset
634 Cの関数呼び出しのコストから, 通常のcase文やラベルジャンプを利用した場合と速度差的に優位にならない.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 79
diff changeset
635 また, ThreadedCodeの観点では, 命令列に対応した関数をThreadedCode用に大幅に修正する必要がある.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 79
diff changeset
636 その為, CbCの様に関数そのものの並びでThreadedCodeに対応させることは出来ない.
19
3e4ffa621ae9 add after work
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
637
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
638 \section{まとめ}
74
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 72
diff changeset
639 本稿ではCbCによってPerl6の処理系であるMoarVMインタプリタの一部改良とその手法を示した.
68
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 67
diff changeset
640 CbCMoarVMではオリジナルのMoarVMと比較して以下の様な利点が見られた.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
641
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
642 \begin{itemize}
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
643 \item CodeGear単位で命令処理を記述する事が可能となり, モジュール化が可能となった.
68
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 67
diff changeset
644 \item ThreadedCodeを実装する際に効率的に実装ができる見込みが立った.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 67
diff changeset
645 \item CodeGearを導入した命令単位での最適化が可能となった.
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 67
diff changeset
646 \item break pointを命令の処理単位でかける事が可能となった.
72
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 71
diff changeset
647 \item 現在は命令処理部分をCodeGearに書き換えたのみである為, ラベルを利用した場合と比較して速度としては同等である.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
648 \end{itemize}
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
649
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
650 今後CbCでの開発をより深く行っていくにあたり, CbCコンパイラそのものの信頼性を向上させる必要がある.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
651 MoarVMの開発を行うにあたり新たに発見された複数のバグを修正し, より安定するコンパイラにする為に改良を行う.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
652
81
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
653 現在CbCMoarVMで直接バイトコードを入力した場合のNQPのテストはJVMなどのテストを除く中で80\%パスする.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
654 また数値の計算と出力などの簡単なNQPの例題を作成し, オリジナルのNQP,MoarVMでバイトコード化したものを入力した際も正常に動作している.
42
1abd6fc0abe8 add detail environment
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
655 しかしNQPのセルフビルドは現在オブジェクトの生成に一部失敗している為成功していない.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
656 今後はさらに複雑な例題やNQPのセルフビルド, Perl6の動作を行っていく.
19
3e4ffa621ae9 add after work
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
657
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
658 MoarVMではGCからオブジェクトを守る為にMVMROOTというマクロを利用し, 局所変数のポインタをスタックに登録する処理を行っている.
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
659 GCの制御を効率的に行えば本来は必要ない処理であり, 実行するとCodeGearの優位性が損なわれてしまう.
19
3e4ffa621ae9 add after work
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
660 従ってMoarVMのGCの最適化を行う.
3e4ffa621ae9 add after work
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
661
58
8e5e2521d1db insert space after ,
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
662 また高速化という面では, Perlの特徴である正規表現に着目し, 正規表現の表現のみ高速で動く最適化の導入なども検討している.
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
663 他にrakudoのコンパイラ系統からCbCのコードを直接生成させ, それをllvmでコンパイルすることによってLLVMの最適化フェーズを得て
32
43e0cf46d40b add cbc_codesegs.cbc
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
664 高速化することも可能であると推測できる.
19
3e4ffa621ae9 add after work
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
665
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
666 Perl6の開発は非常に活発に行われている為, CbCMoarVMの最新版の追従も課題となっている.
44
571f6ffcccf8 mv CodeSegment to CodeGear and Datasegment to Datagear
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
667 現在はinterp.cからPerlスクリプトを用いて自動でCbCのCodeGearを生成している.
23
7689b70a1a79 create stagenqp.pdf and tweak tex
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
668 今後の開発領域の拡大と共により効率的にCbCコードへの自動変換も複数のCコードに対応する様に開発を行っていく.
2
a758898008e6 add tex and Makefile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
669
9
8e80522a88bd tweek mindmap and wrote table of contents for Paper
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
670 %å\subsection{MoarVMの処理流れ}
48
443de29ac349 fix section names
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
671 %MoarVMはC言語で実装されており, Perl5で記述されたConfigure.plを
9
8e80522a88bd tweek mindmap and wrote table of contents for Paper
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
672
2
a758898008e6 add tex and Makefile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
673
a758898008e6 add tex and Makefile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
674 % BibTeX を使用する場合 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11
ea10413281c5 tweak Makefile and create reference.bib
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
675 \nocite{*}
51
baba702fb22b fix typo
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 50
diff changeset
676 \bibliographystyle{ipsjsort}
baba702fb22b fix typo
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 50
diff changeset
677 \bibliography{reference}
2
a758898008e6 add tex and Makefile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
678
a758898008e6 add tex and Makefile
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
679 \end{document}