view Slide/Slide.html @ 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






<!DOCTYPE html>
<html>
<head>
   <meta http-equiv="content-type" content="text/html;charset=utf-8">
   <title>Perl6(Raku)のサーバーを使った高速実行</title>

   <meta name="generator" content="Slide Show (S9) v4.0.1 on Ruby 2.3.7 (2018-03-28) [universal.x86_64-darwin18]">
   <meta name="author"    content="Kouki Fukuda, Shinji Kono" >

<!-- style sheet links -->
<link rel="stylesheet" href="s6/themes/projection.css"   media="screen,projection">
<link rel="stylesheet" href="s6/themes/screen.css"       media="screen">
<link rel="stylesheet" href="s6/themes/print.css"        media="print">
<link rel="stylesheet" href="s6/themes/blank.css"        media="screen,projection">

<!-- JS -->
<script src="s6/js/jquery-1.11.3.min.js"></script>
<script src="s6/js/jquery.slideshow.js"></script>
<script src="s6/js/jquery.slideshow.counter.js"></script>
<script src="s6/js/jquery.slideshow.controls.js"></script>
<script src="s6/js/jquery.slideshow.footer.js"></script>
<script src="s6/js/jquery.slideshow.autoplay.js"></script>

<!-- prettify -->
<link rel="stylesheet" href="scripts/prettify.css">
<script src="scripts/prettify.js"></script>

<script>
  $(document).ready( function() {
    Slideshow.init();

    $('code').each(function(_, el) {
      if (!el.classList.contains('noprettyprint')) {
        el.classList.add('prettyprint');
      }
    });
    prettyPrint();
  } );

</script>

<!-- Better Browser Banner for Microsoft Internet Explorer (IE) -->
<!--[if IE]>
<script src="s6/js/jquery.microsoft.js"></script>
<![endif]-->

    

</head>
<body>

<div class="layout">
  <div id="header"></div>
  <div id="footer">
    <div align="right">
      <img src="s6/images/logo.svg" width="200px">
    </div>
  </div>
</div>

<div class="presentation">

  <div class='slide cover'>
    <table width="90%" height="90%" border="0" align="center">
      <tr>
        <td>
          <div align="center">
              <h1><font color="#808db5">Perl6(Raku)のサーバーを使った高速実行</font></h1>
          </div>
        </td>
      </tr>
      <tr>
        <td>
          <div align="left">
              Kouki Fukuda, Shinji Kono
              琉球大学
            <hr style="color:#ffcc00;background-color:#ffcc00;text-align:left;border:none;width:100%;height:0.2em;">
          </div>
        </td>
      </tr>
    </table>
  </div>



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



</div>

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



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="perl6raku">Perl6(Raku)</h2>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="rakudo">Rakudo</h2>
<ul>
  <li>Rakudoとは現在のPerl6の主力な実装である.</li>
  <li>Rakudo は MoarVM, と NQP と呼ばれる Perl6 のサブセット, NQP と Perl6 自身で記述された Perl6 という構成である.</li>
</ul>

<p><img src="fig/Rakudo.pdf" alt="" /></p>
<ul>
  <li>Rakudoの構成</li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="nqp">NQP</h2>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="perl6-による-abyssサーバーの実装">Perl6 による Abyssサーバーの実装</h2>
<ul>
  <li>提案手法に沿い『Abyssサーバー』を実装した.</li>
  <li>Abyssサーバーはクライアント側から投げられた Perl6 を実行するためのサーバーである.</li>
  <li>下記の図は,Abyss サーバーを用いたスクリプト言語の実行手順である.</li>
</ul>

<p><img src="fig/abyss.pdf" alt="" /></p>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="abyss-server側の実装">Abyss Server側の実装</h2>
<ul>
  <li>Abyss サーバーは起動すると, まず自身にファイル パスを転送するためのソケットを生成し, その後 ファイルを受け取るための待機ループに入る.</li>
</ul>

<pre><code>unit class Abyss::Server:ver&lt;0.0.1&gt;;
use MONKEY-SEE-NO-EVAL;

method readeval {
  my $listen = IO::Socket::INET.new( 
    :listen,
    :localhost&lt;localhost&gt;,
    :localport(3333) 
    );
  loop {
    my $conn = $listen.accept;
    while my $buf = $conn.read(1024) {
      EVALFILE $buf.decode;
    }
    $conn.close;
  }
}
</code></pre>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="abyss-client側の実装">Abyss Client側の実装</h2>
<ul>
  <li>ユーザーはAbyssのサーバーを起動後,ファイルパスをサーバーに送信する.</li>
</ul>

<pre><code>my $conn = IO::Socket::INET.new( :host&lt;localhost&gt;,
                                 :port(3333) );

$conn.print: 'FILEPASS';
</code></pre>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="perl6のeval">Perl6のEVAL</h2>
<ul>
  <li>Perl6 では EVAL 関数があり文字列を Perl6 のソースコード自身として評価できる</li>
  <li>Perl6 では, EVAL は通常は使用できないようになっており, MONKEY-SEE-NO-EVAL という pragma を実行することで使うことができるようになる.</li>
</ul>

<pre><code>use MONKEY-SEE-NO-EVAL; 
 
EVAL "say { 5 + 5 }";   # OUTPUT: 10
</code></pre>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="まとめと今後の課題">まとめと今後の課題</h2>
<ul>
  <li>Perl6 の新たな実行方法の提案,及び実装を行なった.</li>
</ul>

</div>


</div><!-- presentation -->
</body>
</html>