# HG changeset patch # User Kaito Okura # Date 1599907453 -32400 # Node ID 0f06e504ca3223ce704aa87894cd431f09bc457f # Parent 8ab9e372edfadf1722ee8c7a6baf920282482acd Add tex file. diff -r 8ab9e372edfa -r 0f06e504ca32 images/abyss.pdf Binary file images/abyss.pdf has changed diff -r 8ab9e372edfa -r 0f06e504ca32 midterm.pdf Binary file midterm.pdf has changed diff -r 8ab9e372edfa -r 0f06e504ca32 midterm.tex --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/midterm.tex Sat Sep 12 19:44:13 2020 +0900 @@ -0,0 +1,59 @@ +\documentclass[9.5pt,twocolumn,twoside,uplatex]{jsarticle} +\usepackage{fancyhdr} +\usepackage[dvipdfmx]{graphicx} + +\lhead{琉球大学主催 工学部情報工学科 中間発表予稿} +\rhead{} +\cfoot{} + +\begin{document} +\title{Rakuのサーバーを使った実行} +\author{175748C 氏名: 大蔵 海斗 指導教員: 河野 真治} +\date{2020/09} +\maketitle + +\thispagestyle{fancy} + +\section{Rakuの高速実行} +現在開発の進んでいる言語にスクリプト言語のRakuがある. Rakuは起動時間がPerl5やPython, Rubyなどの主要なスクリプト言語に比べて非常に低速である. +本研究では, この問題を解決するために, 予めRakuのコンパイラを立ち上げたサーバーを立ち上げ, そのサーバー上でコンパイルを行う手法の提案を行う. + +\section{Raku} +Rakuは元はPerl5の後継言語のPerl6として開発されていたが, 言語仕様及び処理実装がPerl5と大幅に異なっており, 言語的な互換性が存在しない. 従って現在ではRakuとPerl5は別言語としての開発方針になっている. Rakuという名称は, 現在有力な処理系であるRakudoが由来となっている. +Rakuの言語的な特徴としては, 独自にRakuの文法の拡張が可能なGrammar, Perl5と比較した場合のオブジェクト指向言語としての進化も見られる. またPerl6は漸進的型付け言語である. 従来のPerlの様に変数に代入する対象の型や, 文脈に応じて型を変更する動的型言語としての側面を持ちつつ, 独自に定義した型を始めとする様々な型に, 静的に変数の型を設定する事が可能である. +Rakuの起動は, MoarVMを起動, nqpをロード, Rakudoをロードもしくはコンパイルし, その後 JITしながら実行する. + +\section{Rakudo} +RakudoとはRakuの現在の主流な実装である. (Rakuは言語名, Rakudoはコンパイラ) +Rakuは仕様と実装が明確に区分されており, Rakudoという実装, roastというRakuの仕様 (テストスイートがある). +Rakudoの構成は, MoarVMと呼ばれるRakudoのために構築されたVM, NQPと呼ばれるRakuのサブセット, NQPとRaku地震で記述されたRakuである. RakudoはMoarVMの他にJVMやJavaScriptを動作環境として選択可能である. + +\section{MoarVM} +MoarVMはRakudo, NQPのために構築されたVMである. C言語で実装されている. JITコンパイルなどが現在導入されているが, 起動時間が低速であるなどの問題がある. MoarVM独自のByteCodeがあり, NQPからこれを出力する機能などが存在している. +MoarVMはNQPとByteCodeを解釈する. + +\section{NQP} +NQPとはNot Quite Perlの略でRakuのサブセットである. その為基本的な文法などはRakuに準拠しているが,変数を束縛で宣言するなどの違いが見られる. このNQPで記述されたRakuの事をRakudoと呼ぶ. +RakudoにおけるNQPは現在MoarVM, JVM上で動作する.NQPは最終的にはNQP自身でブートストラップする言語であるが, ビルドの最初にはすでに書かれたMoarVMのバイトコードを必要とする.Rakuの一部はNQPを拡張したもので書かれている為, Rakudoを動作させる為にはMoarVMなどのVM, VMに対応させる様にビルドしたNQPがそれぞれ必要となる. + +\section{Rakuが遅い原因} +通常, Rubyのようなスクリプト言語ではまずVMが起動し, その後スクリプトをバイトコードに変換して実行という手順を踏む. +対してRakuは, コンパイラのRakudo自体がRakuとNQPで書かれているため, MoarVMを起動し, RakudoとNQPのバイトコードを読み取り, Rakudoを起動し, その後スクリプトをバイトコードに変換して実行という手順を踏む. +そのため, Rakudoはインタプリタの起動時間及び、全体的な処理時間が他のスクリプト言語と比較して非常に低速である. +また, Rakuは実行時の情報が必要であり, メソッドを実行する際にinvokeが走ることも遅い原因である. invokeはMoarVMのmethod呼び出しのバイトコードである. + +\section{Abyssサーバー} +Abyssサーバーはクライアント側から投げられたRakuスクリプトを実行するためのサーバーである. AbyssサーバーはユーザーがRakuを直接立ち上げるのではなく, まず同一ホスト内でAbyssサーバーを起動し, ユーザーはAbyssサーバーにファイルパスをソケット通信で送り, Abyssサーバーがファイルを開き実行し, その実行結果をユーザーに返す. +この手法を用いることで, サーバー上で事前に起動したRakudoを再利用し, 投げられたRakuスクリプトの実行を行うため, Rakudoの起動時間を短縮できると推測できる. + +\begin{figure}[h] + \begin{center} + \includegraphics[width=80mm]{images/abyss.pdf} + \end{center} + \caption{Abyssサーバーを用いたRakuの実行} + \label{fig:perl6cbcinter} +\end{figure} + +\section{Abyssサーバーの課題} + +\end{document}