Compiler construction 编译器之前有编程语言吗?

Compiler construction 编译器之前有编程语言吗?,compiler-construction,operating-system,history,Compiler Construction,Operating System,History,显然,一定有一种编程语言可以编写编译器,但人们过去是用COBOL(或其他语言)编写,然后手工编译成汇编语言,还是在有人想到更高级的语言之前都是用汇编语言编写的?谢谢,ell。为了直接回答这个问题,程序员没有使用正式的高级语言,然后手动转换为汇编语言。他们使用流程图,这是一种图形语言,但随后直接对程序集进行编码。根据流程图上的这一点,冯·诺依曼在1947年电子计算出现时使用了它们 在编译器出现之前,大多数代码都是用汇编语言编写的。有人可能会争辩说,汇编程序是一种原始类型的编译器,因为它会将助记符(

显然,一定有一种编程语言可以编写编译器,但人们过去是用COBOL(或其他语言)编写,然后手工编译成汇编语言,还是在有人想到更高级的语言之前都是用汇编语言编写的?谢谢,ell。

为了直接回答这个问题,程序员没有使用正式的高级语言,然后手动转换为汇编语言。他们使用流程图,这是一种图形语言,但随后直接对程序集进行编码。根据流程图上的这一点,冯·诺依曼在1947年电子计算出现时使用了它们

在编译器出现之前,大多数代码都是用汇编语言编写的。有人可能会争辩说,汇编程序是一种原始类型的编译器,因为它会将助记符(如
mov reg1、[reg2]
)转换为操作码

在汇编之前,操作码是直接输入的。由于没有只读内存,引导例程是通过实际设置字节和开关来进入的


维基百科的文章可能会有所帮助。

编译器通常是自举的。这意味着编译器是用已经存在编译器的语言编写的

很常见的情况是,有些编译器使用与它们编译的语言相同的语言编写:Mono编译器是C#,Vala编译器是Vala

在Mono的例子中,它是使用Microsoft C#编译器编译的,直到Mono能够自行构建。在Vala的例子中,编译器(AFAIK)是用C编写的,直到它能够编译足够的Vala来用Vala重写编译器为止

所以你是对的。如果没有其他编译器可用,某些编译器必须在某个时候以汇编方式编写。或者至少包含一个用另一种语言编写的编译器的功能较差的版本,以便引导编译器。

当然

是康拉德·祖斯在1943年提出的。(50年来没有人为它编写编译器,而编写的编译器只是为了证明它是可以做到的)

大多数其他人首先发明了各种二进制编码方案,然后是汇编程序

Fortran可能是第一种广泛使用的“高级”语言。

编程语言和编译器的概念是携手发展的。格雷斯·霍珀(Grace Hopper)通常被认为开发了第一个编译器:

1952年,Hopper完成了她的第一个编译器(为Sperry Rand computer编写),称为A-0系统。正如她后来所说,她之所以这么做,是因为她很懒,希望程序员能重新成为数学家

A-0系统实际上是一组可以将符号数学代码翻译成机器语言的指令。在制作A-0的过程中,Hopper把她多年来收集的所有子程序都录在磁带上。每个例程都有一个呼叫号码,这样机器就可以在磁带上找到它。正如Hopper所描述的:“我所要做的就是写下一组电话号码,让计算机在磁带上找到它们,把它们带过来,然后进行添加。这是第一个编译器。”

资料来源:

如上所述,“A-0的功能更多的是作为一个加载器或链接器,而不是现代意义上的编译器。”(它有点像是将子例程编译在一起,因此得名。)目前我手头没有任何更详细的参考资料,但你可以想象,A-0和类似程序可以处理的输入逐渐演变为更复杂的,更像现在所说的“高级编程语言”——编译器承担了更多的现代翻译功能,而不仅仅是代码编译器(但名称仍然存在)

您可能可以在Hopper在第一届“编程语言历史”会议上发表的主题演讲的记录中找到更多细节,该记录发表在。如果我记得很清楚的话,她在那里描述了事情是如何从A-0发展到她后来的工作的,这也启发了COBOL;但我自己还没有重读这篇文章

有趣且有趣的是,Hopper说她对编写程序的想法遇到了阻力:

“我有一个正在运行的编译器,没有人会碰它,因为他们仔细地告诉我,计算机只能做算术,不能做程序。”

资料来源:


这并不是完全脱离主题,但它可能更适合我相信OP想知道程序员是否使用正式语言来描述算法,然后手动转换为汇编语言。以及汇编语言和更高级语言之间的关键区别(无论是编译的还是解释的)是HLL程序指定行为,而汇编程序指定机器代码。@KeithThompson:好的观点,尽管我的评论只是严格地说,汇编程序是编译器,尽管是非常有限的。这取决于“汇编程序”和“编译器”这两个词的含义。这一点可以(而且已经!)进行长篇大论的讨论,但除了人们所说的这两个词的含义外,没有说明其他任何东西。(我个人认为机器代码与行为的区别是最有用的,但其他人当然会有不同的看法。)