常见的 C89 标准之前编译器/标准库惯用法(1985-1988年)。

7
我正在为虚构的DCPU-16 CPU编写C编译器(该CPU将用于0x10C游戏)。在这个游戏世界中,任何为该系统编写的原始软件都是在1988年之前(或期间)开发的:因此,我试图像在1985-1988年之间编码一样编写我的编译器。我已经获得了C89标准的副本,但想知道先前的常见编译器与标准以及该时期的常见编码风格有何不同。
到目前为止,这就是我所假设的:
  • 我需要使用预处理器支持来定义旧式和新式函数定义/原型。
  • 编码风格通常使用"something_with_an_underscore"来表示类型、函数和变量(这是真的吗?匈牙利命名法在这段时间内有多流行?驼峰命名法呢?)
其他我想知道的事情包括:
  • 常见的c编译器/stdlib与后来的C89标准有何不同?
  • 哪些常见的代码模式很流行?
  • 当时常见的变量命名方式是什么(i、n、foo、bar等)?
  • 您有该时期的示例代码吗?
  • 等等...

2
原始的C参考手册应该会有所帮助。它还包含一些捕捉当时风格的示例代码。 - John Bode
我听说在函数中将所有本地变量声明放在开头是很常见的,有时也是必要的,尽管C89允许它们在任何块的开头。 - aschepler
2
@JimBalter:上面链接的“原始C参考手册”不允许在复合语句中声明,只能在函数体的开头声明。 - aschepler
@JimBalter 但是 (C99,6.8.2p2) "复合语句是一个块。" - ouah
你感兴趣的时期的编译器支持块级局部变量定义。至于那个时期人们是否编写了这样的代码...这取决于人们。这通常适用于代码模式和变量名称。大多数C程序员继续按照他们一直以来的方式编写代码,这是他们学习或开始时看到的代码类型。 - Jim Balter
显示剩余2条评论
5个回答

2
当没有定义的标准时,人们只关心让它“工作”。这适用于几乎任何东西,不仅仅是C语言。因此,很难区分所有预标准编码风格/命名约定等与标准化的区别。我认为大多数人会遵循K&R书籍(第1和第2版)中的内容。
例如...
您可以查看Dennis Ritchie的网站,他在其中提供了一些示例:非常早期的C编译器和语言。 您可以通过该网站搜索更多相关信息。但我认为您不会得到所有问题的答案。

1
K&R的第二版基于1989年的ANSI C标准。K&R1于1978年出版。更早的C参考资料可在网络上获得。 - Keith Thompson
1
即将发布的 ANSI 标准在 1988 年就已经接近完成。哪些代码示例违反了 C89 标准? - Keith Thompson
例如,所有的main()都只有 main() {..} ,并且main()没有返回任何内容。 - P.P
1
@KingsIndian 在 C89 中是有效的。 - ouah
@0x0D0A:1993年第二届HOPL会议包括一篇关于C语言历史的论文。我不知道它是否包含DMR网页上没有的信息。 - Keith Thompson
显示剩余7条评论

1

你可以做一些奇怪且不好看的事情,这可能会成为游戏中有趣的“谜题”,即非常早期的预处理器实际上会扫描并替换字符串文字内容中定义的宏!

因此,例如:

#define foo bar
char *s = "That would be a foolish thing to do!";

会被预处理为

char *s = "That would be a barlish thing to do!";

1
1983年,负责标准化C语言的ANSI X3J11委员会成立,并于1985年4月发布了第一份草案。根据Eric S. Raymond的说法,“[C语言]自从X3J11委员会的工作文件副本在1985-1986年间向编译器实现者传达了委员会的意图以来,基本上已经保持稳定”。[1]
阅读'85-'86年期间的编译器手册,如Lattice C [2]或Microsoft C 4.0 [3],可以看出这些编译器已经开始支持大部分ANSI C89。最明显的缺陷是缺乏const和volatile支持(尽管Microsoft C已将它们添加到保留关键字列表中),以及继续使用“K&R”风格的函数定义。
因此,即使标准本身尚未发布,到1988年,在野外看到ANSI C89代码也不是不合理的,因为编译器编写者已经将标准的部分内容纳入他们的编译器中多年。

[1] http://www.catb.org/~esr/writings/taoup/html/c_evolution.html(链接1)

[2] https://archive.org/details/Lattice_C_AmigaDOS_Compiler_Version_3_Programmers_Reference_Guide_1986-09-12_Lattice_Inc(链接2)。

[3] http://www.os2museum.com/wp/dos/dos-library/(链接3)


0

我有一份C89标准的副本,但想知道在此之前常见编译器与时期常见的编码风格与标准有何不同。

C语言的历史主要是由编译器供应商所创造的。在标准化ANSI C时,C89委员会努力不破坏现有的代码。我认为,一个C89编译器很可能可以编译先于C89的代码。

来自C89标准的理由:

"在指定标准语言时,委员会使用了几个原则,其中最重要的是:[...]存在大量具有相当商业价值的C代码。已经尽一切努力确保这些代码的大部分将被任何符合标准的实现所接受。委员会不希望强迫大多数程序员修改他们的C程序,只是为了让它们被符合标准的翻译器所接受。"


我理解这个 - 但我不是在尝试编写能够在C89编译器上编译的代码 - 我正在尝试编写一个_stylised_的pre C89编译器(用_stylised_ pre C89代码编写)来模仿那个时代(就像试图模仿1980年代大众小说作者的风格一样)。 - 0x0D0A
1
通过阅读预C89编译器手册,例如Lattice C 1985手册http://www.gametronik.com/site/rubriques/amiga/FAQs/Lattice%20C%20Compiler%20Manual%20Rev%201%20(1985-08-28).pdf,您可以获得有趣的信息。 - ouah
Lattice真的非常不错(并且符合标准),相比于(后来的)污染标准的Borland和MS的东西。Lattice是第一个跨平台“便携式”编译器,因此被SAS收购导致它在1994年左右突然消失。 - wildplasser
我对 Borland C V2 1990 差不多有点熟悉(因为我在 1995 年使用它来学习 C 语言)。有没有人有一本 Borland C V1 手册(或者更好的是带有标准库的二进制文件)来自 1980 年代? - 0x0D0A

0

这个背景很有趣,但仍然缺少我真正想要一些第一手知识的15年演变(特别是最近5年)。 - 0x0D0A
你的问题基于错误的假设,即代码模式和变量名称在不同的时间段内是共通的。 - Jim Balter

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