compiler-construction - 编译器是如何开发的,它们如何翻译您的代码?

标签 compiler-construction

<分区>

最近对程序的开发和执行比较好奇,想多了解一些。编译器尤其让我感到困惑和感兴趣。

编译器是如何开发和创建的?您不需要使用另一个编译器来编译您为新编译器编写的程序吗?生成编译器需要采取哪些步骤......?

不仅如此,编译器将高级代码翻译成多“深度”?我已经阅读了所有关于不同“世代”和“级别”的编程语言,但是编译器的给定范围是多少?它们是否直接转化为最低级别的编程,即机器代码?或者它们是否编译成某种其他语言,再次重新编写以执行?

但澄清一下,我并不是在问构建一个编译器是否是一个合理的想法,或者我应该尝试编译什么。我只是想知道编译器是如何开发的,构建它们的步骤是什么,以及它们通常编译的深度。

非常感谢阅读!!

最佳答案

从历史上看,编译器使用执行词法分析的“词法分析器”,将源代码分解为“部分”。例如,这个句子是由单词组成的,词法分析器会根据空格来识别单词。词法分析器不知道单词的“意思”是什么,但能够理解单词的组成。对于编程语言,词法分析接受源代码并输出“ token 和运算符”流(或语言定义为基本的任何原子单元)。

然后,将词汇成分(单词)输入另一个系统以执行语义分析。例如,英语具有“NOUN-VERB”的可理解句子结构,如“Jack runs”。对于英语或任何其他语言(包括源代码语言),还有许多其他逻辑句子结构是可以接受的,包括使用副词、命题短语等。如果词汇成分“匹配”语义分析系统中接受的模式,编译器就会“理解”所说的内容(或句子应该“表达的意思”)。

最后阶段是将语义分析(“理解”)“翻译”为目标平台(Windows、Mac、Posix 等)的可执行指令。因此,尽管词法分析和语义分析将独立于任何平台平台,可执行指令的最终翻译非常依赖于平台。

最后,编译器历来通过这三个步骤执行此“编译”以生成特定于平台的可执行指令,其中结果被送入“链接”所有部分的最后阶段。例如,函数调用必须“连接到”那些函数调用的定义。这是由链接器完成的。

我说“历史上”,因为对于将上述步骤稍微合并的解释性语言来说,它可能会略有不同。我们不称他们为“编译器”(他们“有点”是,有时实际上),而是称他们为“解释器”。此外,一些技术有各种混合体。例如,C++ 是最难处理的语言之一(语言本身在如何解释源代码中发现的内容方面非常复杂),因此一些方法“合并”词法分析和语义分析以“帮助确定"所说内容的上下文。

这是一个广阔的世界/领域,但理解它会非常令人满意,并且有助于了解如何利用语言和解决问题。

关于compiler-construction - 编译器是如何开发的,它们如何翻译您的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6005686/

相关文章:

c - 语言解析器 Bison 中的语法错误

compiler-construction - MPI 阻塞接收语义

compiler-construction - 缺少 Visual Studio 2010 : COBOL in VS 2010,?

c++ - 指针转换字节顺序

c# - 为什么 C# 编译器仍然从未使用的方法中读取编译代码?

c++ - 编译时断言?

c++ - -std=c++11 标志在 gcc/g++ 4.4.6 中无法识别

java - 如何从ANTLR语法中收集 'returns'

java - 基于规则构建转型引擎

c++ - 编译器如何识别其主机的硬件?哪个组件?