以下类比是正确的还是我误解了一些东西

时间:2014-11-11 09:10:24

标签: compiler-construction programming-languages interpreter

我正在寻找编程语言和脚本语言之间的区别。

这是我的比喻,我是如何理解的:

我是一个只能执行用德语(机器语言)编写的命令的CPU。

现在有人可以用英语写命令。

编译器会将整个代码翻译成德语,所以我可以一个接一个地执行命令。 这就是编程语言的工作方式......您使用编程语言编写代码,并且需要一个编译器,它将此代码转换为机器代码,因此计算机能够执行这些命令。 此翻译只进行一次。

解释器就像第三个人,它将一个接一个的命令翻译出来,这样我(CPU)就能理解英语(脚本语言)。

对我来说执行命令,解释器是必不可少的,否则我不懂语言(脚本语言),但对于编译(翻译)的命令文本,不需要任何解释器,因为文本在我自己的语言。

如果我犯了错误,请告诉我。

2 个答案:

答案 0 :(得分:2)

这是一个类比,所以它大约正确(但"邪恶在细节")。

请注意,语言是规范,通常在英文文档中(例如n1570ISO/IEC 9899:2011用于C11)。你不需要一台电脑来运行"某种语言的某些程序(你可能会不道德地使用一堆人类奴隶,或者在脑海中运行程序)。语言可能有多种实现(一些是解释器,另一些是编译器)。您可以将机器代码视为以某种机器语言编写的(这实际上是第一台计算机的情况,如ENIAC;在20世纪40年代,它是由人类用机器语言编写的;作为1975年的少年,我编程了用机器语言博物馆IBM1620

但是,在极少数情况下,您仍然希望翻译自己的机器代码:想象使用一些低效操作码的二进制程序。您可以将其他程序转换为更合适的机器代码。

compilersinterpretersmachine codecompiler optimizationobject codebytecodeJIT compilation,{{上阅读wikipages 3}},emulatorsmicroarchitecturemicro-operationhomoiconicitypartial evaluationeval

许多编译语言都有一些解释方面(例如C中的closures)。某些语言实现能够动态生成机器代码,特别是(printfCommon Lisp。所以解释器和编译器之间的区别是模糊的。

即使使用编译语言,在某些操作系统上,程序也可以动态生成一些代码(例如在C或C ++中),然后编译并SBCL它。我正在dynamically load做这些事情。

某些脚本语言被转换为字节码甚至是机器代码,具体取决于实现(例如MELT)。在我看来,V8 javascript engine是一个比编译更重要的功能(大多数脚本语言和编译语言共享)。

我不确定脚本语言和编译语言之间是否存在明显的区别,特别是因为编译器是某种语言的实现(并且相同的语言可以还有一个解释器turing-completeness两者 ocaml - 一个顶级解释器 - ocamlc - 一个字节码编译器 - 和{{1 - 本机编译器 - );相反,我看到编译和解释实现之间的连续性。

答案 1 :(得分:0)

现在,解释器和编译器之间的区别不再那么明显,因为工具要复杂得多。例如。 java虚拟机可以编译读取源文件,将它们编译成字节码,运行它们,在运行过程中将其中的一部分编译成机器码,经过一段时间反编译回字节码,运行,再次编译成机器码等。您也可以在不停止程序的情况下更改代码