comparison Paper/anatofuz.tex @ 53:27cb6c89b7d2

fix about returned comment
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Sun, 18 Nov 2018 12:19:56 +0900
parents baba702fb22b
children b3982cc4b0dc
comparison
equal deleted inserted replaced
52:6d85ce7522ad 53:27cb6c89b7d2
9 \usepackage{listings} 9 \usepackage{listings}
10 \lstset{ 10 \lstset{
11 language=C, 11 language=C,
12 tabsize=2, 12 tabsize=2,
13 frame=single, 13 frame=single,
14 basicstyle={\ttfamily\footnotesize}, % 14 basicstyle={\tt\footnotesize}, %
15 identifierstyle={\footnotesize}, % 15 identifierstyle={\footnotesize}, %
16 commentstyle={\footnotesize\itshape}, % 16 commentstyle={\footnotesize\itshape}, %
17 keywordstyle={\footnotesize\bfseries}, % 17 keywordstyle={\footnotesize\bfseries}, %
18 ndkeywordstyle={\footnotesize}, % 18 ndkeywordstyle={\footnotesize}, %
19 stringstyle={\footnotesize\ttfamily}, 19 stringstyle={\footnotesize\ttfamily},
45 45
46 %概要 46 %概要
47 \begin{abstract} 47 \begin{abstract}
48 スクリプト言語であるPerl5の後継言語としてPerl6が現在開発されている. 48 スクリプト言語であるPerl5の後継言語としてPerl6が現在開発されている.
49 Perl6は設計と実装が区分されており様々な処理系が開発されている.現在主流なPerl6はRakudoと言われるプロジェクトである. 49 Perl6は設計と実装が区分されており様々な処理系が開発されている.現在主流なPerl6はRakudoと言われるプロジェクトである.
50 RakudoではPerl6自体をNQP(NotQuitPerl)と言われるPerl6のサブセットで記述し, NQPをVMが解釈するという処理流れになっている. 50 RakudoではPerl6自体をNQP(NotQuitPerl)と言われるPerl6のサブセットで記述し, NQPをVMが解釈するという処理の流れになっている.
51 このVMは任意のVMが選択できるようになっており, 現在はMoarVM,JavaVM,Javascriptが動作環境として選択可能である. 51 このVMは任意のVMが選択できるようになっており, 現在はMoarVM, JavaVM, JavaScriptが動作環境として選択可能である.
52 主に利用されているVMにCで書かれたMoarVMが存在する. 52 主に利用されているVMにCで書かれたMoarVMが存在する.
53 MoarVMはJITコンパイルなどをサポートしているが, 全体的な起動時間及び処理速度がPerl5と比較し非常に低速である. 53 MoarVMはJITコンパイルなどをサポートしているが, 全体的な起動時間及び処理速度がPerl5と比較し非常に低速である.
54 この問題を解決するためにContinuation based C (CbC)という言語を一部用いてMoarVMの書き換えを行う. 54 この問題を解決するためにContinuation based C (CbC)という言語を一部用いてMoarVMの書き換えを行う.
55 本論文ではCbCを用いたMoarVMの書き換えを検討し, 得られた知見について述べる. 55 本論文ではCbCを用いたMoarVMの書き換えを検討し, 得られた知見について述べる.
56 56
62 \end{jkeyword} 62 \end{jkeyword}
63 63
64 \maketitle 64 \maketitle
65 65
66 % Body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 66 % Body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
67 \section{CbCを用いた言語処理系の実装} 67 \section{はじめに}
68 当研究室ではContinuation Based C(以下CbC)という言語を開発している. 68 当研究室ではContinuation Based C(以下CbC)という言語を開発している.
69 CbCはCよりきめ細やかな単位で実装する事が可能である為, 言語処理系に応用すれば効率的な開発,実行が出来ると期待される. 69 CbCはCよりきめ細やかな単位で実装する事が可能である為, 言語処理系に応用すれば効率的な開発,実行が出来ると期待される.
70 現在活発に開発が進んでいる言語にPerl6がある. 70 現在活発に開発が進んでいる言語にPerl6がある.
71 Perl6はMoarVMと呼ばれるVMを中心としたRakudoと呼ばれる実装が現在の主流となっている. 71 Perl6はMoarVMと呼ばれるVMを中心としたRakudoと呼ばれる実装が現在の主流となっている.
72 Rakudoは処理速度が他のプログラミング言語と比較しても非常に低速である. 72 Rakudoは処理速度が他のプログラミング言語と比較しても非常に低速である.
73 その為現在日本国内ではPerl6を実務として利用するケースは概ね存在しない. 73 その為, 現在日本国内ではPerl6を実務として利用するケースは概ね存在しない.
74 Perl6の持つ言語機能や型システムは非常に柔軟かつ強力であるため実用的な処理速度に達すれば言語の利用件数が向上することが期待される. 74 Perl6の持つ言語機能や型システムは非常に柔軟かつ強力であるため, 実用的な処理速度に達すれば, 言語の利用件数が向上することが期待される.
75 その為本研究では, CbCを用いた言語処理系の実装の一例としてMoarVMをCbCで構築したCbCMoarVMを実装する. 75 その為本研究では, CbCを用いた言語処理系の実装の一例としてMoarVMをCbCで書き換えたCbCMoarVMを提案する.
76 本研究はCbCをスクリプト言語の実装に適応した場合, どのような利点やプログラミング上の問題点に遭遇するかCbCの応用としての側面でも行う. 76 本研究はCbCをスクリプト言語の実装に適応した場合, どのような利点やプログラミング上の問題点に遭遇するか, CbCの応用としての側面でも行う.
77 本稿ではまずCbC, Perl6の特徴及び現在の実装について述べ,本研究で行ったCbCで書き換えたMoarVMについてデバッグ手法も含め解説する. 77 本稿ではまずCbC, Perl6の特徴及び現在の実装について述べ,本研究で行ったCbCで書き換えたMoarVMについてデバッグ手法も含め解説する.
78 そして本研究で得られたCbCを言語処理系に適応した場合の利点と欠点について述べ, 今後の展望について記載する. 78 そして本研究で得られたCbCを言語処理系に適応した場合の利点と欠点について述べ, 今後の展望について記載する.
79 79
80 \section{CbC} 80 \section{CbC}
81 \subsection{CbCの概要} 81 \subsection{CbCの概要}
87 またCodeGearの実行に必要なデータをDataGearという単位で受け渡す. 87 またCodeGearの実行に必要なデータをDataGearという単位で受け渡す.
88 CbCではCodeGear, DataGearを基本単位として記述するプログラミングスタイルを取る. 88 CbCではCodeGear, DataGearを基本単位として記述するプログラミングスタイルを取る.
89 89
90 \subsection{CodeGearとDataGear} 90 \subsection{CodeGearとDataGear}
91 CbCではCの関数の代わりにCodeGearを導入する. 91 CbCではCの関数の代わりにCodeGearを導入する.
92 CodeGearはCの関数宣言の型名の代わりに\_\_codeと書くことで 宣言できる. 92 CodeGearはCの関数宣言の型名の代わりに\_\_codeと書くことで宣言できる.
93 \_\_codeはCbCコンパイラの扱いはvoidと同じ型であるが, CbCプログラミングではCodeGearである事を示す識別子としての意味で利用する. 93 \_\_codeはCbCコンパイラの扱いはvoidと同じ型であるが, CbCプログラミングではCodeGearである事を示す識別子としての意味で利用する.
94 CodeGear間の移動はgoto文によって記述する. 94 CodeGear間の移動はgoto文によって記述する.
95 \lstinputlisting[label=cbcexample, caption=cbc\_example.cbc]{./src/cbc_example.cbc} 95 \lstinputlisting[label=cbcexample, caption=cbc\_example.cbc]{./src/cbc_example.cbc}
96 Code\ref{cbcexample}に示すCbCのコードではmain関数からcg1, cg2に遷移し,最終的にdataの値が2となる. 96 Code\ref{cbcexample}に示すCbCのコードではmain関数からcg1, cg2に遷移し, 最終的にdataの値が2となる.
97 CodeGear間の入出力の受け渡しは引数を利用する.この引数は小さなDataGearであると言える. 97 CodeGear間の入出力の受け渡しは引数を利用し行う.
98
99 あるCodeGearの実行に必要なデータを, DataGearと呼ぶ.
100 DataGearにはCodeGearで実行される関数や変数などの情報を含む.
101 Code\ref{cbcexample}に示す例では, CodeGearに渡す引数datapが, 一種のDataGearと言える.
98 102
99 \subsection{軽量継続} 103 \subsection{軽量継続}
100 %TBD 104 %TBD
101 CbCでは次のCodeGearに移行する際, Cのgoto文を利用する. 105 CbCでは次のCodeGearに移行する際, Cのgoto文を利用する.
102 通常のCの関数呼び出しの場合, スタックポインタを操作しローカル変数などをスタックに保存する. 106 通常のCの関数呼び出しの場合, スタックポインタを操作しローカル変数などをスタックに保存する.
164 RakudoがPerl6のコンパイラかつインタプリタであると考えても良い. 168 RakudoがPerl6のコンパイラかつインタプリタであると考えても良い.
165 Rakudoは図\ref{fig:perl6construction}に示す構成になっている. 169 Rakudoは図\ref{fig:perl6construction}に示す構成になっている.
166 Rakudoにおけるコンパイラとは厳密には2種類存在する. 170 Rakudoにおけるコンパイラとは厳密には2種類存在する.
167 まず第1のものがPerl6, もしくはNQPをMoarVM,JVMのバイトコードに変換するNQPコンパイラである. 171 まず第1のものがPerl6, もしくはNQPをMoarVM,JVMのバイトコードに変換するNQPコンパイラである.
168 次にそのNQPが出力したバイトコードをネイティブコードに変換するVMの2種類である. 172 次にそのNQPが出力したバイトコードをネイティブコードに変換するVMの2種類である.
169 このVMは現在MoarVM, JavaVM,Javascriptを選択可能である. 173 このVMは現在MoarVM, JavaVM,JavaScriptを選択可能である.
170 Rakudo及びNQP projectではこのNQPコンパイラの部分をフロントエンド, VMの部分をバックエンド\cite{rani1}と呼称している. 174 Rakudo及びNQP projectではこのNQPコンパイラの部分をフロントエンド, VMの部分をバックエンド\cite{rani1}と呼称している.
171 NQPで主に書かれ, MoarVMなどNQPが動作する環境で動くPerl6のことをRakudoと呼ぶ. 175 NQPで主に書かれ, MoarVMなどNQPが動作する環境で動くPerl6のことをRakudoと呼ぶ.
172 Perl6はNQP以外にものNQPを拡張したPerl6自身で書かれている箇所が存在し, これはNQPコンパイラ側でMoarVMが解釈可能な形へ変換を行う. 176 Perl6はNQP以外にものNQPを拡張したPerl6自身で書かれている箇所が存在し, これはNQPコンパイラ側でMoarVMが解釈可能な形へ変換を行う.
173 177
174 \begin{figure}[ht] 178 \begin{figure}[ht]
184 RakudoにおけるNQP\cite{nqp}は現在MoarVM, JVM上で動作し,MoarVMを一部利用することでNodeJSからも動作させる事が可能である. 188 RakudoにおけるNQP\cite{nqp}は現在MoarVM, JVM上で動作し,MoarVMを一部利用することでNodeJSからも動作させる事が可能である.
185 NQPはPerl6のサブセットであるため主な文法などはPerl6に準拠しているが幾つか異なる点が存在する. 189 NQPはPerl6のサブセットであるため主な文法などはPerl6に準拠しているが幾つか異なる点が存在する.
186 NQPは最終的にはNQP自身でブートストラップする言語であるが, ビルドの最初にはすでに書かれたMoarvMByteCodeを必要とする. 190 NQPは最終的にはNQP自身でブートストラップする言語であるが, ビルドの最初にはすでに書かれたMoarvMByteCodeを必要とする.
187 このMoarVMByteCodeの状態をStage0と言い, ディレクトリ名として設定されている. 191 このMoarVMByteCodeの状態をStage0と言い, ディレクトリ名として設定されている.
188 Perl6の一部はNQPを拡張したもので書かれている為, Rakudoを動作させる為にはMoarVMなどのVM,VMに対応させる様にビルドしたNQPがそれぞれ必要となる. 192 Perl6の一部はNQPを拡張したもので書かれている為, Rakudoを動作させる為にはMoarVMなどのVM,VMに対応させる様にビルドしたNQPがそれぞれ必要となる.
189 現在のNQPではMoarVM, JVMに対応するStage0はそれぞれMoarVMBytecode,jarファイルが用意されており,Javascriptではバイトコードの代わりにランタイム独自のModuleLoaderなどが設計されている. 193 現在のNQPではMoarVM, JVMに対応するStage0はそれぞれMoarVMBytecode,jarファイルが用意されており,JavaScriptではバイトコードの代わりにランタイム独自のModuleLoaderなどが設計されている.
190 MoarVMのModuleLoaderはStage0にあるMoarVMBytecodeで書かれた一連のファイルが該当する. 194 MoarVMのModuleLoaderはStage0にあるMoarVMBytecodeで書かれた一連のファイルが該当する.
191 195
192 196
193 Stage0にあるファイルをMoarVMに与えることでnqpのインタプリタが実行される様になっている. 197 Stage0にあるファイルをMoarVMに与えることでNQPのインタプリタが実行される様になっている.
194 これはStage0の一連のファイルはMoarVMBytecodeなどで記述されたNQPコンパイラのモジュールである為である. 198 これはStage0の一連のファイルはMoarVMBytecodeなどで記述されたNQPコンパイラのモジュールである為である.
195 NQPは6modelと呼ばれるオブジェクトモデルを採用としているが, これを構築する為に必要なNQPCORE,正規表現系のQRegex,MoarVMのModuleLoaderなどがMoarVMBytecodeで記述されている.これらMoarVMBytecodeの拡張子は.MoarVMである. 199 NQPのインタプリタはセルフビルドが完了するとnqpというシェルスクリプトとして提供される.
196 MoarVMに対してStage0のディレクトリにライブラリパスを設定し, nqp.MoarVMを実行させることでnqpの対話型環境が起動する. 200 このシェルスクリプトはイブラリパスなどを設定してのバイナリであるmoarを起動するものである.
201 %NQPは6modelと呼ばれるオブジェクトモデルを採用としている.%が, これを構築する為に必要なNQPCORE,正規表現系のQRegex,MoarVMのModuleLoaderなどがMoarVMBytecodeで記述されている.これらMoarVMBytecodeの拡張子は.MoarVMである.
202 %MoarVMに対してStage0のディレクトリにライブラリパスを設定し, nqp.MoarVMを実行させることでnqpの対話型環境が起動する.
197 203
198 \begin{figure}[ht] 204 \begin{figure}[ht]
199 \begin{center} 205 \begin{center}
200 \includegraphics[width=70mm]{fig/stagenqp.pdf} 206 \includegraphics[width=70mm]{fig/stagenqp.pdf}
201 \end{center} 207 \end{center}
202 \caption{NQPのビルドフロー} 208 \caption{NQPのビルドフロー}
203 \label{fig:nqpbuild} 209 \label{fig:nqpbuild}
204 \end{figure} 210 \end{figure}
205 211
206 NQPのビルドフローを図\ref{fig:nqpbuild}に示す. 212 NQPのビルドフローを図\ref{fig:nqpbuild}に示す.
207 実際にperl6を動かすためにはself buildしたNQPコンパイラが必要となる.その為にstage0を利用してStage1をビルドしNQPコンパイラを作成する. 213 実際にPerl6の処理系であるperl6を動かすためにはself buildしたNQPコンパイラが必要となる.その為にStage0を利用してStage1をビルドしNQPコンパイラを作成する.
208 Stage1は中間的な出力であり, 生成されたNQPファイルはStage2と同一であるが,MoarVMBytecodeが異なる. 214 Stage1は中間的な出力であり, 生成されたNQPファイルはStage2と同一であるが,MoarVMBytecodeが異なる.
209 Perl6では完全なセルフコンパイルを実行したNQPが要求される為, Stage1を利用してもう一度ビルドを行いStage2を作成する. 215 Perl6では完全なセルフコンパイルを実行したNQPが要求される為, Stage1を利用してもう一度ビルドを行いStage2を作成する.
210 216
211 Perl6のテストスイートである「Roast\cite{roast}」やドキュメントなどによって設計が定まっているPerl6とは異なりNQP自身の設計は今後も変更になる可能性が開発者から公表されている. 217 Perl6のテストスイートであるRoast\cite{roast}やドキュメントなどによって設計が定まっているPerl6とは異なりNQP自身の設計は今後も変更になる可能性が開発者から公表されている.
212 現在の公表されているNQPのオペコードはNQPのリポジトリ\cite{nqpopcode}に記述されているものである. 218 現在の公表されているNQPのオペコードはNQPのリポジトリ\cite{nqpopcode}に記述されているものである.
213 219
214 220
215 \subsection{Rakudo Perl6} 221 \subsection{Rakudo Perl6}
216 Rakudo実装上におけるPerl6はRakudo Perl6と呼ばれているGitリポジトリで管理されているプログラムのことである. 222 Rakudo実装上におけるPerl6はRakudo Perl6と呼ばれているGitリポジトリで管理されているプログラムのことである.
217 前述した通りRakudo Perl6はPerl6のサブセットであるNQPを用いて記述されている. 223 前述した通りRakudo Perl6はPerl6のサブセットであるNQPを用いて記述されている.
218 従ってyaccやlexと言ったPerl5の文字解析, 構文解析に利用していたプログラムは利用せず,NQP側で構文定義などを行っている. 224 従ってyaccやlexと言ったPerl5の文字解析, 構文解析に利用していたプログラムは利用せず,NQP側で構文定義などを行っている.
219 NQPはNQP自身でBootstrappingされている為, Rakudo Perl6のbuild時にはNQPの実行環境として要したVM,それに基づいてbuildしたNQPがそれぞれ必要となる. 225 NQPはNQP自身でBootstrappingされている為, Rakudo Perl6のbuild時にはNQPの実行環境として要したVM,それに基づいてbuildしたNQPがそれぞれ必要となる.
220 226
221 言語的な特徴としては独自にPerl6の文法を拡張可能なGrammer, Perl5と比較した場合のオブジェクト指向言語としての進化も見られる. 227 言語的な特徴としては独自にPerl6の文法を拡張可能なGrammar, Perl5と比較した場合のオブジェクト指向言語としての進化も見られる.
222 またPerl6は漸進的型付け言語である. 228 またPerl6は漸進的型付け言語である.
223 従来のPerlの様に変数に代入する対象の型や文脈に応じて型を変更する動的型言語としての側面を持ちつつ独自に定義した型を始めとする様々な型に静的に変数の型を設定する事が可能である. 229 従来のPerlの様に変数に代入する対象の型や文脈に応じて型を変更する動的型言語としての側面を持ちつつ独自に定義した型を始めとする様々な型に静的に変数の型を設定する事が可能である.
224 230
225 231
226 \subsection{現在のPerl6} 232 \subsection{現在のPerl6}
227 Perl6の言語仕様\cite{perl6design}とその時点での実装状況をまとめた公式ドキュメント\cite{perl6doc}は分離している. 233 Perl6の言語仕様\cite{perl6design}とその時点での実装状況をまとめた公式ドキュメント\cite{perl6doc}は分離している.
228 従来は言語仕様は自然言語の仕様書であったが, 現在はテストスイートである「Roast\cite{roast}」そのものと定義されている. 234 従来は言語仕様は自然言語の仕様書であったが, 現在はテストスイートであるRoast\cite{roast}そのものと定義されている.
229 現在のPerl6の仕様を読む場合Roastを確認し, 現在rakudo上に実装されている機能を見る場合は公式ドキュメントを確認する必要がある. 235 現在のPerl6の仕様を読む場合Roastを確認し, 現在rakudo上に実装されている機能を見る場合は公式ドキュメントを確認する必要がある.
230 236
231 \subsection{処理速度} 237 \subsection{処理速度}
232 現在のPerl6が他のプログラミング言語と比較した場合どのような違いがでるのか計測した. 238 現在のPerl6が他のプログラミング言語と比較した場合どのような違いがでるのか計測した.
233 mac osの/var/log/system.logファイルから正規表現でログ中のプログラムが書き込んだ回数を個別に数え上げるというものである. 239 macOSの/var/log/system.logファイルから正規表現でログ中のプログラムが書き込んだ回数を個別に数え上げるというものである.
234 今回はファイルを231Kと3GBの二種類用意し, どの様な違いが出るのか測定した. 240 今回はファイルを231Kと3GBの二種類用意し, どの様な違いが出るのか測定した.
235 241
236 測定した環境は次の通りである. 242 測定した環境は次の通りである.
237 243
238 \begin{itemize} 244 \begin{itemize}
286 % * 21.48s 292 % * 21.48s
287 293
288 294
289 \section{CbCによるMoarVM} 295 \section{CbCによるMoarVM}
290 この章では改良を行ったPerl6処理系であるMoarVMについて述べる. 296 この章では改良を行ったPerl6処理系であるMoarVMについて述べる.
291 今回改良を行ったMoarVMは2018.04.01, nqpは2018.04-3-g45ab6e3バージョンで行っている. 297 今回改良を行ったMoarVMは2018.04.01であり, 利用したnqpは2018.04-3-g45ab6e3バージョンである.
292 \subsection{方針} 298 \subsection{方針}
293 MoarVMそのものをCbCで書き換えることも考えられるがMoarVM自体既に巨大なプロジェクトである為すべてを書き換える事は困難である. 299 MoarVMそのものをCbCで書き換えることも考えられるがMoarVM自体既に巨大なプロジェクトである為すべてを書き換える事は困難である.
294 その為まず比較的CbCで書き換えることが容易な箇所を修正する. 300 その為まず比較的CbCで書き換えることが容易な箇所を修正する.
295 前章までに述べた通りCbCのCodeGearはコンパイラの基本ブロックに該当する. 301 前章までに述べた通りCbCのCodeGearはコンパイラの基本ブロックに該当する.
296 従ってMoarVMにおける基本ブロックの箇所をCodeGearに書き換える事が可能である. 302 従ってMoarVMにおける基本ブロックの箇所をCodeGearに書き換える事が可能である.
328 334
329 335
330 336
331 OP(.*)の.*に該当する箇所はバイトコードの名前である.通常このブロックにはLABELから遷移する為, バイトコードの名前はLABELSの配列の添字に変換されている. 337 OP(.*)の.*に該当する箇所はバイトコードの名前である.通常このブロックにはLABELから遷移する為, バイトコードの名前はLABELSの配列の添字に変換されている.
332 そのため対象となるCodeGearをLABLESの並びと対応させ, Code\ref{cbcoplabelsh}に示すCodeGearの配列CODESとして設定すればCodeGearの名前は問わない. 338 そのため対象となるCodeGearをLABLESの並びと対応させ, Code\ref{cbcoplabelsh}に示すCodeGearの配列CODESとして設定すればCodeGearの名前は問わない.
333 今回はCodeGearである事を示す為にsuffixとしてcbc\_をつける. 339 今回はCodeGearである事を示す為に接頭辞としてcbc\_をつける.
334 340
335 \lstinputlisting[label=cbcoplabelsh, caption=CodeGear配列の一部分]{./src/oplables-cbc-codes.h} 341 \lstinputlisting[label=cbcoplabelsh, caption=CodeGear配列の一部分]{./src/oplables-cbc-codes.h}
336 342
337 命令の実行処理でMoarVMのレジスタであるreg\_baseや命令列cur\_opなどの情報を利用しているが, これらはMVM\_interp\_run内のローカル変数として利用している. 343 命令の実行処理でMoarVMのレジスタであるreg\_baseや命令列cur\_opなどの情報を利用しているが, これらはMVM\_interp\_run内のローカル変数として利用している.
338 ラベルを利用しているオリジナル版では同一関数内であるためアクセス可能であるが, CodeGear間の移動で命令を表現するCbCではアクセスできない. 344 ラベルを利用しているオリジナル版では同一関数内であるためアクセス可能であるが, CodeGear間の移動で命令を表現するCbCではアクセスできない.
558 \end{itemize} 564 \end{itemize}
559 565
560 今後CbCでの開発をより深く行っていくにあたり, CbCコンパイラそのものの信頼性を向上させる必要がある. 566 今後CbCでの開発をより深く行っていくにあたり, CbCコンパイラそのものの信頼性を向上させる必要がある.
561 MoarVMの開発を行うにあたり新たに発見された複数のバグを修正し, より安定するコンパイラにする為に改良を行う. 567 MoarVMの開発を行うにあたり新たに発見された複数のバグを修正し, より安定するコンパイラにする為に改良を行う.
562 568
563 現在CbCMoarVMで直接バイトコードを入力した場合のnqpのテストはJVM, Javascriptのテストを除く中で80\%パスする. 569 現在CbCMoarVMで直接バイトコードを入力した場合のnqpのテストはJVM, JavaScriptのテストを除く中で80\%パスする.
564 また数値の計算と出力などの簡単なNQPの例題を作成し, オリジナルのNQP,MoarVMでバイトコード化したものを入力した際も正常に動作している. 570 また数値の計算と出力などの簡単なNQPの例題を作成し, オリジナルのNQP,MoarVMでバイトコード化したものを入力した際も正常に動作している.
565 しかしNQPのセルフビルドは現在オブジェクトの生成に一部失敗している為成功していない. 571 しかしNQPのセルフビルドは現在オブジェクトの生成に一部失敗している為成功していない.
566 今後はさらに複雑な例題やNQPのセルフビルド, Perl6の動作を行っていく. 572 今後はさらに複雑な例題やNQPのセルフビルド, Perl6の動作を行っていく.
567 573
568 MoarVMではGCからオブジェクトを守る為にMVMROOTというマクロを利用し, 局所変数のポインタをスタックに登録する処理を行っている. 574 MoarVMではGCからオブジェクトを守る為にMVMROOTというマクロを利用し, 局所変数のポインタをスタックに登録する処理を行っている.