view Slide/Slide.md @ 11:607ada55055a

通常実行と提案手法の比較入れてる途中
author e165727 <e165727@ie.u-ryukyu.ac.jp>
date Wed, 08 Jan 2020 22:40:16 +0900
parents 4627ec7c3d1b
children 172524516d06
line wrap: on
line source

title: Perl6(Raku)のサーバーを使った高速実行
author: Kouki Fukuda, Shinji Kono
profile: 琉球大学

## 研究背景
- 現在開発の進んでいる言語に Raku がある.
スクリプト言語 Raku は任意の VM が選択できるようになっており, 主に利用されている VM に C で書かれた MoarVM が存在する.
- MoarVM は JIT コンパイルなどをサポートしているが, 全体的な起動時間及び処理速度が Perl5 や Python , Ruby などの他のスクリプト言語と比較し非常に低速である.
その為, 現在日本国内では Perl6 は実務としてあまり使われていない.
- Raku の持つ言語機能や型システムは非常に柔軟かつ強力であるため, 実用的な処理速度に達すれば, 言語の利用件数が向上することが期待される.

## 研究概要
- Raku の実装の一つであるRakudoは、Byte code である MoarVM と、それ上で動作する Raku のsubsetであるnqp (Not Quite Perl)上に構成されている。
- 現状のRakuの実行はRakuで記述されたコンパイラをloadしてJITしながら実行すること自体に時間がかかっている。
- そこで, 同一ホスト内で終了せずに実行を続けるサーバープロセスを立ち上げ, このサーバープロセス上で立ち上げておいたコンパイラに実行するファイル名を転送し, サーバー上でコンパイルを行う手法を提案し実装する.

## Raku と他言語の起動時間の比較
- perl6と他言語の起動時間の比較行なった.
- 実行環境

```
macOS Mojave version 10.14.5
メモリ8GB
プロセッサ2.7GHz Intel Core i5

ruby 2.3.7p456
python 2.7.10
raku 2019.03.1
perl5 v5.18.4
```

## Raku と他言語の起動時間の比較
- perl5,ruby,perl6,pythonでhelloworldを出力するだけのプログラムを用いて行なった実行結果である.

```
perl5
real	0m0.011s
user	0m0.004s
sys	0m0.005s
=====

Raku
real	0m0.209s
user	0m0.249s
sys	0m0.048s
====

ruby
real	0m0.131s
user	0m0.083s
sys	0m0.038s
====

python
real	0m0.036s
user	0m0.013s
sys	0m0.021s
====
```

Raku は 最も早いperl5 の約62.25倍起動速度が遅いことがわかる.

## Rakudo
- Rakudoとは現在のRakuの主力な実装である.
- Rakudo は MoarVM, と NQP と呼ばれる Raku のサブセット, NQP と Raku 自身で記述された Raku という構成である.

![](fig/Rakudo.svg)
- Rakudoの構成

## NQP
- NQPとはNot Quite Perl の略で Raku の機能を制限したプログラミング言語である.
- 基本的な文法などは Raku に準拠しているが, 変数を束縛で宣言するなどの違いがある.
- NQPコンパイラ自身もNQPで記述されている

## MoarVM
- MoarVM は Perl6 に特化した VM 
- C 言語で実装されている
- JIT コンパイルなどが現在導入されているが, 起動時間などが低速である問題がある

## Perl6の名称変更
- Raku はPerlの次期メジャーバージョンとして設計が始められ, 元々Perl6という名称であったが, Perl6 は言語仕様及び処理実装が Perl5 と大幅に異なっており, 言語的な互換性が存在しない.
- そのため現在有力な処理系である Rakudo から名前を取り Raku という別名がつけられた.

## Rakuが遅い理由
- 後で書く

## 予測
- 前述した通り,Rakuは起動に時間がかかっているため

## Raku による Abyssサーバーの実装
- 提案手法に沿い『Abyssサーバー』を実装した.
- AbyssサーバーはUnix domain socketを用いて送信した Raku スクリプトを実行するためのサーバーである.
- 下記の図は,Abyss サーバーを用いたスクリプト言語の実行手順である.

![](fig/abyss.svg) 

## Raku の Unix domain socket 実装
- 後で書く

## 予測
- 前述した通り, Raku はコンパイラの起動に時間がかかっているため,提案手法を用いることで起動時間分早く実行することができると予測する.

## 通常実行と提案手法の速度比較
- 今回は,提案手法での実行速度と通常実行での実行速度, この二つの速度の比較を行う
- 題材として行うのはhelloworldを出力するだけのプログラムです.

## 実行結果


## Abyss Server側の実装
- Abyss サーバーは起動すると, まず自身にファイルパスを転送するためのソケットを生成し, その後 ファイルを受け取るための待機ループに入る.
- ファイルパスを受け取ると,ファイルを開き実行する. 

```
unit class Abyss::Server:ver<0.0.1>;
use MONKEY-SEE-NO-EVAL;
use IO::Socket::Unix;

method readeval {
  my $listen = IO::Socket::Unix.new( 
    :listen,
    :localhost<localhost>,
    :localport(3333) 
    );
  loop {
    my $conn = $listen.accept;
    while my $buf = $conn.read(1024) {
      EVALFILE $buf.decode;
    }
    $conn.close;
  }
}
```

## Abyss Client側の実装
- ユーザーはAbyssのサーバーを起動後,ファイルパスをサーバーに送信する.

```
use IO::Socket::Unix;

my $conn = IO::Socket::Unix.new( :host<localhost>,
                                 :port(3333) );

$conn.print: 'FILEPASS';
```

## Raku のEVAL
- Raku では EVAL 関数があり文字列を Perl6 のソースコード自身として評価できる
- Raku では, EVAL は通常は使用できないようになっており, MONKEY-SEE-NO-EVAL という pragma を実行することで使うことができるようになる.

```
use MONKEY-SEE-NO-EVAL;

EVAL "say { 5 + 5 }";   # OUTPUT: 10
```

## Abyss Serverの利点
- Abyss Serverを用いて実行することで, サーバー上で事前に起動した Rakudo を再利用し, 投げられた Perl6 スクリプトの実行を行うため, Rakudo の全体的な処理時間を短縮できる.

## Abyss Serverの欠点
-

## まとめと今後の課題
- Raku の新たな実行方法の提案,及び実装を行なった.
- Raku にUnix domain socket の実装を行なった.

## Raku の実装に関わる様々な言語
-  Raku は,Larry wallにより設計されたオブジェクト指向スクリプト言語である.
- また Raku は漸進的型付け言語である.

![](fig/Raku.svg)