view Slide/Slide.md @ 8:3343b5914245

add Slide
author e165727 <e165727@ie.u-ryukyu.ac.jp>
date Wed, 25 Dec 2019 16:10:22 +0900
parents 126266fc2c30
children 480229d0ea65
line wrap: on
line source

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

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

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

## Perl6(Raku)

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

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

## NQP

## Perl6 による Abyssサーバーの実装
- 提案手法に沿い『Abyssサーバー』を実装した.
- Abyssサーバーはクライアント側から投げられた Perl6 を実行するためのサーバーである.
- 下記の図は,Abyss サーバーを用いたスクリプト言語の実行手順である.

![](fig/abyss.pdf) 

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

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

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;
    }
    $conn.close;
  }
}
```

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

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

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

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

```
use MONKEY-SEE-NO-EVAL; 
 
EVAL "say { 5 + 5 }";   # OUTPUT: 10
```

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