Mercurial > hg > Papers > 2019 > koo-prosym
changeset 5:8bdae210d08d
コメントフィードバック修正途中
author | e165727 <e165727@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 28 Nov 2019 12:00:00 +0900 |
parents | d33d89b2dce4 |
children | 82be652de341 |
files | .DS_Store Paper/.DS_Store Paper/koo.aux Paper/koo.log Paper/koo.pdf Paper/koo.synctex.gz Paper/koo.tex |
diffstat | 7 files changed, 52 insertions(+), 51 deletions(-) [+] |
line wrap: on
line diff
--- a/Paper/koo.aux Fri Nov 08 21:39:33 2019 +0900 +++ b/Paper/koo.aux Thu Nov 28 12:00:00 2019 +0900 @@ -1,6 +1,6 @@ \relax \newlabel{ipsj@firstpage}{{}{1}} -\@writefile{toc}{\contentsline {section}{\numberline {1}\hskip 1zw{Perl6 の起動時間の改善}}{1}} +\@writefile{toc}{\contentsline {section}{\numberline {1}\hskip 1zw{ Perl6 の起動時間の改善}}{1}} \@writefile{toc}{\contentsline {section}{\numberline {2}\hskip 1zw{Perl6}}{1}} \providecommand*\caption@xref[2]{\@setref\relax\@undefined{#1}} \newlabel{fig:perl6cbcinter}{{1}{2}} @@ -11,9 +11,9 @@ \@writefile{toc}{\contentsline {section}{\numberline {5}\hskip 1zw{Perl6によるAbyssの実装}}{3}} \newlabel{fig:perl6cbcinter}{{3}{3}} \newlabel{codeseg}{{1}{4}} -\@writefile{lol}{\contentsline {lstlisting}{\numberline {1}Abyssサーバーの実装のsource code}{4}} +\@writefile{lol}{\contentsline {lstlisting}{\numberline {1}Abyss サーバーの実装の source code}{4}} \newlabel{codeseg}{{2}{4}} -\@writefile{lol}{\contentsline {lstlisting}{\numberline {2}クライアント側のsource code}{4}} +\@writefile{lol}{\contentsline {lstlisting}{\numberline {2}クライアント側の source code}{4}} \newlabel{eval}{{3}{4}} \@writefile{lol}{\contentsline {lstlisting}{\numberline {3}evalのサンプルコード}{4}} \@writefile{toc}{\contentsline {section}{\numberline {6}\hskip 1zw{比較}}{4}}
--- a/Paper/koo.log Fri Nov 08 21:39:33 2019 +0900 +++ b/Paper/koo.log Thu Nov 28 12:00:00 2019 +0900 @@ -1,4 +1,4 @@ -This is e-pTeX, Version 3.14159265-p3.6-141210-2.6 (utf8.euc) (TeX Live 2015) (preloaded format=platex 2016.4.14) 8 NOV 2019 21:34 +This is e-pTeX, Version 3.14159265-p3.6-141210-2.6 (utf8.euc) (TeX Live 2015) (preloaded format=platex 2016.4.14) 28 NOV 2019 11:48 entering extended mode restricted \write18 enabled. file:line:error style messages enabled. @@ -293,10 +293,10 @@ [] ) (./code/client.p6) (./code/eval.p6) [4] -LaTeX Font Info: Calculating math sizes for size <8.8711> on input line 237. +LaTeX Font Info: Calculating math sizes for size <8.8711> on input line 238. -Underfull \hbox (badness 5260) in paragraph at lines 243--244 +Underfull \hbox (badness 5260) in paragraph at lines 244--245 []\OT1/cmr/m/n/8.8711 ThePerlFoundation: Perl 6 De-sign Docu- [] @@ -317,4 +317,4 @@ 929 hyphenation exceptions out of 8191 36i,7n,49p,639b,1118s stack positions out of 5000i,500n,10000p,200000b,80000s -Output written on koo.dvi (5 pages, 28088 bytes). +Output written on koo.dvi (5 pages, 28184 bytes).
--- a/Paper/koo.tex Fri Nov 08 21:39:33 2019 +0900 +++ b/Paper/koo.tex Thu Nov 28 12:00:00 2019 +0900 @@ -36,7 +36,7 @@ \begin{document} % Title, Author %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\title{Perl6のサーバを使った実行} +\title{Perl6のサーバーを使った実行} %\affiliate{IPSJ}{情報処理学会} \affiliate{IERYUKYU}{琉球大学工学部情報工学科} @@ -61,7 +61,7 @@ \maketitle % Body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\section{Perl6 の起動時間の改善} +\section{ Perl6 の起動時間の改善} 現在開発の進んでいる言語に Perl6 がある. スクリプト言語 Perl6 は任意の VM が選択できるようになっており, 主に利用されている VM に C で書かれた MoarVM が存在する. MoarVM は JIT コンパイルなどをサポートしているが, 全体的な起動時間及び処理速度が Perl5 や Python , Ruby などの他のスクリプト言語と比較し非常に低速である. @@ -73,6 +73,7 @@ しかし現状の Perl6 は起動時間が非常に遅いことが問題である. この問題を解決するために, 実行するファイル名をサーバーに転送し,サーバー上であらかじめ立ち上げておいたコンパイラでコンパイルを行う手法を提案する. +著者らは、この提案手法に沿って『Abyss サーバー』を実装している. またサーバーでは,サーバーに投げられた Perl6 をコンパイラで実行する際に, そのスクリプトが次に実行するスクリプトに影響を与えないことを保証する必要がある. この問題を解決するために,本研究ではサーバーのコンテナ化を行う. @@ -83,15 +84,15 @@ Perl6 は 2002 年に LarryWall が Perl を置き換える言語として設計を開始した. Perl5 の言語的な問題点であるオブジェクト指向機能の強力なサポートなどを取り入れた言語として設計された. Perl5 は設計と実装が同一であり, Larry らによって書かれた C 実装のみだった. Perl6 は設計と実装が分離している. 言語的な特徴としては, 独自に Perl6 の文法を拡張可能な Grammar, Perl5 と比較した場合のオブジェクト指向言語としての進化も見られる. また Perl6 は漸進的型付け言語である. 従来の Perl の様に変数に代入する対象の型や, 文脈に応じて型を変更する動的型言語としての側面を持ちつつ, 独自に定義した型を始めとする様々な型に, 静的に変数の型を設定する事が可能である. Perl6 は言語仕様及び処理実装が Perl5 と大幅に異なっており, 言語的な互換性が存在しない. 従って現在では Perl6 と Perl5 は別言語としての開発方針になっている. Perl6 は現在有力な処理系である Rakudo から名前を取り Raku という別名がつけられている. -Raku の現在の主流な実装は Rakudo である. Rakudo は MoarVM, と NQP と呼ばれる Raku のサブセット, NQPと Raku 自身で記述された Raku という構成である. +Perl6 の現在の主流な実装は Rakudo である. Rakudo は MoarVM, と NQP と呼ばれる Perl6 のサブセット, NQPと Perl6 自身で記述された Perl6 という構成である. MoarVM は NQP と Byte Code を解釈する. -NQP とは Not Quite Perl の略で Raku のサブセットである. その為基本的な文法などは Raku に準拠しているが, 変数を束縛で宣言するなどの違いが見られる. +NQP とは Not Quite Perl の略で Perl6 のサブセットである. その為基本的な文法などは Perl6 に準拠しているが, 変数を束縛で宣言するなどの違いが見られる. -この NQP で記述された Raku の事を Rakudo と呼ぶ. +この NQP で記述された Perl6 の事を Rakudo と呼ぶ. Rakudo は MoarVM の他に JVM , Javascript を動作環境として選択可能である. -Raku の起動は, MoarVM を起動, NQP をロード, Rakudo をロードもしくはコンパイルし, その後 JIT しながら実行する. +Perl6 の起動は, MoarVM を起動, NQP をロード, Rakudo をロードもしくはコンパイルし, その後 JIT しながら実行する. \begin{figure}[H] \begin{center} @@ -103,7 +104,7 @@ \subsection{MoarVM} -MoarVM は Raku に特化した VM である. C 言語で実装されている. JIT コンパイルなどが現在導入されているが, 起動時間などが低速である問題がある. MoarVM 独自の ByteCode があり, NQP からこれを出力する機能などが存在している. +MoarVM は Perl6 に特化した VM である. C 言語で実装されている. JIT コンパイルなどが現在導入されているが, 起動時間などが低速である問題がある. MoarVM 独自の ByteCode があり, NQP からこれを出力する機能などが存在している. \section{NQP} \begin{comment} @@ -116,19 +117,19 @@ %NQP は与えられた Stage0 を使い Stage1 をビルドし, そのStage1 を利用し Stage2 をビルドする事で生成できる. \end{comment} -RakudoにおけるNQPは現在MoarVM, JVM上で動作する. -NQPはPerl6のサブセットであるため, 主な文法などはPerl6に準拠しているが幾つか異なる点が存在する. -NQPは最終的にはNQP自身でブートストラップする言語であるが, ビルドの最初にはすでに書かれたMoarVMのバイトコードを必要とする. -このMoarVMのバイトコードの状態をStage0と言う.%い, バイトコードが付随するソースディレクトリ内のディレクトリ名として設定されている. -Perl6の一部はNQPを拡張したもので書かれている為, Rakudoを動作させる為にはMoarVMなどのVM, VMに対応させる様にビルドしたNQPがそれぞれ必要となる. -現在のNQPではMoarVM, JVMに対応するStage0はそれぞれMoarVMのバイトコード, jarファイルが用意されている. -MoarVMのModuleLoaderはStage0にあるMoarVMのバイトコードで書かれた一連のファイルが該当する. +Rakudo における NQP は現在 MoarVM, JVM 上で動作する. +NQP は Perl6 のサブセットであるため, 主な文法などは Perl6 に準拠しているが幾つか異なる点が存在する. +NQP は最終的には NQP 自身でブートストラップする言語であるが, ビルドの最初にはすでに書かれた MoarVM のバイトコードを必要とする. +この MoarVM のバイトコードの状態を Stage0 と言う. %い, バイトコードが付随するソースディレクトリ内のディレクトリ名として設定されている. +Perl6 の一部は NQP を拡張したもので書かれている為, Rakudo を動作させる為には MoarVM などの VM, VM に対応させる様にビルドした NQP がそれぞれ必要となる. +現在の NQP では MoarVM, JVM に対応する Stage0 はそれぞれ MoarVM のバイトコード, jarファイルが用意されている. +MoarVM の ModuleLoader は Stage0 にある MoarVM のバイトコードで書かれた一連のファイルが該当する. -Stage0にあるファイルをMoarVMに与えることで, NQPのインタプリタが実行される様になっている. -これはStage0の一連のファイルは, MoarVMのバイトコードなどで記述されたNQPコンパイラのモジュールである為である. -NQPのインタプリタはセルフビルドが完了すると, nqpというシェルスクリプトとして提供される. -このシェルスクリプトは, ライブラリパスなどを設定してMoarVMの実行バイナリであるmoarを起動するものである. +Stage0 にあるファイルを MoarVM に与えることで, NQP のインタプリタが実行される様になっている. +これは Stage0 の一連のファイルは, MoarVM のバイトコードなどで記述された NQP コンパイラのモジュールである為である. +NQP のインタプリタはセルフビルドが完了すると, nqp というシェルスクリプトとして提供される. +このシェルスクリプトは, ライブラリパスなどを設定して MoarVM の実行バイナリである moar を起動するものである. %NQPは6modelと呼ばれるオブジェクトモデルを採用としている.%が, これを構築する為に必要なNQPCORE,正規表現系のQRegex,MoarVMのModuleLoaderなどがMoarVMBytecodeで記述されている.これらMoarVMBytecodeの拡張子は.MoarVMである. %MoarVMに対してStage0のディレクトリにライブラリパスを設定し, nqp.MoarVMを実行させることでnqpの対話型環境が起動する. @@ -140,15 +141,15 @@ \label{fig:nqpbuild} \end{figure*} -NQPのビルドフローを図\ref{fig:nqpbuild}に示す. -RakudoによるPerl6に処理系はNQPにおけるnqpと同様に, moarにライブラリパスなどを設定したperl6というシェルスクリプトである. -このperl6を動かすためにはself buildしたNQPコンパイラが必要となる. -その為にStage0を利用してStage1をビルドしNQPコンパイラを作成する. -Stage1は中間的な出力であり, 生成されたNQPファイルはStage2と同一であるが, MoarVMのバイトコードが異なる. -Perl6では完全なセルフコンパイルを実行したNQPが要求される為, Stage1を利用してもう一度ビルドを行いStage2を作成する. +NQP のビルドフローを図\ref{fig:nqpbuild}に示す. +Rakudo による Perl6 処理系は NQP における nqp と同様に, moar にライブラリパスなどを設定した perl6 というシェルスクリプトである. +この perl6 を動かすためには self build した NQP コンパイラが必要となる. +その為に Stage0 を利用して Stage1 をビルドし NQP コンパイラを作成する. +Stage1 は中間的な出力であり, 生成された NQP ファイルは Stage2 と同一であるが, MoarVM のバイトコードが異なる. +Perl6 では完全なセルフコンパイルを実行した NQP が要求される為, Stage1 を利用してもう一度ビルドを行い Stage2 を作成する. -Perl6のテストスイートであるRoastやドキュメントなどによって設計が定まっているPerl6とは異なりNQP自身の設計は今後も変更になる可能性が開発者から公表されている. -現在の公表されているNQPのオペコードはNQPのリポジトリに記述されているものである. +Perl6 のテストスイートであるRoastやドキュメントなどによって設計が定まっている Perl6 とは異なり NQP 自身の設計は今後も変更になる可能性が開発者から公表されている. +現在の公表されている NQP のオペコードは NQP のリポジトリに記述されているものである. %\subsection{Rakudo Perl6} @@ -162,15 +163,14 @@ 通常 Ruby のようなスクリプト言語ではまず YARVなどのプロセスVM が起動し,その後スクリプトを Byte code に変換して実行という手順を踏む. Rakudo はインタプリタの起動時間及び、 全体的な処理時間が他のスクリプト言語と比較して非常に低速である. これは Rakudo 自体が Perl6 と NQP で書かれているため, MoarVMを起動し, Rakudo と NQP のByte codeを読み取り, Rakudoを起動し, その後スクリプトを読み取り, スクリプトの Byte code 変換というような手順で進むためである. -また Raku は実行時の情報が必要であり, メソッドを実行する際に invoke が走ることも遅い原因である. +また Perl6 は実行時の情報が必要であり, メソッドを実行する際に invoke が走ることも遅い原因である. \section{Perl6によるAbyssの実装} - 提案手法で実装したAbyss サーバーは Perl6 で書かれているクライアント側から投げられた Perl6 を実行するためのサーバーである. 図3は Abyss サーバーを用いたスクリプト言語実行手順である. -Abyss サーバーはユーザーがPerl6を直接立ち上げるのではなく,まず図3右側のAbyssサーバーを起動し,ユーザーはAbyssサーバーにファイルパスをソケット通信で送り,Abyssサーバーがファイルを開き実行し,その実行結果をユーザーに返す. +Abyss サーバーはユーザーが Perl6 を直接立ち上げるのではなく, まず図3右側の Abyss サーバーを起動し, ユーザーは Abyss サーバーにファイルパスをソケット通信で送り, Abyss サーバーがファイルを開き実行し, その実行結果をユーザーに返す. -この手法を用いることで, サーバー上で事前に起動した Rakudo を再利用し, 投げられた Raku スクリプトの実行を行うため, Rakudo の全体的な処理時間を短縮できると推測できる. +この手法を用いることで, サーバー上で事前に起動した Rakudo を再利用し, 投げられた Perl6 スクリプトの実行を行うため, Rakudo の全体的な処理時間を短縮できると推測できる. \begin{figure}[H] @@ -179,20 +179,21 @@ \end{center} \caption{Abyssサーバーを用いたスクリプト言語実行手順} \label{fig:perl6cbcinter} -\end{figure}ccc +\end{figure} Code1はAbyss サーバーのソースコードである. -Abyssサーバーは起動すると,まず自身にファイルパスを転送するためのソケットを生成し,その後ファイルを受け取るための待機ループに入る. +Abyssサーバーは起動すると, まず自身にファイルパスを転送するためのソケットを生成し, その後ファイルを受け取るための待機ループに入る. -Perl6ではEVAL関数[\ref{eval}]があり文字列をPerl6のソースコード自身として評価できる +Perl6 ではEVAL関数[\ref{eval}]があり文字列を Perl6 のソースコード自身として評価できる -Perl6では, EVALは通常は使用できないようになっており, MONKEY-SEE-NO-EVALというpragmaを実行することで使うことができるようになる. -EVALFILEはファイルパスを受け取るとファイル開き, バイト文字列に変換し読み込む,その後読み込んだバイト文字列にデコードし,ファイルパスの文字列を読み込み,ファイルの中身をEVALと同様に解釈する. -Code1の2行目にあるMONKEY−SEE−NO−EVALはRaku上でEVALFILEを使用可能にするpragmaである. +Perl6 では, EVALは通常は使用できないようになっており, MONKEY-SEE-NO-EVAL という pragma を実行することで使うことができるようになる. +EVALFILE はファイルパスを受け取るとファイル開き, バイト文字列に変換し読み込む, その後読み込んだバイト文字列にデコードし, ファイルパスの文字列を読み込み, ファイルの中身を EVAL と同様に解釈する. + +Code1 の2行目にある MONKEY−SEE−NO−EVAL は Perl6 上で EVALFILE を使用可能にする pragma である. -\lstinputlisting[label=codeseg, caption=Abyssサーバーの実装のsource code]{code/abyss.p6} -\lstinputlisting[label=codeseg, caption=クライアント側のsource code]{code/client.p6} +\lstinputlisting[label=codeseg, caption= Abyss サーバーの実装の source code ]{code/abyss.p6} +\lstinputlisting[label=codeseg, caption=クライアント側の source code ]{code/client.p6} \lstinputlisting[label=eval, caption=evalのサンプルコード]{code/eval.p6} %通常、自分でプロセス立ち上げてPerl6を実行する際は, %\section{問題点} @@ -202,9 +203,9 @@ \item{Microsoft CLR} .NET Framework には, 共通言語ランタイム(Common Language Runtime)と呼ばれるランタイム環境がある. -.NET対応のソフトウェアは、様々なプログラミング言語で書かれたソースコードから, いったん共通中間言語 ( Common Intermediate Language )による形式に変換されて利用者のもとに配布される. -CIL形式のプログラムを解釈し, コンピュータが直に実行可能な機械語によるプログラムに変換して実行するソフトウェアがCLRである. -現状のAbyssサーバーはprocessとして立ち上げているが, CLRはOSに直接組み込む必要があるが, Abyssサーバーはプロセス上で実行しているためOSに手を加えず実装が容易である. +.NET対応のソフトウェアは, 様々なプログラミング言語で書かれたソースコードから, いったん共通中間言語 (Common Intermediate Language)による形式に変換されて利用者のもとに配布される. +CIL 形式のプログラムを解釈し, コンピュータが直に実行可能な機械語によるプログラムに変換して実行するソフトウェアが CLR である. +現状の Abyss サーバーはプロセスとして立ち上げているが, CLR は OS に直接組み込む必要があるが, Abyss サーバーはプロセス上で実行しているため OS に手を加えず実装が容易である. \item{PyPy} @@ -223,10 +224,10 @@ \begin{itemize} \item コンパイラの起動が遅い言語だけでなく, モジュールの読み込みが遅い言語などを, あらかじめサーバーを側でモジュールを読み込んでおき, それを利用してプログラムを実行する手法も応用できるように改良を行う. -\item 今回の実装ではTCPソケットを用いたがTCPソケットを用いるとサーバーを立ち上げた際に外部からファイルを転送される可能性があるので,Unix domain socketの実装を行い,それを用いたクライアント・サーバーを作成することで安全性が高まると考えた. -Rakuには現状Unix domainソケットの実装がないので、Unix domainソケットを実装し、自分以外が実行できないようにすることが今後の課題に挙げられる. +\item 今回の実装では TCP ソケットを用いたが TCP ソケットを用いるとサーバーを立ち上げた際に外部からファイルを転送される可能性があるので, Unix domain socket の実装を行い, それを用いたクライアント・サーバーを作成することで安全性が高まると考えた. +Perl6 には現状 Unix domain socket の実装がないので, Unix domain socket を実装し, 自分以外が実行できないようにすることが今後の課題に挙げられる. \item 今回用いた Perl6 の EVALFILE 自体にクライアント側に出力を返す実装追加することも今後の課題に挙げられる. -\item 現状のRakuのEVALFILEでは,出力がサーバー側に返っているので,クライアント側から出力を見るためにクライアント側に返す必要がある. +\item 現状の Raku の EVALFILE では, 出力がサーバー側に返っているので, クライアント側から出力を見るためにクライアント側に返す必要がある. \item モジュールを送信する機能の追加 \item プログラムの実行終了したらモジュールを削除する機能の追加\\