2014-01-13 69 views
0

我有兴趣在JavaScript中编写一个Pascal编译器。但是我对编译器是什么使编译器而不是解释器感到困惑。特别是我需要生成像C/C++这样的字节码或汇编代码,例如a.out编译器vs解释器,还是用解释型语言编写编译器仍然使它成为编译器?

所以,如果我是扫描和解析hello_world.pas

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

,并产生这样的:

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

难道我只是写一个翻译或编译器?

任何有关在JavaScript中编写编译器的提示或建议将不胜感激。

+2

我想你刚刚写了一个翻译... – Floris

+1

它有什么不同?不要试图粗鲁,只是试图理解为什么这里使用的术语对你很重要。 – Oak

+0

http://stackoverflow.com/a/3618119,http://stackoverflow.com/a/2377288 –

回答

6

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

编译器读取以高级语言编写的源代码并将其翻译为其他内容。编译器通常使用低级语言(通常是机器代码)生成可执行程序。从那里开始,你所需要的只是编译的可执行文件运行的程序;你只需要源代码和编译器,如果你想修改的程序。

解释器还读取高级别的源代码,但不是生成可执行文件,而是执行解析程序。要运行这样的程序,你总是需要一份源代码和解释器的副本。

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

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

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

+1

所以你在说OP是编写一个编译器还是一个解释器?您的定义似乎都不适用于它。 – delnan

+0

我增加了另一段来解决这个问题。 –

+1

值得注意的是,许多“口译员”会在解释源文件之前将其转换为某种中间形式。如果中间形式可以持续下去,并且不期望成为源文件的完整表示形式,那么人们可以将转换为中间形式视为“编译”[许多1980年代的BASIC解释器会在输入每行时对其进行预处理并丢弃原始文件;一个'LIST'命令会重建每一行显示的原始形式。预处理的版本不是文本,但是*仍然是“源代码”。] – supercat