编译器与解释器,还是用解释语言编写编译器仍然使它成为编译器?

时间:2014-01-13 22:32:39

标签: compiler-construction interpreter

我有兴趣用JavaScript编写Pascal编译器。但我对编译器的原因感到困惑 - 编译器而不是解释器。具体来说,我需要生成字节码或汇编代码,如C / C ++,例如的的a.out

所以如果我要扫描并解析 hello_world.pas

program helloworld;
begin
    Writeln('Hello world!');
end.

生成这样的东西:

(function() {
  console.log('Hello world!');
})();

我刚刚编写了解释器或编译器吗?

我们非常感谢您在JavaScript中编写编译器的任何提示或建议。

1 个答案:

答案 0 :(得分:6)

程序是编译器还是解释器是由其输入和输出决定的,而不是由程序本身的体系结构决定的。

编译器读入用高级语言编写的源代码并将其转换为其他语言。大多数情况下,编译器会生成低级语言的可执行程序,通常是机器代码。从那里,您只需要编译的可执行文件运行程序;如果你想修改程序,你只需要源代码和编译器。

解释器还读取高级源代码,但不是生成可执行文件,而是在解析时执行程序。要运行这样的程序,您将始终需要源代码和解释器的副本。

通常编译编译器和解释器,在编译器的情况下,编译器通常用于编译自身(这称为bootstrapping)。但这只是普遍的做法。没有实际的理由说明为什么你不能用解释语言编写编译器。

关于编译器应输出什么类型的低级语言,这取决于您希望可执行文件运行的体系结构。您很可能希望为您的平台生成汇编语言,然后使用预先存在的汇编程序将其转换为机器代码。

您编写的代码只是将Pascal代码翻译成Javascript代码。您可以将其视为一种编译:您正在将Pascal编译为Javascript,因此它可以由Javascript解释器运行。例如,如果您正在尝试编写允许用户在Web浏览器中运行Pascal代码的内容,那么您就有了正确的想法。