# HG changeset patch # User Takahiro SHIMIZU # Date 1542511196 -32400 # Node ID 27cb6c89b7d2311e5b8eb09b529461952795f44f # Parent 6d85ce7522adcc51f0a7b595b0bd046c07ddadfb fix about returned comment diff -r 6d85ce7522ad -r 27cb6c89b7d2 Paper/anatofuz.pdf Binary file Paper/anatofuz.pdf has changed diff -r 6d85ce7522ad -r 27cb6c89b7d2 Paper/anatofuz.tex --- a/Paper/anatofuz.tex Fri Nov 09 20:43:43 2018 +0900 +++ b/Paper/anatofuz.tex Sun Nov 18 12:19:56 2018 +0900 @@ -11,7 +11,7 @@ language=C, tabsize=2, frame=single, - basicstyle={\ttfamily\footnotesize}, % + basicstyle={\tt\footnotesize}, % identifierstyle={\footnotesize}, % commentstyle={\footnotesize\itshape}, % keywordstyle={\footnotesize\bfseries}, % @@ -47,8 +47,8 @@ \begin{abstract} スクリプト言語であるPerl5の後継言語としてPerl6が現在開発されている. Perl6は設計と実装が区分されており様々な処理系が開発されている.現在主流なPerl6はRakudoと言われるプロジェクトである. -RakudoではPerl6自体をNQP(NotQuitPerl)と言われるPerl6のサブセットで記述し, NQPをVMが解釈するという処理流れになっている. -このVMは任意のVMが選択できるようになっており, 現在はMoarVM,JavaVM,Javascriptが動作環境として選択可能である. +RakudoではPerl6自体をNQP(NotQuitPerl)と言われるPerl6のサブセットで記述し, NQPをVMが解釈するという処理の流れになっている. +このVMは任意のVMが選択できるようになっており, 現在はMoarVM, JavaVM, JavaScriptが動作環境として選択可能である. 主に利用されているVMにCで書かれたMoarVMが存在する. MoarVMはJITコンパイルなどをサポートしているが, 全体的な起動時間及び処理速度がPerl5と比較し非常に低速である. この問題を解決するためにContinuation based C (CbC)という言語を一部用いてMoarVMの書き換えを行う. @@ -64,16 +64,16 @@ \maketitle % Body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\section{CbCを用いた言語処理系の実装} +\section{はじめに} 当研究室ではContinuation Based C(以下CbC)という言語を開発している. CbCはCよりきめ細やかな単位で実装する事が可能である為, 言語処理系に応用すれば効率的な開発,実行が出来ると期待される. 現在活発に開発が進んでいる言語にPerl6がある. Perl6はMoarVMと呼ばれるVMを中心としたRakudoと呼ばれる実装が現在の主流となっている. Rakudoは処理速度が他のプログラミング言語と比較しても非常に低速である. -その為現在日本国内ではPerl6を実務として利用するケースは概ね存在しない. -Perl6の持つ言語機能や型システムは非常に柔軟かつ強力であるため実用的な処理速度に達すれば言語の利用件数が向上することが期待される. -その為本研究では, CbCを用いた言語処理系の実装の一例としてMoarVMをCbCで構築したCbCMoarVMを実装する. -本研究はCbCをスクリプト言語の実装に適応した場合, どのような利点やプログラミング上の問題点に遭遇するかCbCの応用としての側面でも行う. +その為, 現在日本国内ではPerl6を実務として利用するケースは概ね存在しない. +Perl6の持つ言語機能や型システムは非常に柔軟かつ強力であるため, 実用的な処理速度に達すれば, 言語の利用件数が向上することが期待される. +その為本研究では, CbCを用いた言語処理系の実装の一例としてMoarVMをCbCで書き換えたCbCMoarVMを提案する. +本研究はCbCをスクリプト言語の実装に適応した場合, どのような利点やプログラミング上の問題点に遭遇するか, CbCの応用としての側面でも行う. 本稿ではまずCbC, Perl6の特徴及び現在の実装について述べ,本研究で行ったCbCで書き換えたMoarVMについてデバッグ手法も含め解説する. そして本研究で得られたCbCを言語処理系に適応した場合の利点と欠点について述べ, 今後の展望について記載する. @@ -89,12 +89,16 @@ \subsection{CodeGearとDataGear} CbCではCの関数の代わりにCodeGearを導入する. -CodeGearはCの関数宣言の型名の代わりに\_\_codeと書くことで 宣言できる. +CodeGearはCの関数宣言の型名の代わりに\_\_codeと書くことで宣言できる. \_\_codeはCbCコンパイラの扱いはvoidと同じ型であるが, CbCプログラミングではCodeGearである事を示す識別子としての意味で利用する. CodeGear間の移動はgoto文によって記述する. \lstinputlisting[label=cbcexample, caption=cbc\_example.cbc]{./src/cbc_example.cbc} -Code\ref{cbcexample}に示すCbCのコードではmain関数からcg1, cg2に遷移し,最終的にdataの値が2となる. -CodeGear間の入出力の受け渡しは引数を利用する.この引数は小さなDataGearであると言える. +Code\ref{cbcexample}に示すCbCのコードではmain関数からcg1, cg2に遷移し, 最終的にdataの値が2となる. +CodeGear間の入出力の受け渡しは引数を利用し行う. + +あるCodeGearの実行に必要なデータを, DataGearと呼ぶ. +DataGearにはCodeGearで実行される関数や変数などの情報を含む. +Code\ref{cbcexample}に示す例では, CodeGearに渡す引数datapが, 一種のDataGearと言える. \subsection{軽量継続} %TBD @@ -166,7 +170,7 @@ Rakudoにおけるコンパイラとは厳密には2種類存在する. まず第1のものがPerl6, もしくはNQPをMoarVM,JVMのバイトコードに変換するNQPコンパイラである. 次にそのNQPが出力したバイトコードをネイティブコードに変換するVMの2種類である. -このVMは現在MoarVM, JavaVM,Javascriptを選択可能である. +このVMは現在MoarVM, JavaVM,JavaScriptを選択可能である. Rakudo及びNQP projectではこのNQPコンパイラの部分をフロントエンド, VMの部分をバックエンド\cite{rani1}と呼称している. NQPで主に書かれ, MoarVMなどNQPが動作する環境で動くPerl6のことをRakudoと呼ぶ. Perl6はNQP以外にものNQPを拡張したPerl6自身で書かれている箇所が存在し, これはNQPコンパイラ側でMoarVMが解釈可能な形へ変換を行う. @@ -186,14 +190,16 @@ NQPは最終的にはNQP自身でブートストラップする言語であるが, ビルドの最初にはすでに書かれたMoarvMByteCodeを必要とする. このMoarVMByteCodeの状態をStage0と言い, ディレクトリ名として設定されている. Perl6の一部はNQPを拡張したもので書かれている為, Rakudoを動作させる為にはMoarVMなどのVM,VMに対応させる様にビルドしたNQPがそれぞれ必要となる. -現在のNQPではMoarVM, JVMに対応するStage0はそれぞれMoarVMBytecode,jarファイルが用意されており,Javascriptではバイトコードの代わりにランタイム独自のModuleLoaderなどが設計されている. +現在のNQPではMoarVM, JVMに対応するStage0はそれぞれMoarVMBytecode,jarファイルが用意されており,JavaScriptではバイトコードの代わりにランタイム独自のModuleLoaderなどが設計されている. MoarVMのModuleLoaderはStage0にあるMoarVMBytecodeで書かれた一連のファイルが該当する. -Stage0にあるファイルをMoarVMに与えることでnqpのインタプリタが実行される様になっている. +Stage0にあるファイルをMoarVMに与えることでNQPのインタプリタが実行される様になっている. これはStage0の一連のファイルはMoarVMBytecodeなどで記述されたNQPコンパイラのモジュールである為である. -NQPは6modelと呼ばれるオブジェクトモデルを採用としているが, これを構築する為に必要なNQPCORE,正規表現系のQRegex,MoarVMのModuleLoaderなどがMoarVMBytecodeで記述されている.これらMoarVMBytecodeの拡張子は.MoarVMである. -MoarVMに対してStage0のディレクトリにライブラリパスを設定し, nqp.MoarVMを実行させることでnqpの対話型環境が起動する. +NQPのインタプリタはセルフビルドが完了するとnqpというシェルスクリプトとして提供される. +このシェルスクリプトはイブラリパスなどを設定してのバイナリであるmoarを起動するものである. +%NQPは6modelと呼ばれるオブジェクトモデルを採用としている.%が, これを構築する為に必要なNQPCORE,正規表現系のQRegex,MoarVMのModuleLoaderなどがMoarVMBytecodeで記述されている.これらMoarVMBytecodeの拡張子は.MoarVMである. +%MoarVMに対してStage0のディレクトリにライブラリパスを設定し, nqp.MoarVMを実行させることでnqpの対話型環境が起動する. \begin{figure}[ht] \begin{center} @@ -204,11 +210,11 @@ \end{figure} NQPのビルドフローを図\ref{fig:nqpbuild}に示す. -実際にperl6を動かすためにはself buildしたNQPコンパイラが必要となる.その為にstage0を利用してStage1をビルドしNQPコンパイラを作成する. +実際にPerl6の処理系であるperl6を動かすためにはself buildしたNQPコンパイラが必要となる.その為にStage0を利用してStage1をビルドしNQPコンパイラを作成する. Stage1は中間的な出力であり, 生成されたNQPファイルはStage2と同一であるが,MoarVMBytecodeが異なる. Perl6では完全なセルフコンパイルを実行したNQPが要求される為, Stage1を利用してもう一度ビルドを行いStage2を作成する. -Perl6のテストスイートである「Roast\cite{roast}」やドキュメントなどによって設計が定まっているPerl6とは異なりNQP自身の設計は今後も変更になる可能性が開発者から公表されている. +Perl6のテストスイートであるRoast\cite{roast}やドキュメントなどによって設計が定まっているPerl6とは異なりNQP自身の設計は今後も変更になる可能性が開発者から公表されている. 現在の公表されているNQPのオペコードはNQPのリポジトリ\cite{nqpopcode}に記述されているものである. @@ -218,19 +224,19 @@ 従ってyaccやlexと言ったPerl5の文字解析, 構文解析に利用していたプログラムは利用せず,NQP側で構文定義などを行っている. NQPはNQP自身でBootstrappingされている為, Rakudo Perl6のbuild時にはNQPの実行環境として要したVM,それに基づいてbuildしたNQPがそれぞれ必要となる. -言語的な特徴としては独自にPerl6の文法を拡張可能なGrammer, Perl5と比較した場合のオブジェクト指向言語としての進化も見られる. +言語的な特徴としては独自にPerl6の文法を拡張可能なGrammar, Perl5と比較した場合のオブジェクト指向言語としての進化も見られる. またPerl6は漸進的型付け言語である. 従来のPerlの様に変数に代入する対象の型や文脈に応じて型を変更する動的型言語としての側面を持ちつつ独自に定義した型を始めとする様々な型に静的に変数の型を設定する事が可能である. \subsection{現在のPerl6} Perl6の言語仕様\cite{perl6design}とその時点での実装状況をまとめた公式ドキュメント\cite{perl6doc}は分離している. -従来は言語仕様は自然言語の仕様書であったが, 現在はテストスイートである「Roast\cite{roast}」そのものと定義されている. +従来は言語仕様は自然言語の仕様書であったが, 現在はテストスイートであるRoast\cite{roast}そのものと定義されている. 現在のPerl6の仕様を読む場合Roastを確認し, 現在rakudo上に実装されている機能を見る場合は公式ドキュメントを確認する必要がある. \subsection{処理速度} 現在のPerl6が他のプログラミング言語と比較した場合どのような違いがでるのか計測した. -mac osの/var/log/system.logファイルから正規表現でログ中のプログラムが書き込んだ回数を個別に数え上げるというものである. +macOSの/var/log/system.logファイルから正規表現でログ中のプログラムが書き込んだ回数を個別に数え上げるというものである. 今回はファイルを231Kと3GBの二種類用意し, どの様な違いが出るのか測定した. 測定した環境は次の通りである. @@ -288,7 +294,7 @@ \section{CbCによるMoarVM} この章では改良を行ったPerl6処理系であるMoarVMについて述べる. -今回改良を行ったMoarVMは2018.04.01, nqpは2018.04-3-g45ab6e3バージョンで行っている. +今回改良を行ったMoarVMは2018.04.01であり, 利用したnqpは2018.04-3-g45ab6e3バージョンである. \subsection{方針} MoarVMそのものをCbCで書き換えることも考えられるがMoarVM自体既に巨大なプロジェクトである為すべてを書き換える事は困難である. その為まず比較的CbCで書き換えることが容易な箇所を修正する. @@ -330,7 +336,7 @@ OP(.*)の.*に該当する箇所はバイトコードの名前である.通常このブロックにはLABELから遷移する為, バイトコードの名前はLABELSの配列の添字に変換されている. そのため対象となるCodeGearをLABLESの並びと対応させ, Code\ref{cbcoplabelsh}に示すCodeGearの配列CODESとして設定すればCodeGearの名前は問わない. -今回はCodeGearである事を示す為にsuffixとしてcbc\_をつける. +今回はCodeGearである事を示す為に接頭辞としてcbc\_をつける. \lstinputlisting[label=cbcoplabelsh, caption=CodeGear配列の一部分]{./src/oplables-cbc-codes.h} @@ -560,7 +566,7 @@ 今後CbCでの開発をより深く行っていくにあたり, CbCコンパイラそのものの信頼性を向上させる必要がある. MoarVMの開発を行うにあたり新たに発見された複数のバグを修正し, より安定するコンパイラにする為に改良を行う. -現在CbCMoarVMで直接バイトコードを入力した場合のnqpのテストはJVM, Javascriptのテストを除く中で80\%パスする. +現在CbCMoarVMで直接バイトコードを入力した場合のnqpのテストはJVM, JavaScriptのテストを除く中で80\%パスする. また数値の計算と出力などの簡単なNQPの例題を作成し, オリジナルのNQP,MoarVMでバイトコード化したものを入力した際も正常に動作している. しかしNQPのセルフビルドは現在オブジェクトの生成に一部失敗している為成功していない. 今後はさらに複雑な例題やNQPのセルフビルド, Perl6の動作を行っていく.