SPVM::Document::Specification - SPVM Language Specification(BETA before 1.0)
SPVM is designed to help Perl week points. Perl week points is:
Perl numeric and array operation is slow because Perl can't have Static Type.
Perl can't calcurate number correctly, for exampele, float operation, bit operation of integral type, etc.
Perl can't bind C/C++ library easily becuase Perl don't have type semaintics.
SPVM provide Fast and Correct Numeric and Array operation, and C/C++ binding become much easy.
SPVM Module is used from Perl directory. SPVM is not single language. You can call SPVM subroutine easily from Perl .
If you use SPVM, you can create module which need numeric and array operation.
For example:
AI, Machine Learning, Deep Learning, Statistics, IoT, Image Recognition, Voice Recognition, Signal Processing.
SPVM have Numeric Type, Array Type, Package Type. Numeric Type is byte, short, int, long, float, double. You can calcurate number by these types. Array Type is Contiguous Area of numeric type. Package Type have, for example, x, y field.
SPVM have Type Inference, GC, Memory Safety, Destructor, Package Template. GC is Reference Count GC. Template Package is like C++ Class Template.
Package declaration is the following.
package PackageName { }
PackageName is package name.
PackageName
Package name is consist of Upper Case and Lower Case and Number and ::. Package name must start with Upper Case. Package name which start with Lower Case is forbidden. Package name which start with Lower Case is resolved for core.
::
Note that package name can't contain Under Score _. Under Score is used for Package Template.
_
Package Template
# Legal Foo Foo2 Foo::Bar Foo::Bar::Baz Foo::bar # Illegal foo foo::Bar 2Foo Foo_Bar
Package Declaration must be just under file itself.
# Legal package PackageName { } # Illegal sub foo() : int { package PackageName { } }
Field declaration is the following.
has field_name : type_name;
filed_name is field name. Field name is consist of Upper Case and Lower Case and Number and Under Score _. Field name must not start with Number. Under score must not continue more than one.
filed_name
# Legal foo foo_bar foo2 foo_bar2 FOO # Illegal 2foo foo__bar
type_name is a type. Type is explained in "Type" section.
type_name
Field Declaration must be just under Package Declaration.
# Legal package PackageName { has field_name : type_name; } # Illeagal has field_name : type_name; sub foo() : int { has field_name : type_name }
Subroutine declaration is the following.
sub sub_name(arg_name : type_name, ...) : descripter_name return_type_name { }
sub_name is subroutine name. Subroutine name is consist of Upper Case and Lower Case and Number and Under Score _. Subroutine name must not start with Number. Under score must not continue more than one.
sub_name
arg_name is Argument Name. This is Variable name. Variable name is explained in "Variable Declaration" section,
arg_name
type_name is a Type. Type is explained "Type" section.
arg_name : type_name can be repeated with ,. If argument is none, that is ok. Max arguments count is 255.
arg_name : type_name
,
255
descripter_name is a Descripter. If descripter is none, that is ok. Available descripters are following. Currently only one descripter is available.
descripter_name
[Name] [Description] native the subroutine is native
Native subroutine is explained in "Native Subroutine".
return_type_name is a Type or void. void mean the subroutine don't have return value. Type is explained "Type" section.
return_type_name
void
Subroutine Declaration must be just under Package Declaration.
# Legal package PackageName { sub foo($nums : int[]) : int { } } # Illeagal sub foo() : double { sub var() : void { } }
Variable Declaration is the following.
my var_name : type_name;
var_name is Variable Name. Variable Name first character is $. Rest characters is consist of Upper case, Lower case, Number and Under score _.
var_name
$
# Legal $foo $FOO $foo2 $foo_bar
If Variable Declaration is done, you can use variable after the declaration.
type_name is a <Type>. Type is explained at "Type" section.
You can Initialize the variable as same time as Variable Declaration.
my $num : int = 3;
Variable Declaration Example:
# Numeric Type my $value : byte; my $value : short; my $value : int; my $value : long; my $value : float; my $value : double; # Array Type my $values : byte[]; my $values : short[]; my $values : int[]; my $values : long[]; my $values : float[]; my $values : double[]; my $values : PackageName[]; # Multiple Dimension Array Type my $values : byte[][]; my $values : short[][]; my $values : int[][]; my $values : long[][]; my $values : float[][]; my $values : double[][]; my $values : PackageName[][]; # Package Type my $obj : PackageName;
If the Type of right value is known, the type of left value is automatically decided.
my $num = 2; my $obj = new Foo; my $nums = new int[3];
Above is same as the following.
my $num : int = 2; my $obj : Foo = new Foo; my $nums : int[3] = new int[3];
Integer Literal is composed of
[+|-][0x][0123456789abcdefABCDEF]...[y|s|L|f|d]
123 -123 0xff 0xFF 123L 123d
Default Number Literal Type is int.
int
# Type is int 123
You can use hex number literal by start 0x.
0x
a, b, c, d, e, f, A, B, C, D, E, F is used as hex number.
a
b
c
d
e
f
A
B
C
D
E
F
0xAF 0xaf
You can use octal number literal by start 0.
0
0x177 0x777
You can use binary number literal by start 0b.
0b
0b101 0b001
You can use under line _ in number literal. Under line is meanless, only for visuality.
123_456 0xAB_CD
You can use type specifier to specify integer leteral type.
y
# Byte 123y
s
# Short 123s
L
# Long 123L
# Float 123f
# Double 123d
If you use . in number literal, the number is floating point literal. Default type of floating point value is double.
.
double
1.23 -1.23
You can use E or e to specify exponential notation.
1.23E+12 1.23E-12 1.23e+12 1.23e-12
# Float 1.23f
# Double 1.23d
If you know more Type, see "Type" section.
String Literal is the following.
"abc"
Type of String literal is byte[].
byte[]
my $string : byte[] = "abc";
Note that String Literal is Not Shared. New Byte Array is created and String literal is Copied to the byte array.
A character preceded by a backslash (\) is an escape sequence and has special meaning to the compiler. The following table shows the SPVM escape sequences:
[Escape Sequences] [Escape Sequence Description] \t Insert a tab in the text at this point. \b Insert a backspace in the text at this point. \n Insert a newline in the text at this point. \r Insert a carriage return in the text at this point. \f Insert a formfeed in the text at this point. \' Insert a single quote character in the text at this point. \" Insert a double quote character in the text at this point. \\ Insert a backslash character in the text at this point.
Undefined Literal is:
undef
The SPVM programming language is a statically typed language, which means that every variable and every expression has a type that is known at compile time.
The SPVM programming language is also a strongly typed language, because types limit the values that a variable can hold or that an expression can produce, limit the operations supported on those values, and determine the meaning of the operations. Strong static typing helps detect errors at compile time.
The types of the SPVM programming language are divided into two categories: numeric types and reference types. The numeric types are the numeric types. The numeric types are the integral types byte, short, int, long, and the floating-point types float and double. The reference types are package types, and array types. There is also a special undef type. An object is a dynamically created instance of a package type or a dynamically created array. The values of a reference type are references to objects. String literals are represented by array of byte.
Numeric types are byte, short, int, long, float, double.
byte
short
long
float
[Type] [Type Description] [Type Bit Size] byte Integral type 8-bit short Integral type 16-bit int Integral type 32-bit long Integral type 64-bit float floating-point type 32-bit double floating-point type 64-bit
Numeric values do not share state with other numeric values.
The numeric types are the integral types and the floating-point types.
The integral types are byte, short, int, and long, whose values are 8-bit, 16-bit, 32-bit and 64-bit signed two's-complement integers.
The floating-point types are float, whose values include the 32-bit IEEE 754 floating-point numbers, and double, whose values include the 64-bit IEEE 754 floating-point numbers.
The values of the integral types are integers in the following ranges:
For byte, from -128 to 127, inclusive
For short, from -32768 to 32767, inclusive
For int, from -2147483648 to 2147483647, inclusive
For long, from -9223372036854775808 to 9223372036854775807, inclusive
Varialbe Declaration
Varialbe Declaration with Type is the following.
my $value : byte; my $value : short; my $value : int; my $value : long; my $value : float; my $value : double;
If you know more Variable Declaration, see "Variable Declaration" section.
Array Type describe multiple values.
[Type] [Type Description] byte[] byte array short[] short array int[] int array array long[] long array float[] float array doube[] double array PackageName[] object array
Array Type is a Object Type. You can create Array by new keyword.
new
my $values : int[] = new int[3];
If you know more Array Creating, see "New Array" section.
Multiple Dimention Array Type is a Array Type.
[Two Dimension Array Type] byte[][]; short[][]; int[][]; long[][]; float[][]; double[][]; PackageName[][]; [Three Dimension Array Type] byte[][][]; short[][][]; int[][][]; long[][][]; float[][][]; double[][][]; PackageName[][][];
Max Dimension is 255.
You can create Multiple Dimension Array by new keyword.
my $values : int[][] = new int[][3];
This mean that Multiple Dimension Array is created, the multiple dimension array have 3 int[] type array. The elements is initialized by undef.
int[]
If you know Multiple Dimension Array Creating, see "New Multiple Dimention Array".
If you declare package, Package name is used as Package Type.
If you know more Package Declaration, see "Package Declaration" section.
You can create Package Type Object by new keyword.
my $obj : PackageName = new PackageName;
Array is created by new. Elements values is not initialized.
my $nums = new byte[3]; my $nums = new short[3]; my $nums = new int[3]; my $nums = new long[3]; my $nums = new float[3]; my $nums = new double[3];
You can use the three ways to get Array Length.
@$nums; @{$nums}; len $nums;
Get Array Element:
# Get $nums->[0];
Set Array Element:
# Set $nums->[0] = 5;
if (1) { } elsif (2) { } else { }
my $nums = new int[10]; for (my $i = 0; $i < @$nums; $i++) { $nums->[$i] = 0; }
my $nums = new int[10]; my $i = 0; while ($i < @$nums) { $nums->[$i] = 0; }
Comment:
# Comment
Pod syntax:
=pod AAAA BBBB =cut
Script Ending:
__END__
Throw Exception:
die "Error";
Catch Exception:
eval { die "Error"; };
$@;
Using weak reference, recursive reference is resolved.
my $foo = new Foo; my $bar = new Bar; # Recursive reference $foo->{bar} = $foo; $bar->{foo} = $foo; # Weak reference weaken $foo->{bar};
Destructor.
package Foo { sub DESTROY($self : Foo) : void { } }
Enumeration.
package Foo { enum { ONE, TWO, THREE } enum { FORE = 4, FIVE, } }
package TestCase::Extension { sub sum($num1 : int, $num2 : int) : native int; }
=
Special Assign Operator
+= -= *= /= &= |= ^= %= <<= >>= >>>=
+ - * / %
== != > < <= >=
&& || !
<< >> >>> & | ^ ~
++ --
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.