我对解释器的理解

对于解释器,其实一直停留在一句 边解释边执行。有一次,对js语法有点不理解时,思考到是不是解释器本质上与编译器不相同导致的呢。于是,查询了解释器的相关内容,但是,没有找到我想要的结果。

不要紧,咱来分析分析。

首先,所有的程序运行到操作系统上都会成为进程。进程包括内核中的pcb 以及内存中相应的空间,包括代码区,常量区,全局变量区,堆区,栈区。而且我们知道代码区和常量区是不可改变的。

先来简单说说编译型器的工作,接受.c或者.cpp文件,作为输入,经过预处理器、编译器、汇编器生成可执行文件,然后连接器生成可执行程序。这个时候的可执行程序可以说已经包含了代码区、常量区和全局变量区。运行时,直接通过地址映射到内存空间即可,想到与拷贝,然后系统给其多分配初始的堆区和栈区。栈区分配的大小固定,不够了也不会分配。堆区,如果不够了可以动态向系统要空间。这就是为什么编程的时候将达到数据放到堆空间里面啦。有点跑题了。

再来说说解释器,以java为例,首先会在本地计算机上经过编译,将.java文件编译成.class文件,让后通过网络传输到要运行的计算机上,通过jvm,也就是解释器来执行。

上面这些内容相信大家都来了解过了。但是,这里有个问题就是,jvm解释器是如何边解释便执行的呢。

纯的解释器不会生成可执行文件。我们可以这样理解,jvm进程仅仅是将.class文件当作是文本输入,让后根据数据直接执行。

举个例子,

下面有一句程序, static int a =2;

jvm解释器识别出这句话后,直接就会执行, int a =2;

也就是要执行的程序在解释器中已经包含了,有点像我们写的switch一样。

比如我们通过cpp语言,这样写了一个解释器:

fstream a("xxxxxx");   //将输入的源文件打开 假如打开正确

string word;

a>>word;   //从文件中读入一个单词

switch(word){

case int:{

int a;

break;}

case double:{

double a;

break;}

default:

break;

}

这样的话就会非常好理解了。

但是,编译器就会产生相应的二进制程序。

编译器相应会这样:

fstream a("xxxxxx");   //将输入的源文件打开 假如打开正确

string word;

a>>word;   //从文件中读入一个单词

switch(word){

case int:{

//产生int a对应的二进制程序,但不是直接执行

break;}

case double:{

//产生dobuel a对应的二进制程序,但不会直接执行

break;}

default:

break;

}

说到这里,大家大概明白了,解释器必须依赖于编译器才行,为啥?因为jvm虚拟机一定是个编译器产生的程序。

回到开头引起我思考解释器的问题,实际上解释器语言的语法和编译型语言的语法都非常相同,没有说有非常大底层不同的。

希望能够帮助到大家。

 

 

 

你可能感兴趣的:(杂货铺(思考:想到哪,写到哪))