<html>
  <head>
    <title>SPVMの目的</title>
    <meta charset="UTF-8">
    <link rel="shortcut icon" href="/images/spvm-logo.png">
    <link rel="stylesheet" type="text/css" href="/css/common.css">
    <script type="text/javascript" src="/js/jquery-1.9.0.min.js"></script>
    <script type="text/javascript" src="/js/google-code-prettify/prettify.js"></script>
    <link  type="text/css" rel="stylesheet" href="/js/google-code-prettify/prettify.css"/>
    <script>
      $(function(){
        // google code prettifyの有効化
        $("pre").addClass("prettyprint");
        function init(event){
          prettyPrint();
        }
        if(window.addEventListener)window.addEventListener("load",init,false);
        else if(window.attachEvent)window.attachEvent("onload",init);
        
        $(".to-top").click(function() {
          // ページの一番上までスクロールさせます。
          $('body, html').animate({scrollTop: 0}, 300, 'linear');;
        });
      });
    </script>
  </head>
  <body>
    <div class="header">
      <div class="container">
        <h1>
          <a style="color:#333;text-decoration:none;" href="/"><img src="/images/spvm-logo.png">SPVMドキュメント 1.0 ベータ</a>
        </h1>
      </div>
    </div>
    
    <div class="container">
      <div>
        最終更新日 2019年7月16日
        <br><b>現在この日本語の翻訳ドキュメントは、SPVMの最新のドキュメントに追随していません。</b>
        <br>最新のドキュメントは<a href="https://yuki-kimoto.github.io/spvmdoc-public/">SPVM Document</a>を参照してください。
      </div>
      <h2 id="purpose">目的</h2>
      <p>
        SPVMの開発の主な目的を教えてください。
      </p>

      <h3>数値計算と配列の演算の高速化</h3>

      <p>
        SPVMは、<b>Perlの数値計算のパフォーマンスを改善</b>することを目標として開発されています。<b>数値計算と配列の演算を高速化</b>することが第一の目標です。
      </p>

      <p>
        仕様がほぼ確定した後にベンチマークテストを始める予定ですが、数値計算と配列の演算に対して、Perlの30倍、C言語の1/2の速度を、最初の目標としています。
      </p>

      <h3>C/C++のバインディングを簡単に</h3>

      <p>
        <b>C/C++のバインディングを簡単</b>にすることが二つ目の目標です。
      </p>
      <p>
        さらなる数値計算の高速化において必要になるのは、C/C++のライブラリをSPVMから利用できることです。専門分野のための自作のC/C++ライブラリや、openMPやSIMDやGPUを扱えるオープンソースのC/C++ライブラリをバインディングできると、数値の並列計算などでさらなる高速化が可能になります。
      </p>
      <p>
        C言語のソースファイルを配置するだけで、C言語を記述できる機能を提供します。
      </p>
      <p>
        設定ファイルを記述することで、gcc,clangのコンパイラオプションの制御を可能にします。ExtUtils::MakeMakerの使い方に近い記述を目指します。
      </p>
      <p>
        SPVMのビルドディレクトリにinclude、libディレクトリを配置すれば、そこに置かれた、ヘッダーファイル、静的ライブラリ、共有ライブラリを利用できるようにします。
      </p>
      <p>
        SPVMとC言語で、データをやり取りするための仕様化されたAPIを提供します。
      </p>
      <p>
        すでに生成された共有ライブラリなどのバイナリファイルの後方互換性が、SPVMのバージョンアップによって、壊れないように設計されます。
      </p>

      <h3>単体で実行可能な実行ファイルの生成</h3>
      <p>
        <b>単体で実行可能な実行ファイルを生成する</b>ことが、三つ目の目標です。
      </p>
      <p>
        SPVMは、実行ファイルを生成する機能を持っているので、ランタイムなしに、プログラムの実行が可能です。単体で実行可能なので配布することもできます。
      </p>
      <p>
        共有ライブラリ(ダイナミックリンクライブラリ)の読み込みにも対応します。
      </p>
      <p>
        ボタンなどのGUIを備えたWindowsのネイティブアプリケーション、スマートフォンで動くiOSネイティブアプリケーションが作成できるようにします。
      </p>

      <h2 id="user">ユーザー</h2>
      <p>
        どのような人をSPVMのユーザーとして想定していますか。
      </p>

      <h3>遺伝子解析などの生命情報科学の研究者</h3>
      <p>
        Perlは強力な文字列処理を利点として、従来より遺伝子解析などの生命情報科学の分野で利用されてきましたが、近年はデータ取得技術の革新によって利用できる遺伝子情報が爆発的に増加したため、配列操作の遅さに不満を感じている研究者の方がいます。
      </p>
      <p>
        配列操作を簡単に高速化でき、必要であればC/C++をバインディングし、openMPやSIMDなどの並列計算ができればと考えている研究者の方を想定しています。
      </p>

      <h3>
        Perlで予想可能な数値演算を行いたい方
      </h3>
      <p>
        Perlは本当に型のない言語です。Perlは内部的には型を持っていますが、数値型と文字列型は、コンテキストに応じて、予測しづらい方法で変換されてしまいます。
      </p>
      <p>
        Perlの整数演算はオーバーフローが発生すると、浮動小数点型に変換されます。これは、便利ですが、数値計算の結果の予測はしづらくなります。
      </p>
      <p>
        Perlの整数演算は、コンパイラオプションによって、32bitあるいは64bitになります。浮動小数点演算は、float型を持たず、double型しか持ちません。
      </p>
      <p>
        Perlの数値演算は正しい結果を返しますが、どの型になるかは、コンパイラオプションや内部の動作に依存し、予想がしづらいものとなっています。
      </p>
      <p>
        SPVMは、静的型を持つ言語あり、32bitと64bitの整数演算、floatとdoubleの浮動小数点演算を区別して実行することができます。
      </p>

      <h3>Perlの数値計算を速くしたいが、XSやC言語は難しいと感じる方</h3>
      <p>
        SPVMを使うと、Perlの文法で、数値計算と配列演算を速くすることができます。
      </p>

      <h3>IoTの開発者</h3>

      <p>
        IoTの開発者は、ハードウェアからWebまでの幅広い知識が必要になります。大量の分野の知識が必要となるため、これを簡単に実現するライブラリがあれば便利です。
      </p>

      <p>
        C/C++、アセンブラを使って、センサーのデバイスドライバを作成。HTTPクライアントライブラリを使って、Webにアクセス。開発環境で、実行ファイルを作成して、それぞれの機器にそのままコピー。このような一連の機能をSPVMは提供する予定です。
      </p>

      <h3>グラフィックスエンジニア</h3>

      <p>
        画像処理には、大量の配列演算が必要です。Perlは、配列のデータ構造を言語仕様として持たないため、不満を感じている方がいます。
      </p>

      <p>
        SPVMは、連続した領域を持つ配列のデータ構造を提供しているので、DirectXやOpenGM、OpenCVなどと組み合わせて、画像処理をしたいユーザーに向いています。
      </p>

      <h3>AI・機械学習エンジニア</h3>

      <p>
        AI・機械学習には、配列演算が必要です。Perlは、配列のデータ構造を言語仕様として持たないため、不満を感じている方がいます。
      </p>

      <p>
        SPVMは、連続した領域を持つ配列のデータ構造を提供しているので、機械学習ライブラリとの相性が高いです。
      </p>

      <h3>マイクロサービスの提供者</h3>

      <p>
        SPVMは、JSONモジュール、非同期IOをサポートしたHTTPクライアント/サーバーをコアで提供する予定です。実行ファイルを生成可能なので、小さなLinuxサーバーを構築し、実行ファイルをコピーして、マイクロサービスを運用可能です。
      </p>

      <p>
        SPVMは、リファレンスカウント方式のGCを採用しているので、FullGCが起こらず、非同期IOの性能に大きく関わるレイテンシを小さくできます。
      </p>

      <h2 id="features">機能</h2>
      <h3>連続したデータ領域を持つ配列型</h3>
      <p>
        SPVMは連続したデータ領域を持つ配列型を提供しています。
      </p>
      <h3 class="features-specification">仕様化された数値型と計算規則</h3>
      <p>
        Perlの数値計算の弱点の一つは、型を固定して計算することができないことです。ある操作によって浮動小数点に変換されたり、文字列型に変換されたりします。SPVMでは、仕様化された数値型と計算規則を持っているので、どの型によって計算されるかを正確把握することができます。
      </p>
      <h3 class="features-c99-math">C99で追加された数学関数</h3>
      <p>
        C99で追加された新しいC言語の数学関数がすべて利用できます。
      </p>
      
      <h3 class="features-specification">仕様化された言語仕様</h3>
      <p>
        SPVMの言語仕様は、メジャーバージョンごとに、仕様化されています。仕様を元に、独自にコンパイラを開発することが可能です。
      </p>
      <h3>サブルーチンの機械語へのコンパイル</h3>
      <p>
        SPVMのサブルーチンはコンパイル時に、機械語へコンパイルすることができます。
      </p>
      <h3>覚えやすく簡単な文法</h3>
      <p>
        SPVMの文法は覚えやすく簡単になるように設計されています。
      </p>
      <p>
        文法の95%以上はPerlの文法を採用しています。Perlをすでに学んでいるユーザーであれば、2時間あれば、すべての文法を覚えてしまうことができるでしょう。
      </p>
      <p>
        型の種類、型の規変換規則は、明確です。型推論は、常に右から左へ行われます。
      </p>

    </div>
    <div class="footer">
      <div><a href="javascript:void(0)" class="to-top">▲</a></div>
      <a href="https://github.com/yuki-kimoto/SPVM">SPVMプロジェクト</a>
    </div>
  </body>
</html>