如何编写第一个语言

问题描述 投票:-1回答:1

这是鸡和蛋的问题。为语言X引导编译器的一个解决方案是使用语言Y,但是如何首先编译语言Y的编译器?!如果你一直跟踪到没有编译器存在的时间,那么第一个编译器如何能够自己编译?请使用高级隐喻来帮助理解。

compiler-construction bootstrapping
1个回答
5
投票

我们将其视为可以在C1中编写任何非C语言的编译器

所以我们也可以问:如果我有一台计算机但没有编译器,而且我想要一个C编译器,我该怎么做?

您可以在计算机的assembly language中编写一个C编译器,假设您有该计算机的assembler

在实践中,这将是愚蠢的努力。更明智的是,你会在汇编代码中编写一个比汇编程序更具表现力和强大功能的中间语言编译器,然后用它来编写一个更具表现力和更强大的编译器......直到你编写了一个C编译器。

每个逐步更多的powerul编译器都是一个程序,它将源语言(您作为发明者已经定义)转换为计算机的汇编语言,然后调用汇编程序(您已经拥有)来翻译程序集代码到您的计算机的机器代码2。

如果你还没有装配工怎么办?

然后你必须在计算机的machine code中编写汇编程序。在机器代码中从头开始编写一个复杂的程序可能是没有人能够做到的事情。但在任何人编写汇编程序之前 - 机器代码 - 所有程序都必须用机器代码编写。第一批装配工是在late 1940s开发的。与编译器一样,你最好是迭代地开发汇编程序:首先是一个基本的,用机器代码编写的;接下来是一个更强大的,用最基本的一个写的......

计算机的机器代码是CPU的本机语言,因此无需进一步转换即可将其转换为可执行代码。您只需要将组成机器代码程序的字节加载到内存区域并让处理器在初始地址加载指令:然后计算机正在运行程序。

第一个C编译器的创建几乎就像上面描绘的那样。 The Development of the C Language是该语言的发明者Dennis Ritchie记录的历史


[1]当然,从历史上看,几个主要的高级语言编译器早于C, ~1969-73

[2]对于现代编译器,这是一个很大的简化。阅读Intermediate Representation并查看,例如The Conceptual Structure of GCC

© www.soinside.com 2019 - 2024. All rights reserved.