view Slide/Slide.md @ 9:480229d0ea65

fig修正
author e165727 <e165727@ie.u-ryukyu.ac.jp>
date Thu, 26 Dec 2019 16:26:58 +0900
parents 3343b5914245
children 4627ec7c3d1b
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をサーバとして動作させ、実行するファイルをサーバに投げて実行する方法を検討する
- 同一ホスト内で終了せずに実行を続けるサーバープロセスを立ち上げ, このサーバープロセス上で立ち上げておいたコンパイラに実行するファイル名を転送し, サーバー上でコンパイルを行う手法を提案し実装する.

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

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

## NQP
- NQPとはNot Quite Perl の略で Raku のサブセットである
- 基本的な文法などは Perl6 に準拠しているが, 変数を束縛で宣言するなどの違いがある.

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

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

![](fig/abyss.pdf) 

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

## Abyss Serverの欠点
-  

## 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';
```

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

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

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

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

![](fig/Raku.pdf)