解释器不会将源代码翻译成本地机器代码。虽然您的计算机只能执行机器代码,但它执行的机器代码不一定必须是高级语言的翻译。令人困惑?让我们看一个简单的玩具示例...
考虑编程语言 PrintForPony 有两个函数,print 和 sleep。 print 函数将一个字符串作为其唯一参数并将其打印到标准输出,而sleep 将一个正整数作为其唯一参数并使当前线程在该时间段内休眠。 PFP 的伪 BNF:
program ::= statement_list
statement_list ::= statement | statement NEWLINE statement_list
statement ::= print STRING | sleep POSITIVE_INTEGER
这是 PFP 解释器的一个超级简单的 Java 实现。该程序将源文件作为其唯一参数并对其进行解释:
import java.io.BufferedReader;
import java.io.FileReader;
public class PFPInterpreter {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new FileReader(args[0]));
String line = null;
while ((line = br.readLine()) != null) {
if (line.startsWith("print ")) {
System.out.println(line.substring("print ".length()));
} else if (line.startsWith("sleep ")) {
Thread.sleep(Long.parseLong(line.substring("sleep ".length())));
} else {
throw new IllegalArgumentException("Unknown function: " + line);
}
}
}
}
一个示例源文件:
print Hello, World!
sleep 1000
print Goodbye, World!
以及样本输出:
$ java PFPInterpreter test.pfp
Hello, World!
Goodbye, World!
PFP 在任何时候都不会被翻译成本地机器代码。执行的本机机器代码是 JVM,它与这种玩具语言无关。我们还可以为 PFP 编写一个编译器,将代码转换为可执行文件(我不打算这样做,因为这个答案已经太长了),但问题的关键在于解释器不会编译为本机机器代码 - 它读取输入文件并根据内容做一些事情。
回答问题:
1) 解释器是为您运行代码的运行时。我不确定你在哪里读到解释器在运行时不起作用,但我也不确定它应该是什么意思。
2) 如上所示,不,解释器不会转换为本机机器代码。 JIT 编译器可以。您的处理器仅执行本机机器代码,但本机机器代码可以是读取任意文件并根据内容执行某些操作的程序。从这个意义上说,解释器实际上只是一个以文本文件形式接受输入的典型程序。
3) JIT 编译非常复杂,而且我根本不是专家。但是,例如,对于 Java 的 HotSpot,代码块必须执行一定次数(客户端 1,500 次,服务器端 15,000 次,IIRC),然后才能调用 JIT 编译器。这很可能是因为实际编译不是免费的,并且很可能已编译的本机机器代码被缓存以供以后执行(这可以解释多次执行的要求)。这使得 JIT 编译是一项投资(在时间和空间上),在第一次执行时可能不会更快(甚至可能更慢),但随后的执行会更快,因为不再需要编译,原生机器码效率更高。
4) 见上文。
希望对你有帮助!