解释语言和编译语言
编译语言,是指其编译器生成的可执行文件为机器码,可以直接在计算机上运行的语言,比如说 C/C++ \texttt{C/C++} C/C++ 。
解释语言,是指经由解释器生成的可执行文件为字节码文件,只能运行在特殊的虚拟机上的语言,比如 Java, Javascript, Python, C# \texttt{Java, Javascript, Python, C\#} Java, Javascript, Python, C#
就现代而言,这两种语言并没有严格的划分,比如存在技术使得 Java \texttt{Java} Java 可以生成机器码,直接运行。
两者的优越点比较
- 编译语言因为可以生成 CPU \texttt{CPU} CPU 可以识别的机器码,所以一般来说,运行速度会快于解释语言,读者可以用 Java \texttt{Java} Java 以及 C++ \texttt{C++} C++ 分别编写一个基于循环的计算斐波那契数列的,不使用代码优化的程序,比较一下运行的效率。
- 一般来说,编译语言会将内存管理暴露给编写程序的人,往好的说,这可以使人们更自主地管理内存,但是需要人们避免自己编写的代码存在内存泄漏,而这往往会增加代码的复杂度。而解释语言会在解释器/虚拟机中实现内存管理,一般来说会有 GC (Garbage Collection) \texttt{GC (Garbage Collection)} GC (Garbage Collection) 机制,较少出现内存泄露。
接下俩,我们将不会区分编译和解释这两个概念,将以统一定义为将程序源文件翻译为可执行文件的过程。
本系列博客目标
使用 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 {...
}