我有兴趣用JavaScript编写Pascal编译器。但我对编译器的原因感到困惑 - 编译器而不是解释器。具体来说,我需要生成字节码或汇编代码,如C / C ++,例如的的a.out
所以如果我要扫描并解析 hello_world.pas :
program helloworld;
begin
Writeln('Hello world!');
end.
生成这样的东西:
(function() {
console.log('Hello world!');
})();
我刚刚编写了解释器或编译器吗?
我们非常感谢您在JavaScript中编写编译器的任何提示或建议。
答案 0 :(得分:6)
程序是编译器还是解释器是由其输入和输出决定的,而不是由程序本身的体系结构决定的。
编译器读入用高级语言编写的源代码并将其转换为其他语言。大多数情况下,编译器会生成低级语言的可执行程序,通常是机器代码。从那里,您只需要编译的可执行文件运行程序;如果你想修改程序,你只需要源代码和编译器。
解释器还读取高级源代码,但不是生成可执行文件,而是在解析时执行程序。要运行这样的程序,您将始终需要源代码和解释器的副本。
通常编译编译器和解释器,在编译器的情况下,编译器通常用于编译自身(这称为bootstrapping)。但这只是普遍的做法。没有实际的理由说明为什么你不能用解释语言编写编译器。
关于编译器应输出什么类型的低级语言,这取决于您希望可执行文件运行的体系结构。您很可能希望为您的平台生成汇编语言,然后使用预先存在的汇编程序将其转换为机器代码。
您编写的代码只是将Pascal代码翻译成Javascript代码。您可以将其视为一种编译:您正在将Pascal编译为Javascript,因此它可以由Javascript解释器运行。例如,如果您正在尝试编写允许用户在Web浏览器中运行Pascal代码的内容,那么您就有了正确的想法。