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.
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
print, warn, time
SPVM::CORE - Standard Functions
SPVM::Byte, SPVM::Short, SPVM::Int, SPVM::Long, SPVM::Float, SPVM::Double
SPVM Exchange API Specification
http://jp.spvm.info/exchange-api.html
(Currently only Japanese)
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
SPVM Language Specification
http://jp.spvm.info/language.html
See also SPVM::Document::ExchangeAPI.
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 Point;
has x : int; has y : long;
Field is public by default.
You can make field private by private keyword.
has x : private int;
sub sub : int ($num1 : int, $num2 : int) { return $num1 + $num2; }
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;
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];
# 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.
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.
SPVM(GitHub).
Yuki Kimoto <kimoto.yuki@gmail.com<gt>
moti<lt>motohiko.ave@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.
To install SPVM, copy and paste the appropriate command in to your terminal.
cpanm
cpanm SPVM
CPAN shell
perl -MCPAN -e shell install SPVM
For more information on module installation, please visit the detailed CPAN module installation guide.