NAME

SPVM - Static Perl Virtual Machine. Fast calculation & Easy C/C++ Binding

SYNOPSIS

SPVM Module:

# lib/MyMath.spvm
package MyMath {
  sub sum : int ($nums : int[]) {
    
    my $total = 0;
    for (my $i = 0; $i < @$nums; $i++) {
      $total += $nums->[$i];
    }
    
    return $total;
  }
}

Use SPVM Module from Perl

use FindBin;
use lib "$FindBin::Bin/lib";

use SPVM 'MyMath';

# Call subroutine
my $total = MyMath->sum([3, 6, 8, 9]);

print $total . "\n";

DESCRIPTION

SPVM is Static Perl Virtual Machine. Provide fast calculation & easy C/C++ Binding.

Features:

  • Fast culcuration, Fast array operation, Small memory

  • Perl syntax, Static typing, Switch syntax, Have language specification

  • Enum, Type inference, Anon subroutine, Variable captures

  • Array initialization,

  • Reference count GC, Weaken reference, Module system

  • Exception, Package variable

  • Object oriented, Inteface, Value type, Value array type, Reference type

  • Easy way to C/C++ binding, Automatically Perl binding, C99 math functions

  • Dynamic linking, Subroutine precompile, AOT compile(create exe file)

  • Native API(C level api), C99 standard

DOCUMENT

Core Functions

print, warn, time

SPVM::CORE - Standard Functions

Standard Modules

SPVM::Byte, SPVM::Short, SPVM::Int, SPVM::Long, SPVM::Float, SPVM::Double

Exchange API

SPVM Exchange API Specification

http://jp.spvm.info/exchange-api.html

(Currently only Japanese)

Native API

SPVM::Document::NativeAPI - Native API is C level functions to manipulate SPVM data.

Extension

SPVM::Document::Extension - Extension is the way to C/C++ Binding to SPVM

Language Specification

SPVM Language Specification

http://jp.spvm.info/language.html

(Currently only Japanese)

EXAMPLES

How to use SPVM from Perl

SPVM Module:

# lib/MyMath.spvm
package MyMath {
  sub sum : int ($nums : int[]) {
    
    my $total = 0;
    for (my $i = 0; $i < @$nums; $i++) {
      $total += $nums->[$i];
    }
    
    return $total;
  }
}

Use SPVM Module from Perl

use FindBin;
use lib "$FindBin::Bin/lib";

use SPVM 'MyMath';

# Call subroutine
my $total = MyMath->sum([3, 6, 8, 9]);

print $total . "\n";

See also SPVM::Document::ExchangeAPI.

Package Declaration

Package can contain field declaration, subroutine declaration.

package Point {
  has x : int;
  has y : int;
  
  sub new : Point ($x : int, $y : int) {
    my $self = new Point;
    
    $self->{x} = $x;
    $self->{y} = $y;
    
    return $self;
  }
  sub clear ($self : self) {
    $self->{x} = 0;
    $self->{y} = 0;
  }
}

Package can also contain package variable declaration and enumeration declaration and use declaration.

package Foo {
  use Point;
  
  our $FOO : int;
  our $BAR : int;
  
  enum {
    FLAG1
    FLAG2;
  }
}

Use Module

use Point;

Field Declaration

has x : int;
has y : long;

Field is public by default.

You can make field private by private keyword.

has x : private int;

Subroutine Declaration

sub sub : int ($num1 : int, $num2 : int) {
  return $num1 + $num2;
}

Variable Declaration

my $num : int;
my $nums : int[];

Exmpales:

# Numeric Type
my $value : byte;
my $value : short;
my $value : int;
my $value : long;
my $value : float;
my $value : double;
my $obj : Point;

# Array Type
my $values : byte[];
my $values : short[];
my $values : int[];
my $values : long[];
my $values : float[];
my $values : double[];
my $values : Point[];

# Multiple Dimension Array Type
my $values : byte[][];
my $values : short[][];
my $values : int[][];
my $values : long[][];
my $values : float[][];
my $values : double[][];
my $values : Point[][];

You can initialize variable.

my $value : int = 1;

You can omit type name if initial value is exists. This is type inference.

my $value = 1;

Type Inference

If the Type of right value is known, the type of left value is automatically decided.

my $num = 2;
my $obj = new Foo;
my $values = new int[3];

Above is same as the following.

my $num : int = 2;
my $obj : Foo = new Foo;
my $values : int[3] = new int[3];

C Extension using SPVM

SPVM Module:

# lib/MyMathNative.spvm
package MyMathNative {
  
  # Sub Declaration
  native sub sum int ($nums : int[]);
}

C Source File;

// lib/MyMathNative.native.c
#include <spvm_native.h>

int32_t SPNATIVE__MyMathNative__sum(SPVM_ENV* env, SPVM_VALUE* stack) {
  
  // First argument
  void* sp_nums = stack[0].oval;
  
  // Array length
  int32_t length = env->len(env, sp_nums);
  
  // Elements pointer
  int32_t* nums = env->ielems(env, sp_nums);
  
  // Culcurate total
  int32_t total = 0;
  {
    int32_t i;
    for (i = 0; i < length; i++) {
      total += nums[i];
    }
  }
  
  // Return value is set to stack[0]
  stack[0].ival = total;
  
  // If function success, return SPVM_SUCCESS
  return SPVM_SUCCESS;
}

Use Extension Module from Perl:

use FindBin;
use lib "$FindBin::Bin/lib";

# Use SPVM module
use SPVM 'MyMathNative';

# New SPVM int array
my $sp_nums = SPVM::new_iarray([3, 6, 8, 9]);

# Call SPVM subroutine
my $total = MyMathNative->sum($sp_nums);

print $total . "\n";

See also SPVM::Document::Extension, SPVM::Document::NativeAPI.

ENVIRONMENT VARIABLE

SPVM_BUILD_DIR

SPVM build directory for precompile and native subroutine.

If SPVM_BUILD_DIR environment variable is not specified, spvm_build directory of script directory is set to build directory.

For exmple, If your script is placed at "/path/app.pl", build directory is "/path/spvm_build".

NOTE

SPVM is before 1.0 under development! I will change implementation and specification without warnings.

SUPPORT

If you have problems or find bugs, comment to GitHub Issue.

SPVM(GitHub).

AUTHOR

Yuki Kimoto <kimoto.yuki@gmail.com<gt>

CORE DEVELOPERS

moti<lt>motohiko.ave@gmail.com<gt>

CONTRIBUTERS

  • Mohammad S Anwar

  • akinomyoga

  • NAGAYASU Shinya

  • Reini Urban

  • chromatic

  • Kazutake Hiramatsu

COPYRIGHT & LICENSE

Copyright 2018-2019 Yuki Kimoto, all rights reserved.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.