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