Name
SPVM - SPVM Language
Caution
SPVM
is not yet 1.0 release. It is quite often changed without warnings until I feel that the implementation is good enough.
Usage
Creating SPVM Module:
# lib/SPVM/MyMath.spvm
class MyMath {
static method sum : int ($nums : int[]) {
my $total = 0;
for (my $i = 0; $i < @$nums; $i++) {
$total += $nums->[$i];
}
return $total;
}
}
Calling SPVM methods from Perl:
# sum.pl
use strict;
use warnings;
use FindBin;
use lib "$FindBin::Bin/lib";
use SPVM 'MyMath';
# Call method
my $total = SPVM::MyMath->sum([3, 6, 8, 9]);
print "$total\n";
Description
SPVM (Static Perl Virtual Machine) is a perl-ish static typed programing language. SPVM provides fast calculation, fast array operations, easy C/C++ binding, and creating executable files.
Loading Module
If you load SVPM module from Perl, use the following syntax.
use SPVM 'Foo';
Suppose the following SPVM/Foo.spvm
is placed on a module search path.
# SPVM/Foo.spvm
class Foo {
static method sum : int ($x1 : int, $x2 : int) {
return $x1 + $x2;
}
}
If you load SPVM Foo::Bar
module, do the following.
use SPVM 'Foo::Bar';
Suppose the following SPVM/Foo/Bar.spvm
is placed on a module search path.
# SPVM/Foo/Bar.spvm
class Foo::Bar {
static method sum : int ($x1 : int, $x2 : int) {
return $x1 + $x2;
}
}
use SPVM MODULE_NAME
compile the SPVM module and the dependent modules.
Note that at this point a SPVM runtime has not yet been created.
A default SPVM runtime is created the first time you call a method of SPVM module or call a function or method of the Exchange API.
Class Method Call
Let's call SPVM class method from Perl.
use SPVM 'Foo';
my $total = SPVM::Foo->sum(1, 2);
The definition of Foo
module is the following.
# SPVM/Foo.spvm
class Foo {
static method sum : int ($x1 : int, $x2 : int) {
return $x1 + $x2;
}
}
If the number of arguments does not match the number of arguments of the SPVM method, an exception occurs.
The Perl values of the arguments are converted to the SPVM values by the rule of argument convertion.
If the type is non-conforming, an exception occurs.
The SPVM return value is converted to a Perl return value by the rule of return value convertion.
The SPVM exception is converted to a Perl exception.
Instance Method Call
Let's call SPVM instance method from Perl.
use SPVM 'Foo';
my $foo = SPVM::Foo->new;
my $total = $foo->sum(1, 2);
The definition of Foo
module is the following.
# SPVM/Foo.spvm
class Foo {
static method new : Foo () {
return new Foo;
}
method sum : int ($x1 : int, $x2 : int) (
return $x1 + $x2;
}
}
Exchange API
Exchange API is APIs to convert Perl data structures to/from SPVM data structures and to call SPVM methods from Perl.
api
my $api = SPVM::api();
Gets the global SPVM::ExchangeAPI object.
Document
SPVM documents.
Tutorial
SPVM Tutorial.
Language Specification
SPVM Language Specification.
Standard Modules
SPVM Standard Modules.
Exchange APIs
SPVM Exchange APIs is functions to convert between Perl data structures and SPVM data structures.
Native Module
The native module is the module that is implemented by native language such as C language
or C++
.
Native APIs
SPVM native APIs are public APIs that are used in native language sources such as C language
or C++
.
Resource
A resource is a native module that contains a set of sources and headers of native language such as C language
or C++
.
Creating Executable File
spvmcc
is the compiler and linker to create the executable file from SPVM source codes.
Creating SPVM Distribution
spvmdist
is the command to create SPVM distribution.
Benchmark
SPVM performance benchmarks.
Environment Variables
SPVM_BUILD_DIR
SPVM building directory to build precompile
and native
methods. If the SPVM_BUILD_DIR
environment variable is not set, the building of precompile
and native
methods fails.
bash:
export SPVM_BUILD_DIR=~/.spvm_build
csh:
setenv SPVM_BUILD_DIR ~/.spvm_build
SPVM_CC_DEBUG
Print debug messages of SPVM::Builder::CC to stderr.
SPVM_CC_FORCE
Force the compilation and the link of SPVM::Builder::CC.
Deprecation
The following SPVM::xxx functions are deprecated. These functions will be removed in the future. Use the methods in the SPVM::ExchangeAPI directly.
new_byte_array
new_byte_array_unsigne
new_byte_array_len
new_byte_array_from_bin
new_byte_array_from_string
new_short_array
new_short_array_unsigned
new_short_array_len
new_short_array_from_bin
new_int_array
new_int_array_unsigned
new_int_array_len
new_int_array_from_bin
new_long_array
new_long_array_unsigned
new_long_array_len
new_long_array_from_bin
new_float_array
new_float_array_len
new_float_array_from_bin
new_double_array
new_double_array_len
new_double_array_from_bin
new_string
new_string_from_bin
new_object_array
new_object_array_len
new_any_object_array
new_mulnum_array
new_mulnum_array_from_bin
new_string_array
new_string_array_len
get_exception
set_exception
get_memory_blocks_count
call_method
new_address_object
How to rewrite the code:
# Before
my $int_array = SPVM::new_int_array([1, 2, 3]);
# After
my $api = SPVM::api();
my $int_array = $api->new_int_array([1, 2, 3]);
Repository
Bug Report
Support
Author
Yuki Kimoto <kimoto.yuki@gmail.com>
Core Developers
moti<motohiko.ave@gmail.com>
Contributors
Mohammad S Anwar
akinomyoga
NAGAYASU Shinya
Reini Urban
chromatic
Kazutake Hiramatsu
Yasuaki Omokawa
Suman Khanal
Copyright & LICENSE
Copyright 2018-2022 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.