# HG changeset patch # User Fukuda Kouki # Date 1571813988 -32400 # Node ID 10b5e6b8583dc1c748fa376edd0008096d60aaea # Parent 82b28040bb64ddf451867bc7e8f06cca8a41893a midterm(仮) diff -r 82b28040bb64 -r 10b5e6b8583d midterm/.DS_Store Binary file midterm/.DS_Store has changed diff -r 82b28040bb64 -r 10b5e6b8583d midterm/code/abyss.p6 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/midterm/code/abyss.p6 Wed Oct 23 15:59:48 2019 +0900 @@ -0,0 +1,15 @@ +unit class Abyss::Server:ver<0.0.1>; +use MONKEY-SEE-NO-EVAL; + +method readeval { + my $listen = IO::Socket::INET.new( :listen, + :localhost, + :localport(3333) ); + loop { + my $conn = $listen.accept; + while my $buf = $conn.read(1024) { + EVALFILE $buf.decode; + } + $conn.close; + } +} diff -r 82b28040bb64 -r 10b5e6b8583d midterm/images/abyss.pdf Binary file midterm/images/abyss.pdf has changed diff -r 82b28040bb64 -r 10b5e6b8583d midterm/midterm.aux --- a/midterm/midterm.aux Tue Oct 22 16:11:42 2019 +0900 +++ b/midterm/midterm.aux Wed Oct 23 15:59:48 2019 +0900 @@ -1,11 +1,18 @@ \relax +\@writefile{toc}{\contentsline {section}{\numberline {1}スクリプト言語の高速実行}{1}} +\@writefile{toc}{\contentsline {section}{\numberline {2}Raku}{1}} +\@writefile{toc}{\contentsline {section}{\numberline {3}MoarVM}{1}} +\@writefile{toc}{\contentsline {section}{\numberline {4}NQP}{1}} +\@writefile{toc}{\contentsline {section}{\numberline {5}なぜRakuは遅いのか}{1}} +\@writefile{toc}{\contentsline {section}{\numberline {6}Abyssサーバー}{1}} \bibcite{キー1}{1} \bibcite{キー2}{2} +\bibcite{キー3}{3} \citation{*} \bibstyle{junsrt} \bibdata{reference} -\@writefile{toc}{\contentsline {section}{\numberline {1}研究目的}{1}} -\@writefile{toc}{\contentsline {section}{\numberline {2}Raku}{1}} -\@writefile{toc}{\contentsline {section}{\numberline {3}MoarVM}{1}} -\@writefile{toc}{\contentsline {section}{\numberline {4}Perl6サーバーの実行}{1}} -\@writefile{toc}{\contentsline {section}{\numberline {5}まとめ}{1}} +\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces Abyssサーバーを用いたスクリプト言語実行の状態遷移}}{2}} +\newlabel{fig:perl6cbcinter}{{1}{2}} +\newlabel{codeseg}{{1}{2}} +\@writefile{lol}{\contentsline {lstlisting}{\numberline {1}Abyssサーバーのsource code}{2}} +\@writefile{toc}{\contentsline {section}{\numberline {7}まとめ}{2}} diff -r 82b28040bb64 -r 10b5e6b8583d midterm/midterm.log --- a/midterm/midterm.log Tue Oct 22 16:11:42 2019 +0900 +++ b/midterm/midterm.log Wed Oct 23 15:59:48 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) 22 OCT 2019 16:09 +This is e-pTeX, Version 3.14159265-p3.6-141210-2.6 (utf8.euc) (TeX Live 2015) (preloaded format=platex 2016.4.14) 23 OCT 2019 15:43 entering extended mode restricted \write18 enabled. file:line:error style messages enabled. @@ -179,6 +179,15 @@ LaTeX Info: Redefining \nocite on input line 332. Package: cite 2015/02/27 v 5.5 ) +(/usr/local/texlive/2015/texmf-dist/tex/latex/here/here.sty) +(/usr/local/texlive/2015/texmf-dist/tex/latex/float/float.sty +Package: float 2001/11/08 v1.3d Float enhancements (AL) +\c@float@type=\count123 +\float@exts=\toks17 +\float@box=\box52 +\@float@everytoks=\toks18 +\@floatcapt=\box53 +) LaTeX Warning: Unused global option(s): [9.5pt]. @@ -186,37 +195,37 @@ (./midterm.aux) \openout1 = `midterm.aux'. -LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 38. -LaTeX Font Info: ... okay on input line 38. -LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 38. -LaTeX Font Info: ... okay on input line 38. -LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 38. -LaTeX Font Info: ... okay on input line 38. -LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 38. -LaTeX Font Info: ... okay on input line 38. -LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 38. -LaTeX Font Info: ... okay on input line 38. -LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 38. -LaTeX Font Info: ... okay on input line 38. -LaTeX Font Info: Checking defaults for JY1/mc/m/n on input line 38. -LaTeX Font Info: ... okay on input line 38. -LaTeX Font Info: Checking defaults for JT1/mc/m/n on input line 38. -LaTeX Font Info: ... okay on input line 38. -\c@lstlisting=\count123 +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 40. +LaTeX Font Info: ... okay on input line 40. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 40. +LaTeX Font Info: ... okay on input line 40. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 40. +LaTeX Font Info: ... okay on input line 40. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 40. +LaTeX Font Info: ... okay on input line 40. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 40. +LaTeX Font Info: ... okay on input line 40. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 40. +LaTeX Font Info: ... okay on input line 40. +LaTeX Font Info: Checking defaults for JY1/mc/m/n on input line 40. +LaTeX Font Info: ... okay on input line 40. +LaTeX Font Info: Checking defaults for JT1/mc/m/n on input line 40. +LaTeX Font Info: ... okay on input line 40. +\c@lstlisting=\count124 LaTeX Font Info: External font `cmex10' loaded for size -(Font) <12> on input line 43. +(Font) <12> on input line 45. LaTeX Font Info: External font `cmex10' loaded for size -(Font) <8> on input line 43. +(Font) <8> on input line 45. LaTeX Font Info: External font `cmex10' loaded for size -(Font) <6> on input line 43. +(Font) <6> on input line 45. LaTeX Font Info: Font shape `JT1/mc/bx/n' in size <14.4> not available -(Font) Font shape `JT1/gt/m/n' tried instead on input line 47. +(Font) Font shape `JT1/gt/m/n' tried instead on input line 49. LaTeX Font Info: Font shape `JY1/mc/bx/n' in size <14.4> not available -(Font) Font shape `JY1/gt/m/n' tried instead on input line 47. - -No file midterm.bbl. +(Font) Font shape `JY1/gt/m/n' tried instead on input line 49. +File: images/abyss.pdf Graphic file (type pdf) + File: ./images/emblem-bitmap.pdf Graphic file (type pdf) -<./images/emblem-bitmap.pdf> + <./images/emblem-bitmap.pdf> Package Fancyhdr Warning: \headheight is too small (0.0pt): Make it at least 20.37784pt. @@ -226,14 +235,35 @@ [1 -] (./midterm.aux) ) +] (./code/abyss.p6 +LaTeX Font Info: Try loading font information for OML+cmr on input line 1. + +(/usr/local/texlive/2015/texmf-dist/tex/latex/base/omlcmr.fd +File: omlcmr.fd 2014/09/29 v2.5h Standard LaTeX font definitions +) +LaTeX Font Info: Font shape `OML/cmr/m/n' in size <10> not available +(Font) Font shape `OML/cmm/m/it' tried instead on input line 1. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <7> on input line 2. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <5> on input line 2. +LaTeX Font Info: Try loading font information for OMS+cmr on input line 4. + +(/usr/local/texlive/2015/texmf-dist/tex/latex/base/omscmr.fd +File: omscmr.fd 2014/09/29 v2.5h Standard LaTeX font definitions +) +LaTeX Font Info: Font shape `OMS/cmr/m/n' in size <10> not available +(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 4. +) +No file midterm.bbl. +[2] (./midterm.aux) ) Here is how much of TeX's memory you used: - 2377 strings out of 493777 - 31412 string characters out of 6151334 - 100133 words of memory out of 5000000 - 5885 multiletter control sequences out of 15000+600000 + 2492 strings out of 493777 + 33160 string characters out of 6151334 + 246407 words of memory out of 5000000 + 5978 multiletter control sequences out of 15000+600000 13101 words of font info for 51 fonts, out of 8000000 for 9000 929 hyphenation exceptions out of 8191 - 27i,15n,43p,274b,366s stack positions out of 5000i,500n,10000p,200000b,80000s + 28i,15n,43p,238b,1178s stack positions out of 5000i,500n,10000p,200000b,80000s -Output written on midterm.dvi (1 page, 5408 bytes). +Output written on midterm.dvi (2 pages, 12724 bytes). diff -r 82b28040bb64 -r 10b5e6b8583d midterm/midterm.pdf Binary file midterm/midterm.pdf has changed diff -r 82b28040bb64 -r 10b5e6b8583d midterm/midterm.synctex.gz Binary file midterm/midterm.synctex.gz has changed diff -r 82b28040bb64 -r 10b5e6b8583d midterm/midterm.tex --- a/midterm/midterm.tex Tue Oct 22 16:11:42 2019 +0900 +++ b/midterm/midterm.tex Wed Oct 23 15:59:48 2019 +0900 @@ -6,6 +6,7 @@ \usepackage{bussproofs} \usepackage{listings,jlisting} \usepackage{cite} +\usepackage{here} \lhead{\parpic{\includegraphics[height=1zw,keepaspectratio,bb=0 0 251 246]{./images/emblem-bitmap.pdf}}琉球大学主催 工学部情報工学科 中間発表予稿} \rhead{} \cfoot{} @@ -19,6 +20,7 @@ \setlength{\textheight}{261mm} \setlength{\footskip}{0mm} \pagestyle{empty} +\renewcommand{\lstlistingname}{Code} \lstset{ frame=single, @@ -36,47 +38,90 @@ \begin{document} -\title{Raku(Perl6) のサーバーを使った実行 \\ -Running Raku(Perl6) using Raku server} +\title{Raku(Perl6) のサーバーを使った高速実行 \\ +Running Raku using Raku server} \author{165727F 氏名: 福田 光希 指導教員: 河野 真治} \date{2019/10} \maketitle \thispagestyle{fancy} -\section{研究目的} +\section{スクリプト言語の高速実行} -Perl5の後継言語として,Rakuが開発されている. -RakuはMoarVMというVM上で動作するが,起動時間がPerl5やPython,Rubyなどの主要なスクリプト言語に比べて非常に遅い. -その為,本研究ではRakuプログラムの新たな実行手法の提案,またOS上でスクリプト言語を実行する最適な方法の見直し,スクリプト言語をサーバーで実行する利点と欠点の考察を行う。 +スクリプト言語RakuはMoarVMというVM上で動作するが,起動時間がPerl5やPython,Rubyなどの主要なスクリプト言語に比べて非常に低速である.この問題を解決するために,Rakuプログラムの,サーバーを用いた実行手法の提案を行う. +ここでいうサーバーとは転送したスクリプトを実行する環境のことである. + +またサーバーでは,サーバーに投げられたRakuをコンパイラで実行する際に,そのスクリプトが次に実行するスクリプトに影響を与えないことを保証する必要がある. +この問題を解決するために,サーバーのコンテナ化を行う. \section{Raku} -Perlの現在の主流な実装はRakudoである.RakudoはMoarVM,とNQPと呼ばれるPerl6のサブセット,NQPで記述されたPerl6という構成である. +Rakuの現在の主流な実装はRakudoである.RakudoはMoarVM,とNQPと呼ばれるRakuのサブセット,NQPとRaku自身で記述されたRakuという構成である. MoarVMはNQPを解釈する. -このNQPで記述されたPerl6の事をRakudoと呼ぶ. + +NQP とは Not Quite Perl の略で Raku のサブセットである.その為基本的な文 法などは Raku に準拠しているが,変数を束縛で宣言する などの違いが見られる. + +このNQPで記述されたRakuの事をRakudoと呼ぶ. RakudoはMoarVMの他にJVM,Javascriptを動作環境として選択可能である. -言語的な特徴ではPerl5とは違いオブジェクト指向のサポートが強力になり,漸進的型付け言語としての特徴を持つ. -現状のPerl6の実行はPerl6で記述されたコンパイラをloadしてJITしながら実行すること自体に時間がかかっている。 +Rakuの起動は,MoarVMを起動,nqpをロード,Rakudoをロードもしくはコンパイルし,その後JITしながら実行する. \section{MoarVM} -MoarVM は Perl6 に特化した VM である.C言語で実装されている. JITコンパイルなどが現在導入されているが,起動時間などが低速である問題がある. MoarVM 独自の ByteCode があり, NQP からこれを出力する機能などが存在している. +MoarVM は Raku に特化した VM である.C言語で実装されている. JITコンパイルなどが現在導入されているが,起動時間などが低速である問題がある. MoarVM 独自の ByteCode があり, NQP からこれを出力する機能などが存在している. + +\section{NQP} +NQPとはRakuのサブセットである. +その為基本的な文法などはRakuに準拠しているが,変数を束縛で宣言するなどの違いが見られる. + +NQPは最終的にはNQP自身でブートストラップする言語であるが,ビルドの最初にはすでに書かれたMoarvMByteCodeを必要とする. +このMoarVMByteCodeの状態をStage0と言う. +Rakuの一部はNQPを拡張したもので書かれている為,Rakudoを動作させる為にはMoarVMなどのVM,VMに対応させる様にビルドしたNQPがそれぞれ必要となる. +NQPは与えられたStage0を使いStage1をビルドし,そのStage1を利用しStage2をビルドする事で生成できる. + +\section{なぜRakuは遅いのか} +通常Rubyのようなスクリプト言語ではまずrubyVMが起動し,その後スクリプトをByte code に変換して実行という手順を踏む. +Rakudo はインタプリタの起動時間及び、 全体的な処理時間が他のスクリプト言語と比較して非常に低速である。 +これはRakudo自体がRakuで書かれているため,MoarVMを起動し,RakudoとNQP をコンパイルし,その後スクリプトのByte code変換というような手順で進むためである。 + -\section{Perl6サーバーの実行} -%通常、自分でプロセス立ち上げてPerl6実行する際は, +\section{Abyssサーバー} +ここではAbyssサーバーについて説明する.AbyssサーバーはRakuで書かれている. +図1はAbyssサーバーを用いたスクリプト言語実行の状態遷移図である. AbyssサーバーはユーザーがRakuを実行する際,クライアント側から転送されてきたファイルを事前に起動してあるサーバー側が処理し,その実行結果を返す構造となっている. + +この手法を用いることで,サーバー上で事前にRakudoを起動したRakudoを再利用し,投げられたRakuスクリプトの実行を行うためRakudoの起動時間を短縮できると推測できる. + +\begin{figure}[H] + \begin{center} + \includegraphics[width=80mm]{images/abyss.pdf} + \end{center} + \caption{Abyssサーバーを用いたスクリプト言語実行の状態遷移} + \label{fig:perl6cbcinter} +\end{figure} + +Code1はAbyss サーバーの自身のソースコードである. +Abyssサーバーは起動すると,まず自身にファイルを転送するためのソケットを生成し,その後ファイルを受け取るための待機ループに入る. +ファイルが送られてきた際はファイルの中身をバッファーに変換し読み込む,その後読み込んだバッファーを文字列にデコードし,文字列を式として評価するEVALを用いて,プログラムを実行する. +Code1の2行目にあるMONKEY−SEE−NO−EVALはRaku上でEVALを使用可能にするpragmaである. +現状のRakuのEVALFILEでは,出力がサーバー側に返っているので,クライアント側から出力を見るためにクライアント側に返す必要がある. +\lstinputlisting[label=codeseg, caption=Abyssサーバーのsource code]{code/abyss.p6} +%通常、自分でプロセス立ち上げてPerl6を実行する際は, %\section{問題点} \section{まとめ} 中間予稿までにPerl6スクリプトを投げて実行するサーバーの実装、および「自分でプロセス立ち上げてPerl6実行する手法」と「既にあるサーバーに投げてPerl6スクリプトを実行する手法」の差を測るために時間の計測を行った。 -今回実装したサーバーでは,別のスクリプトを実行する前にサーバーの状態を初期状態にリフレッシュできてないので、信頼性が保てていない,この問題を解決するためにサーバーに投げられたPerl6をコンパイラで実行する際のセパレーションを保証する機構を作ることが課題としてあげられる. -また今回実装したサーバーとの通信はTCPソケット通信であり, 現状のPerl6にはUnix domain ソケット通信がないのでUnix domain ソケットを実装する予定である. -加えてUnix domain socket の permission を自分だけが実行できるように書き換える,外部から不正なアクセスを行わせないことも必要である. +今回実装したサーバーでは,別のスクリプトを実行する前にサーバーのコンテナ化をできていないので次回以降の課題とする. +今回の実装ではTCPソケットを用いたがTCPソケットを用いるとサーバーを立ち上げた際に外部からファイルを転送される可能性があるので,Unix domain socketの実装を行い,それを用いたクライアント・サーバーを作成することで安全性が高まると考えた +Rakuには現状Unix domainソケットの実装がないので、Unix domainソケットを実装し、自分以外が実行できないようにすることが今後の課題に挙げられる. +また今回例題として用いたものはスクリプト言語Rakuであったが,その他のスクリプト言語にも応用が利くかどうか検討する必要はある + +%またPerl6の機能としてevalfiel があるが現状出力がサーバー上に返ってしまい +%手元に返ってこないので、evalfileの実装を出力が手元に返ってくるように書き換える必要がある \begin{thebibliography}{9} \bibitem{キー1} Andrew Shitov. Perl6 Deep Dive \bibitem{キー2} 清水隆博, 河野真治. CbC を用いた Perl6 処理系. 琉球大学工学部情報工学科平成 30 年度学位論文 (学士), 2018. + \bibitem{キー3} Perl6 Documentation\\{https://docs.perl6.org} (2019/10/22 アクセス) \end{thebibliography} \nocite{*} diff -r 82b28040bb64 -r 10b5e6b8583d midterm/midtermのコピー.pdf Binary file midterm/midtermのコピー.pdf has changed