编译语言,是指其编译器生成的可执行文件为机器码,可以直接在计算机上运行的语言,比如说 C/C++ \texttt{C/C++} C/C++ 。
解释语言,是指经由解释器生成的可执行文件为字节码文件,只能运行在特殊的虚拟机上的语言,比如 Java, Javascript, Python, C# \texttt{Java, Javascript, Python, C\#} Java, Javascript, Python, C#
就现代而言,这两种语言并没有严格的划分,比如存在技术使得 Java \texttt{Java} Java 可以生成机器码,直接运行。
接下俩,我们将不会区分编译和解释这两个概念,将以统一定义为将程序源文件翻译为可执行文件的过程。
使用 C/C++ \texttt{C/C++} C/C++ 实现一个简单的解释器和对应的虚拟机,包含最简单的 GC \texttt{GC} GC,参照 C++, Java \texttt{C++, Java} C++, Java ,支持一个简单的支持面向对象,支持多文件编译的语言。
基本类型支持 char, int32, int32, uint64 (unsigned int64), float64
。同时,可以使用 class type
定义自己的类型。
var type var1, var2; // 定义两个类型为 type 的变量,名字为 var1, var2
var type[] arr1, ...; // 定义若干个类型为 type[] 的一维数组,名字为 arr1
//下面是一些具体的例子
var int a = 10, b = 114;
var int[] arr;
var float64[][] farr;
参照 C/C++ \texttt{C/C++} C/C++ 的运算符表,将强制类型转化改为 =>
, 不支持自增,自减,不支持三目运算符,不支持连续赋值。
if (expression1) {
do something
} else {
do something
}
if (expression2) do something
while (expression1) {
do something
//支持 break 和 continue
}
for (var int i = 0; i < n; i = i + 1) do_something
支持全局函数和类的成员函数,支持区分不同参数表的同名函数
[private/public/protected] func type func_name(type arg1, type arg2...) {
return ;
}
参照 Java \texttt{Java} Java
class A {
public int member1;
private int member2;
protected int member3;
public func int GetMember1() { return }
func __init__() {
member1 = 1;
member2 = 2;
}
}
class B :: A {
func __init__() {
super();
member3 = 3;
}
}
//新建对象
var A a = A(), c = $A;
var B b = B();
//父类变量可以存储子类的值
a = b;
//下列写法不合法
b = a;
//新建数组
var A[] a = $A[size]
var B[][] b = $B[size][size]
//注意,这里数组中的元素都没有执行构造函数,默认是null
using space1::space2::space3;
namespace space1::space2 {
...
}
namespace space1 {
...
}