Mercurial > hg > Papers > 2020 > koo-thesis
changeset 10:242bf93dbbb5
update chapter4 & add chapter5
author | e165727 <e165727@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 14 Feb 2020 23:29:37 +0900 |
parents | 8d771716d419 |
children | c3768c16a27a |
files | Paper/.DS_Store Paper/chapter1.tex Paper/chapter2.tex Paper/chapter3.tex Paper/chapter4.tex Paper/chapter5.tex Paper/code/abyss.p6 Paper/code/client.p6 Paper/main.pdf Paper/main.tex |
diffstat | 10 files changed, 127 insertions(+), 60 deletions(-) [+] |
line wrap: on
line diff
--- a/Paper/chapter1.tex Fri Feb 14 17:12:20 2020 +0900 +++ b/Paper/chapter1.tex Fri Feb 14 23:29:37 2020 +0900 @@ -1,6 +1,9 @@ \chapter{序論} +\pagenumbering{arabic} + %序論の目安としては1枚半ぐらい. %英語発表者は,最終予稿の「はじめに」の英訳などを載せてもいいかも. + \section{背景と目的} %\section{ Perl6 の起動時間の改善}
--- a/Paper/chapter2.tex Fri Feb 14 17:12:20 2020 +0900 +++ b/Paper/chapter2.tex Fri Feb 14 23:29:37 2020 +0900 @@ -1,18 +1,18 @@ -\chapter{Perl6} +\chapter{ Raku の概要} -\section{Perl6 の概要} -Perl6 は 2002 年に LarryWall が Perl を置き換える言語として設計を開始した. Perl5 の言語的な問題点であるオブジェクト指向機能の強力なサポートなどを取り入れた言語として設計された. Perl5 は設計と実装が同一であり, Larry らによって書かれた C 実装のみだった. Perl6 は設計と実装が分離している. 言語的な特徴としては, 独自に Perl6 の文法の拡張が可能な Grammar, Perl5 と比較した場合のオブジェクト指向言語としての進化も見られる. また Perl6 は漸進的型付け言語である. 従来の Perl の様に変数に代入する対象の型や, 文脈に応じて型を変更する動的型言語としての側面を持ちつつ, 独自に定義した型を始めとする様々な型に, 静的に変数の型を設定する事が可能である. -Perl6 は言語仕様及び処理実装が Perl5 と大幅に異なっており, 言語的な互換性が存在しない. 従って現在では Perl6 と Perl5 は別言語としての開発方針になっている. Perl6 は現在有力な処理系である Rakudo から名前を取り Raku という別名がつけられている. +\section{ Raku } +Raku は 2002 年に LarryWall が Perl を置き換える言語として設計を開始した. Perl5 の言語的な問題点であるオブジェクト指向機能の強力なサポートなどを取り入れた言語として設計された. Perl5 は設計と実装が同一であり, Larry らによって書かれた C 実装のみだった. Raku は設計と実装が分離している. 言語的な特徴としては, 独自に Raku の文法の拡張が可能な Grammar, Perl5 と比較した場合のオブジェクト指向言語としての進化も見られる. また Perl6 は漸進的型付け言語である. 従来の Perl の様に変数に代入する対象の型や, 文脈に応じて型を変更する動的型言語としての側面を持ちつつ, 独自に定義した型を始めとする様々な型に, 静的に変数の型を設定する事が可能である. +Raku は元々は Perl6 という名称であったが, 言語仕様及び処理実装が Perl5 と大幅に異なっており, 言語的な互換性が存在しない. 従って現在では Perl6 と Perl5 は別言語としての開発方針になっている. Raku は現在有力な処理系である Rakudo から名前を取り Raku という別名がつけられている. -Perl6 の現在の主流な実装は Rakudo である. Rakudo は MoarVM, と NQP と呼ばれる Perl6 のサブセット, NQPと Perl6 自身で記述された Perl6 という構成である. +Raku の現在の主流な実装は Rakudo である. Rakudo は MoarVM, と NQP と呼ばれる Raku のサブセット, NQPと Raku 自身で記述された Raku という構成である. MoarVM は NQP と Byte Code を解釈する. -NQP とは Not Quite Perl の略で Perl6 のサブセットである. その為基本的な文法などは Perl6 に準拠しているが, 変数を束縛で宣言するなどの違いが見られる. +NQP とは Not Quite Perl の略で Raku のサブセットである. その為基本的な文法などは Raku に準拠しているが, 変数を束縛で宣言するなどの違いが見られる. -この NQP で記述された Perl6 の事を Rakudo と呼ぶ. +この NQP で記述された Raku の事を Rakudo と呼ぶ. Rakudo は MoarVM の他に JVM , Javascript を動作環境として選択可能である. -Perl6 の起動は, MoarVM を起動, NQP をロード, Rakudo をロードもしくはコンパイルし, その後 JIT しながら実行する. +Raku の起動は, MoarVM を起動, NQP をロード, Rakudo をロードもしくはコンパイルし, その後 JIT しながら実行する. \begin{figure}[H] \begin{center} @@ -23,7 +23,7 @@ \end{figure} \section{MoarVM} -MoarVM は Perl6 に特化した VM である. C 言語で実装されている. JIT コンパイルなどが現在導入されているが, 起動時間などが低速である問題がある. MoarVM 独自の ByteCode があり, NQP からこれを出力する機能などが存在している. +MoarVM は Raku に特化した VM である. C 言語で実装されている. JIT コンパイルなどが現在導入されているが, 起動時間などが低速である問題がある. MoarVM 独自の ByteCode があり, NQP からこれを出力する機能などが存在している. \section{NQP} \begin{comment} @@ -73,3 +73,9 @@ %前述した通りRakudo Perl6はPerl6のサブセットであるNQPを用いて記述されている. %従ってyaccやlexと言ったPerl5の文字解析, 構文解析に利用していたプログラムは利用せず, NQP側で構文定義などを行っている. %NQPはNQP自身でBootstrappingされている為, Rakudo Perl6のbuild時にはNQPの実行環境として要したVM, それに基づいてbuildしたNQPがそれぞれ必要となる. + +\section{なぜ Raku は遅いのか} +通常 Ruby のようなスクリプト言語ではまず YARVなどのプロセスVM が起動し,その後スクリプトを Byte code に変換して実行という手順を踏む. +Rakudo はインタプリタの起動時間及び, 全体的な処理時間が他のスクリプト言語と比較して非常に低速である. +これは Rakudo 自体が Perl6 と NQP で書かれているため, MoarVMを起動し, Rakudo と NQP のByte codeを読み取り, Rakudoを起動し, その後スクリプトを読み取り, スクリプトの Byte code 変換というような手順で進むためである. +また Perl6 は実行時の情報が必要であり, メソッドを実行する際に invoke が走ることも遅い原因である.
--- a/Paper/chapter3.tex Fri Feb 14 17:12:20 2020 +0900 +++ b/Paper/chapter3.tex Fri Feb 14 23:29:37 2020 +0900 @@ -1,11 +1,5 @@ -\chapter{Abyss Server} -\section{なぜ Perl6 は遅いのか} -通常 Ruby のようなスクリプト言語ではまず YARVなどのプロセスVM が起動し,その後スクリプトを Byte code に変換して実行という手順を踏む. -Rakudo はインタプリタの起動時間及び, 全体的な処理時間が他のスクリプト言語と比較して非常に低速である. -これは Rakudo 自体が Perl6 と NQP で書かれているため, MoarVMを起動し, Rakudo と NQP のByte codeを読み取り, Rakudoを起動し, その後スクリプトを読み取り, スクリプトの Byte code 変換というような手順で進むためである. -また Perl6 は実行時の情報が必要であり, メソッドを実行する際に invoke が走ることも遅い原因である. - -\section{Perl6によるAbyssの実装} +\chapter{Raku によるAbyss の実装} +\section{サーバーの構成} 提案手法で実装したAbyss サーバーは Perl6 で書かれているクライアント側から投げられた Perl6 を実行するためのサーバーである. 図3は Abyss サーバーを用いたスクリプト言語実行手順である. Abyss サーバーはユーザーが Perl6 を直接立ち上げるのではなく, まず図3右側の Abyss サーバーを起動し, ユーザーは Abyss サーバーにファイルパスをソケット通信で送り, Abyss サーバーがファイルを開き実行し, その実行結果をユーザーに返す. @@ -35,6 +29,7 @@ \lstinputlisting[label=code3, caption=evalのサンプルコード]{code/eval.p6} %通常、自分でプロセス立ち上げてPerl6を実行する際は, %\section{問題点} + \section{比較} \begin{itemize} \item{Microsoft CLR} @@ -51,22 +46,4 @@ PyPy は JIT コンパイル を採用しており, 実行時にコードを機械語にコンパイルして効率的に実行させることができる. PyPy は Cpython より実行速度が速いが起動速度は Cpython と比較して約3倍遅い. Perl6 と同様, PyPyは Cpython と比較して起動時間が遅いため今回提案した手法を応用できると予測できる. -\end{itemize} -\section{まとめ} -本稿では実行する Perl6 ファイル名をサーバーに転送し,コンパイラサーバーでコンパイルを行い実行することで全体的に処理時間が早くなることを示した. -\\ -今後Abyssサーバーでの開発をより深く行っていくにあたって以下のような改善点が見られた \\ -\begin{itemize} -\item コンパイラの起動が遅い言語だけでなく, モジュールの読み込みが遅い言語などを, あらかじめサーバーを側でモジュールを読み込んでおき, それを利用してプログラムを実行する手法も応用できるように改良を行う. -\item 今回の実装では TCP ソケットを用いたが TCP ソケットを用いるとサーバーを立ち上げた際に外部からファイルを転送される可能性があるので, Unix domain socket の実装を行い, それを用いたクライアント・サーバーを作成することで安全性が高まると考えた. -Perl6 には現状 Unix domain socket の実装がないので, Unix domain socket を実装し, 自分以外が実行できないようにすることが今後の課題に挙げられる. -\item 今回用いた Perl6 の EVALFILE 自体にクライアント側に出力を返す実装追加することも今後の課題に挙げられる. -\item 現状の Raku の EVALFILE では, 出力がサーバー側に返っているので, クライアント側から出力を見るためにクライアント側に返す必要がある. -\item モジュールを送信する機能の追加 -\item プログラムの実行終了したらモジュールを削除する機能の追加\\ -\end{itemize} -%またscript言語をサーバー上で実行する場合の欠点については以下のようなものが見られる -%\begin{itemize} -%\item -%\end{itemize} -今後の開発を行っていくにあたって, 他の Python のような script 言語にも応用できるように開発を行っていく. +\end{itemize} \ No newline at end of file
--- a/Paper/chapter4.tex Fri Feb 14 17:12:20 2020 +0900 +++ b/Paper/chapter4.tex Fri Feb 14 23:29:37 2020 +0900 @@ -1,1 +1,2 @@ -\chapter{Abyss Server の評価} +\chapter{Abyss Server の性能評価} +\section{利点と欠点}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Paper/chapter5.tex Fri Feb 14 23:29:37 2020 +0900 @@ -0,0 +1,19 @@ +\chapter{結論} +\section{まとめ} +本稿では実行する Perl6 ファイル名をサーバーに転送し,コンパイラサーバーでコンパイルを行い実行することで全体的に処理時間が早くなることを示した. +\\ +今後Abyssサーバーでの開発をより深く行っていくにあたって以下のような改善点が見られた \\ +\begin{itemize} +\item コンパイラの起動が遅い言語だけでなく, モジュールの読み込みが遅い言語などを, あらかじめサーバーを側でモジュールを読み込んでおき, それを利用してプログラムを実行する手法も応用できるように改良を行う. +\item 今回の実装では TCP ソケットを用いたが TCP ソケットを用いるとサーバーを立ち上げた際に外部からファイルを転送される可能性があるので, Unix domain socket の実装を行い, それを用いたクライアント・サーバーを作成することで安全性が高まると考えた. +Perl6 には現状 Unix domain socket の実装がないので, Unix domain socket を実装し, 自分以外が実行できないようにすることが今後の課題に挙げられる. +\item 今回用いた Perl6 の EVALFILE 自体にクライアント側に出力を返す実装追加することも今後の課題に挙げられる. +\item 現状の Raku の EVALFILE では, 出力がサーバー側に返っているので, クライアント側から出力を見るためにクライアント側に返す必要がある. +\item モジュールを送信する機能の追加 +\item プログラムの実行終了したらモジュールを削除する機能の追加\\ +\end{itemize} +%またscript言語をサーバー上で実行する場合の欠点については以下のようなものが見られる +%\begin{itemize} +%\item +%\end{itemize} +今後の開発を行っていくにあたって, 他の Python のような script 言語にも応用できるように開発を行っていく.
--- a/Paper/code/abyss.p6 Fri Feb 14 17:12:20 2020 +0900 +++ b/Paper/code/abyss.p6 Fri Feb 14 23:29:37 2020 +0900 @@ -1,17 +1,34 @@ -unit class Abyss::Server:ver<0.0.1>; +use v6.c; +unit class Abyss::Server:ver<0.0.1>:auth<cpan:ANATOFUZ>; use MONKEY-SEE-NO-EVAL; +use IO::Socket::Unix; +use NativeCall; + +sub close(int32) returns int32 is native { ... } +sub dup(int32 $old) returns int32 is native { ... } +sub dup2(int32 $new, int32 $old) returns int32 is native { ... } -method readeval { - my $listen = IO::Socket::INET.new( - :listen, - :localhost<localhost>, - :localport(3333) - ); - loop { - my $conn = $listen.accept; - while my $buf = $conn.read(1024) { - EVALFILE $buf.decode; +method readeval +{ + my $listen = IO::Socket::Unix.new( :listen, + :localhost<localhost>, + :localport(3333) ); + my $backup = dup(1); + say DateTime.now; + + loop + { + my $conn = $listen.accept; + my $sock_msg; + my $buf = $conn.recv(); + $sock_msg = $buf; + close(1); + dup2($conn.native-descriptor(), 1); + EVALFILE $sock_msg; + dup2($backup, 1); + close($backup); + $conn.close; } - $conn.close; - } + + $listen.close; }
--- a/Paper/code/client.p6 Fri Feb 14 17:12:20 2020 +0900 +++ b/Paper/code/client.p6 Fri Feb 14 23:29:37 2020 +0900 @@ -1,5 +1,15 @@ +use IO::Socket::Unix; +use NativeCall; + +sub close(int32) returns int32 is native { ... } +sub dup(int32 $old) returns int32 is native { ... } +sub dup2(int32 $old, int32 $new) returns int32 is native { ... } + my $conn = IO::Socket::INET.new( :host<localhost>, :port(3333) ); -$conn.print: 'FILEPASS'; +$conn.print: 'Absolute file path'; +say $conn.lines; + +$conn.close;
--- a/Paper/main.tex Fri Feb 14 17:12:20 2020 +0900 +++ b/Paper/main.tex Fri Feb 14 23:29:37 2020 +0900 @@ -7,12 +7,37 @@ \usepackage{here} \usepackage{listings} \usepackage{comment} +\usepackage{caption} +\usepackage{url} + +\lstset{ + language={C}, + basicstyle={\footnotesize\ttfamily}, + identifierstyle={\footnotesize}, + commentstyle={\footnotesize\itshape}, + keywordstyle={\footnotesize\bfseries}, + ndkeywordstyle={\footnotesize}, + stringstyle={\footnotesize\ttfamily}, + frame={tb}, + breaklines=true, + columns=[l]{fullflexible}, + numbers=left, + xrightmargin=0zw, + xleftmargin=3zw, + numberstyle={\scriptsize}, + stepnumber=1, + numbersep=1zw, + lineskip=-0.5ex +} + +\def\lstlistlistingname{リスト目次} + \setlength{\itemsep}{-1zh} \title{Rakuのサーバーを使った実行} \icon{ \includegraphics[width=50mm]{fig/ryukyu.pdf} } -\year{令和2年度 卒業論文} +\year{令和元年度 卒業論文} \belongto{琉球大学工学部情報工学科} \author{ 165727F 福田光希\\ 指導教員 {河野真治} } %% @@ -20,43 +45,52 @@ %% Figure 環境中で Table 環境の見出しを表示・カウンタの操作に必要 %% \makeatletter +\renewcommand{\lstlistlistingname}{ソースコード目次} \newcommand{\figcaption}[1]{\def\@captype{figure}\caption{#1}} \newcommand{\tblcaption}[1]{\def\@captype{table}\caption{#1}} \makeatother \setlength\abovecaptionskip{0pt} + \begin{document} - +\pagenumbering{arabic} %ページ番号の表記方法 % タイトル \maketitle \baselineskip 17pt plus 1pt minus 1pt -\pagenumbering{roman} \setcounter{page}{0} \tableofcontents % 目次 \listoffigures % 図目次 \listoftables % 表目次 +\lstlistoflistings %以下のように、章ごとに個別の tex ファイルを作成して、 % main.tex をコンパイルして確認する。 %章分けは個人で違うので下のフォーマットを参考にして下さい。 -% はじめに +% 背景と研究目的 \input{chapter1.tex} -% 基礎概念 +% Rakuの概要 \input{chapter2.tex} -% 実験 + +% RakuによるAbyssの実装 \input{chapter3.tex} -% 他の論文との比較 + +% AbyssServerの性能評価 \input{chapter4.tex} -% 今後の課題 -%\input{future.tex} + +% 結論 +\input{chapter5.tex} + % 参考文献 \input{bibliography.tex} + % 謝辞 \input{thanks.tex} + % 付録 %\input{appendix.tex} + \end{document}