写一个简单的解释器(0) 简介和目标

解释语言和编译语言

编译语言,是指其编译器生成的可执行文件为机器码,可以直接在计算机上运行的语言,比如说 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 {
    ...
}

你可能感兴趣的:(解释器的实现,开发语言,c语言)