在C语言之前用于操作系统开发的编程语言

9

我知道C语言是操作系统开发的标准编程语言,但是出于好奇,我想知道在C之前主要用什么编程语言进行操作系统开发?


7
SO帖子中透露出年轻的气息。大部分C语言诞生于1972年,而(如下所述)CP/M于1973年问世,Ada语言于1977年,MS-DOS于1981年,Macintosh于1984年,Amiga于1985年等等。 - joe snyder
1
然而,在20世纪90年代之前的个人电脑上进行竞争性开发需要汇编语言编程,因为当时的特性受到内存和处理周期的限制,而不是可维护性和质量保证。 - Potatoswatter
4
@Potatoswatter说:读原帖的问题有两种方式:“在C语言被用于Unix操作系统开发之前,操作系统开发主要使用什么语言?”或者“微型计算机开始使用C语言之前,操作系统开发主要使用什么语言?”老一辈的读者会认为是前者,年轻一些的读者则会认为是后者。 - joe snyder
@Joe:我今年25岁,但我是一个历史迷;v)所以我用其他术语回答了…… - Potatoswatter
@joe snyder Micros?那是什么? :D - Dr. belisarius
6个回答

9

C语言在Unix(1969年...)之前有很多系统。 这里是一个简略的时间轴。 点击每个系统以获取详细信息。大多数早期系统将使用汇编语言实现。一个值得注意的例外(未列在时间轴中)是1961年先进的B5000,其操作系统是用ALGOL编写的。


1
+1 提到B5000。我的第一份真正的编程工作是为犯罪和犯罪信息系统编写的,目标是B5900。 - JeremyP

5

Burroughs是最早使用非汇编语言开发操作系统的公司之一,他们选择了一种Algol方言。

1965年,Multics(由ARPA资助的Project MAC)开始设计,并选择使用PL/I来开发操作系统。1969年,Multics在MIT开放使用,但存在许多问题,Bell Labs退出了Project MAC。Ken Thompson、Dennis Ritchie、Doug McIlroy和J.F.Ossanna继续寻求完美解决方案,Unics(后来的Unix)的开发也随之开始。

Multics历史

Multics失败?

Unix v. Multics


1
在麻省理工学院和霍尼韦尔公司,PL/I经常被使用。我相信罗马数字I被用来表示这是PL/1,但是有所不同。 - dbasnett

5
在1970年代的“冷战”期间,有一种利用ALGOL 68的数据安全和并行处理功能来创建基于安全/能力的操作系统的努力: 剑桥CAP计算机 - 操作系统的所有程序都是用ALGOL 68C编写的,尽管许多其他密切相关的受保护程序(如分页器)是用BCPL编写的。 参见微软

Flex 机器 - 这台硬件是定制的,可以进行微程序设计,有一个操作系统、(模块化)编译器、编辑器、垃圾回收器和文件系统,全部使用 Algol 68RS编写。该 Algol68RS 的 Linux 移植版可从 Sourceforge:algol68toc 下载。

/* 有趣的是,DRA 的代数指定的抽象机器 Ten15 的部分仍然可用,也可以从 Sourceforge:TenDRA(适用于 minux)获取。 Ten15 作为 DRA 编译器的中间语言,并演变成支持 C 和 Ada。 显然,曾经尝试使用 TenDRA C 编译器移植 FreeBSD / Unix */

ICL VME - S3编程语言操作系统VME的实现语言。S3基于ALGOL 68,但数据类型和运算符与ICL 2900系列提供的相同。该操作系统仍作为Linux虚拟机使用,并拥有约10万用户。

苏联时代的计算机Эльбрус-1 (Elbrus-1)和Эльбрус-2是使用高级语言uЭль-76 (AL-76)创建的,而不是传统的汇编语言。uЭль-76类似于Algol-68,主要区别在于uЭль-76支持硬件级别的动态绑定类型。uЭль-76用于应用程序、作业控制、系统编程c.f. e2k-spec

也许美国军方在某个地方正在做类似的事情。有人知道吗?


4

许多16位Forth系统的解释器和(相当原始的)操作系统层都是用Forth编写的。

最初的Mac OS是用68k ASM和稍微扩展的Pascal混合编写的。

ADA已被用于编写多个操作系统。

但我猜在C之前,用于操作系统开发的主要语言是IBM 360汇编语言。


如果有人想窥探汇编语言开发主机操作系统的历程,这本书非常适合:http://www.amazon.com/OPERATING-SYSTEMS-STUART-DONOVAN-MADNICK/dp/B000OFTIBI - 只是出于历史好奇心而阅读哦 :D - Dr. belisarius
最初的Mac OS完全用汇编语言编写。那个机器的内存非常有限。(不过汇编语言非常好用。并且从一开始就提供了Pascal用于应用程序,也用于原型开发。) - Potatoswatter
此外,直到苹果转向英特尔处理器之前,它一直在使用Forth语言。Open Firmware是一种比EFI更优秀的系统... - Potatoswatter
请列举一个在C语言普及之前使用Forth语言编写的重要操作系统。Forth语言只有在8位6502处理器广泛应用于家用电脑(如Apple、BBC微型电脑、Commodore等)时才走出了其小众环境,因为6502处理器由于其256字节的堆栈限制(以及其他一些架构限制)而难以支持编译语言。Jupiter Ace实际上内置了Forth作为其主要用户环境,因为它的内存不足以运行Basic,但所使用的Forth必须是用汇编语言编写的,而不是Forth语言本身。 - Dipstick
@chris:他说的是原始系统,而不是流行的通用家庭操作系统。但感谢你提到了后者之一。至于“必须使用汇编语言而不是Forth编写”……这被称为引导程序,而Forth可以在跨平台上很好地工作,因为它不区分编译函数和生成数据。 - Potatoswatter

3
这要看情况而定。例如,Amiga操作系统最初是用BCPL编写的,而许多古老的操作系统则可能是用纯汇编语言编写的。
CP/M(类似于MS-DOS的前身)是用PL/M编写的,但出于性能原因,MS-DOS是用汇编语言编写的。这里有一些关于MS-DOS的信息:http://www.patersontech.com/Dos/Byte/InsideDos.htm (已编辑,不确定我从哪里得到了这个Fortran垃圾。)

3
这是我第一次听到有人建议CP/M是用Fortran写的。很明显,它的大部分内容都是用汇编语言编写的(我的确确定没有编译器生成那段代码)。通常认为CP/M是用PL/M编写的(我认为这可能是正确的,尽管我无法指出源代码来证明它)。 - Jerry Coffin
我相信许多流行的计算机都采用汇编语言开发操作系统,例如C64和Apple II。在那个时代,操作系统和软件都足够简单,以至于完全使用汇编语言编写大部分软件被视为常态,特别是当操作系统只需为机器提供单一硬件规范的驱动程序时。 - Merlyn Morgan-Graham
2
据我所知,FORTRAN缺乏有意义的指针算术,这使得它在系统编程方面毫无用处。 - Anycorn
@Jerry 是的。CP/M最初是用PL/M编写的,以在8080微处理器上运行。http://en.wikipedia.org/wiki/PL/M - Dr. belisarius
这是在开玩笑吗?为什么人们要点赞它?这个地方正在变成一个错误信息的污水坑。CP/M不可能用Fortran编写,30秒的谷歌搜索就可以证明这种说法是绝对的胡说八道。Amiga操作系统是在C语言广泛流行多年后才问世的。 - Dipstick
显示剩余4条评论

3
操作系统“希望”用汇编语言编写。如果你从头开始,一旦完成了中断例程,就可以继续下去,而不必转向高级语言接口。
此外,汇编语言喜欢演变。一旦你掌握了指定的指令集,添加多个目的的指令别名就很方便。接下来是伪指令,可以为几个机器指令起别名。然后,编写宏子程序的可扩展设施非常有用,以生成看起来像指令的任意代码段。 (与C宏不同,这通常允许流程控制和脚本式编程。)然后,有作用域规则以确保标识符仅在特定上下文中使用。
逐渐地,语言演变。C语言并非凭空产生。它之前有一两代语言(Algol,BCPL),它们是从高级汇编语言演变而来的。许多特定于平台的汇编语言实际上相当好。IBM仍然制作出优秀的汇编器。(当然,在此之前有不那么好的汇编器,而在此之前是打孔卡和切换开关。)

最近,GNU的as工具使汇编语言名声有点不好,因为它相对原始。但不要相信恐吓战术。


我认为你在描述编译器引导和开发。这并不一定意味着操作系统开发需要类似的“引导”。通常,新的操作系统开发始于在现有平台上运行的交叉编译器。此外,在许多情况下,这是开发操作系统的最终方式,因为为所述操作系统创建本地编译器毫无意义。 - Schedler
1
@Schedler:我试图传达的是操作系统不一定是用最新的语言编写的,汇编甚至可以更快捷。自举是尽快将机器带到最先进的功能状态。我所说的是最初的演变。 - Potatoswatter
曾经使用过几个出色的宏汇编器(包括一家曾经是我们公司产品系列的公司,当时在PDP-11下运行RT-11的产品对某些人来说意义重大),GNU as 感觉几乎不比直接在Motorola S-Records中编码更好,用于UV EPROM编程器。(抱歉,老顽固的本性又显露出来了。) - RBerteig
是的,GNU汇编器实际上更多地是作为C编译器的后端而不是人类使用的严肃汇编器而设计的。 - JeremyP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接