++ed by:

13 PAUSE users
6 non-PAUSE users.

Yuki Kimoto


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


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";


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


  • 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


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


(Currently only Japanese)

Native API

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


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

Language Specification

SPVM Language Specification


(Currently only Japanese)


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 {

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[];


  # 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_int_array([3, 6, 8, 9]);
  # Call SPVM subroutine
  my $total = MyMathNative->sum($sp_nums);
  print $total . "\n";

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



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".


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


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



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




  • Mohammad S Anwar

  • akinomyoga

  • NAGAYASU Shinya

  • Reini Urban

  • chromatic

  • Kazutake Hiramatsu


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.