我一直在弄清楚一个口译员的确切工作原理,我用谷歌搜索了一下,得出了一些结论,只是希望有人能让我更好地理解口译员的工作。
所以我所理解的是:
java解释器是将代码从高级语言转换成机器format.
现在我仍然不清楚在两者之间发生的子过程,即
更多的问题:
中执行?
发布于 2017-05-09 13:45:44
给出1000英尺的视角,希望能让事情变得清晰起来:
java应用程序有两个主要步骤:编译和运行时。每个进程都有非常不同的功能和目的。下面列出了这两种方法的主要流程:
编译
[com.sun.tools.javac][1]
执行,通常在tools.jar文件中,通常在$JAVA_HOME中-与java.jar等位于同一位置。编译步骤:
[com.sun.tools.JCTree][3]
。总体思想是每个表达式和每个语句都有一个java对象。在这个时间点上,人们对每种类型所代表的实际“类型”知之甚少。在创建syntax运行时
还有..。
Java是在JSR 199下标准化的编译器
,几乎每一种语言都有相应的调整
发布于 2017-05-10 08:13:26
我将根据我创建DSL的经验来回答。
C是编译的,因为你把源代码传给了gcc,然后在机器代码中运行存储的程序。
Python之所以被解释,是因为您通过将程序源代码传递给解释器来运行程序。解释器读取源文件并执行它。
Java是两者的混合体,因为您将Java文件“编译”为字节码,然后调用JVM来运行它。字节码不是机器码,它需要由JVM解释。Java是介于C和Python之间的一层,因为你不能做像"eval“这样花哨的事情(像在Python中那样在运行时计算代码块或表达式)。然而,Java具有C程序不可能拥有的反射能力。简而言之,Java运行时的设计处于纯编译语言和解释语言之间的中间层,在性能和灵活性方面是这两种语言中最好的(也是最差的)。
然而,Python也有一个虚拟机和它自己的字节码格式。这同样适用于Perl、Lua等。这些解释器首先将源文件转换为字节码,然后解释字节码。
我一直想知道为什么这样做是必要的,直到我为模拟DSL制作了自己的解释器。我的解释器执行词法分析(将源文件拆分为标记),将其转换为抽象语法树,然后通过遍历该树来计算该树的值。出于软件工程的考虑,我使用了一些设计模式,并且我的代码大量使用了多态性。与处理模仿真实计算机体系结构的有效字节码格式相比,这非常慢。如果我创建自己的虚拟机或使用现有的虚拟机,我的模拟将会更快。例如,对于计算一个很长的数值表达式,将其转换为类似于汇编代码的东西会比处理抽象树的分支更快,因为这需要调用大量的多态方法。
发布于 2019-04-29 11:32:47
执行程序有两种方法。
.exe
上,它将编程语言(比如.c
)中的文本解析为机器码。然后可以独立于编译器执行。这种编译可以通过将几个.c
文件编译成几个目标文件(中间产品),然后将它们链接到单个应用程序或库中来完成。
.java
)中的文本,然后“立即”执行程序。对于java,这种方法有点混合/堆叠: java编译器javac
将.java
编译成.class
文件,然后可能将这些文件压缩到.jar
(或.war
、.ear
...)中。对于抽象堆栈机器,.class文件由更抽象的字节代码组成。
然后,java运行时java
(称为JVM、java虚拟机或字节码解释器)可以执行.class/.jar。这实际上是一个java字节码的解释器。
现在,它还在运行时将(部分)字节码转换为机器码。这也称为将字节码转换为机器码的即时编译器。
简而言之:- compiler
只是创建代码;- interpreter
会立即执行。
解释器将遍历解析的命令/高级中间代码,并用一段代码解释每个命令。间接的,原则上是慢的。
https://stackoverflow.com/questions/43870794
复制相似问题