【问题标题】:Relationship between compiler and interpreter编译器和解释器的关系
【发布时间】:2017-06-28 13:34:36
【问题描述】:

**解释是否在执行 pgm 期间遵循编译阶段?**简单地说,当我们运行程序时会发生什么?如果这些是不同的事情,那么在解释之前将执行语法检查。正如我所读 python 是解释语言然后检查语句是由什么完成的?

【问题讨论】:

    标签: compilation interpreter compile-time execution-time pythoninterpreter


    【解决方案1】:

    你有两个选择:

    • 编译语言
    • 口译语言

    编译语言中,您需要一个编译器,它可以获取源代码作为输入并生成一个二进制作为输出,可以在给定的目标平台上运行。例如,C、C++ 或 Java 是编译语言。在编译器生成 binary 之后,您在目标平台上执行该 binary。生成二进制文件的编译过程涉及的主要步骤是词法、句法和语义分析以及代码生成。

    编译器是在本机平台上运行并为给定目标平台生成代码的程序(二进制)。你有两个选择:

    * target_platform == native_platform (native-compiler)
    * target_platform != native_platform (cross-compiler). 
    

    如果您有一台 x86_64 台式电脑,您的编译器在 x86_64 上运行并生成在 x86_64 上运行的代码,那么您就有了本机编译器。在这种情况下,编译器会生成本机机器代码。

    如果您有一台 x86_64 台式电脑,您的编译器在 x86_64 上运行并生成在不同平台(例如 JVM)上运行的代码,那么您就有了一个交叉编译器。您应该了解 Java 语言使用一个交叉编译器,该交叉编译器将 java 语言作为输入,并生成在 JVM(而不是 x86_64 机器上)上运行的字节码作为输出。

    其他交叉编译器,如 arm-linux-gcc、mips-linux-gcc、ppc-linux-gcc 等,获取 C 源代码作为输入并生成二进制文件以在适当的目标平台(ARM、MIPS , PPC)。

    解释语言中,您不需要编译器来生成代码,因此在进程结束时不会生成二进制文件。 bash 和 python 是解释型语言。语言的解释器(安装在您的 PC 中的二进制文件,例如 /bin/bash 或 /usr/bin/python)接收输入源代码,对其进行解释并执行它以生成输出。解释源代码所遵循的步骤与编译器所遵循的步骤完全相同,只是解释器不生成代码,只是在分析后执行。

    我前段时间写了一篇文章,解释了如何使用 python 编写自定义语言的解释器。这篇文章是用西班牙语写的,但是整个过程是一步一步解释的,所以如果你对它感兴趣的话,可以学到很多东西。在文章的最后你可以找到源代码来下载和测试。源代码可在 github 中找到。该文章可在此link

    希望对您有所帮助! :)

    【讨论】:

    • 这个二进制文件是什么意思?它是字节码吗?那么解释器会检查语法吗?如果我们写了错误的语法,它会显示一些错误吗?
    • 字节码是运行在JVM上的机器码,所以Java为JVM生成代码。尝试直接在 x86_64 上运行字节码而不安装 JVM,看看会发生什么......
    • 如果您转储二进制文件的内容(使用 hexdump 工具),它总是包含 0 和 1...但是这些位具有内部格式...在 linux 上,二进制文件使用 ELF ( en.wikipedia.org/wiki/Executable_and_Linkable_Format)。 Windows 有自己的二进制格式。
    • 编译步骤为:词法分析器、句法分析器、语义分析器、代码优化器和代码生成。每一步的输出都是下一步的输入。代码优化器(-O with gcc)负责改进输入代码以生成更高效的输出。例如,表达式 (false AND X) 等价于 false(您不需要计算 X 也不需要为其生成代码)。代码生成器是在代码优化器之后执行的步骤。它生成在目标平台上运行的代码(例如,如果您使用的是 C/C++ 编译器,则为汇编代码)。希望能帮助到你! :)
    • 根据定义,解释器不生成二进制代码。解释器读取输入源代码并生成结果。例如,python 或 bash 以这种方式工作。想象一下,你在 bash shell 脚本中有这个表达式 a=$(expr 3 + 4) 。在语义分析之后,bash 知道它有一个名为“a”的变量,它必须被赋值为“3+4”。自己的解析器进行 ADD 操作 (3+4),定义变量 a,并将结果赋值给它 (7)。
    最近更新 更多