C89之前的通用编译器/stdlib习惯用法(1985-1988)

C89之前的通用编译器/stdlib习惯用法(1985-1988),c,history,C,History,我正在为虚构的DCPU-16 CPU(将用于0x10C游戏)编写一个C编译器。在这个游戏世界中,任何为系统编写的原始软件都是在1988年之前(或期间)开发的:所以我尝试编写编译器,就像它是在1985-1988年间编写的一样。我有一份C89标准的副本,但我想知道在此之前的通用编译器与当时的标准和通用编码风格有何不同 到目前为止,这是我的假设: 我需要使用预处理器支持来定义新旧样式的函数定义/原型 编码风格通常对类型、函数和变量使用“带有下划线的某物”(这是真的吗?这一时期匈牙利的prevelan

我正在为虚构的DCPU-16 CPU(将用于0x10C游戏)编写一个C编译器。在这个游戏世界中,任何为系统编写的原始软件都是在1988年之前(或期间)开发的:所以我尝试编写编译器,就像它是在1985-1988年间编写的一样。我有一份C89标准的副本,但我想知道在此之前的通用编译器与当时的标准和通用编码风格有何不同

到目前为止,这是我的假设:

  • 我需要使用预处理器支持来定义新旧样式的函数定义/原型
  • 编码风格通常对类型、函数和变量使用“带有下划线的某物”(这是真的吗?这一时期匈牙利的prevelant符号有多大?camel的情况如何?)
其他我想知道的事情:

  • 常见的c编译器/STDLIB与后来的C89标准有何不同
  • 流行什么样的通用代码模式
  • 当时常见的变量是如何命名的(i,n,foo,bar?)
  • 你有没有当时的示例代码
  • 等等
我有一份C89标准的副本,但我想知道在此之前的常见编译器与当时的标准和常见编码风格有何不同

C的历史主要是由编译器供应商创造的。当标准化ANSI C时,C89委员会努力不破坏现有代码。我认为C89之前的代码很可能使用C89编译器编译

根据C89原理:

“在规定标准语文时,委员会采用了若干原则,其中最重要的是:[……]大量的C代码具有相当大的商业价值。我们已尽一切努力确保该代码的大部分能够被符合标准的任何实现所接受。委员会不想强迫大多数程序员修改他们的C程序,只是为了让符合标准的翻译员接受。”


当没有明确的标准时,人们只关心让它“工作”。它适用于任何东西,而不仅仅是C语言。因此,很难区分所有预标准编码样式/命名约定等与标准编码样式/命名约定等之间的区别。我想大多数人都会遵循K&R书籍中的内容(第一和第二)

对于样本

你可以看看丹尼斯·里奇的网站,他在那里给出了一些例子:。 您可以通过该网站搜索更多相关信息。但我不认为你会得到所有问题的答案。

特别是
“从1972-73年复活了两个原始C编译器,包括源代码。”

你可以做一件奇怪而丑陋的事情,这可能会在游戏中造成一个整洁的“谜题”,那就是早期的预处理器实际上会扫描并替换字符串文本内容中定义的宏

比如说

#define foo bar
char *s = "That would be a foolish thing to do!";
将被预处理为

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

负责C语言标准化的ANSI X3J11委员会成立于1983年,并于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]

[2]


[3]

这应该有帮助。它还包含一些捕获当时风格的示例代码。我听说将所有局部变量声明放在函数的开头是常见的和/或有时是必要的,尽管C89允许它们放在任何块的开头。这不是“原始C参考手册”吗从20世纪70年代开始(距离C89至少还有10年的时间),我对两者之间的混乱历史感兴趣。@JimBalter:上面链接的“原始C参考手册”不允许在复合语句中声明,只允许在函数体的开头声明。@JimBalter但是(C99,6.8.2p2)“复合语句是块。”我明白了,但我不是在写C89编译器上编译的代码,我是在写一个风格化的前C89编译器(用风格化的前C89代码编写),它模仿了这个时期(计算相当于试图模仿一个80年代的低俗作家的风格)。你可以通过阅读前C89编译器手册获得有趣的信息,例如Lattice C 1985手册:与后来的标准Borland和MS相比,Lattice确实非常体面(而且标准服从)。Lattice是第一个跨平台的“可移植”编译器,因此它是由SAS获得的,导致它在1994年左右突然死亡。我对Borland C V2 1990(ish)有点熟悉(因为我在1995年用它学习C)。有没有人拥有20世纪80年代的Borland C V1手册(或者更好的是带有标准库的二进制文件)?K&R的第二版基于1989年的ANSI C标准。K&R1出版于1978年。早期的C参考文献可以在网络上找到。我的参考文献(K&R2)说是1988年,它的代码样本没有遵循C89标准:)即将发布的ANSI标准几乎在1988年完成。哪些代码示例违反C89标准?例如,所有main()都只有
main(){..}
,而main()没有