7

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

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

  • 我需要使用预处理器支持来定义新旧样式的函数定义/原型。
  • 编码风格通常使用“something_with_an_underscore”来表示类型、函数和变量(这是真的吗?在那个时期匈牙利符号有多流行?骆驼格呢?)

我想知道的其他事情:

  • 常见的 c 编译器/标准库与后来的 C89 标准有何不同?
  • 流行什么常见的代码模式?
  • 当时的公共变量是如何命名的(i、n、foo、bar?)
  • 你有当时的示例代码吗?
  • ETC...
4

5 回答 5

2

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

对于样品...

您可以查看 Dennis Ritchie 的网站,他提供了一些示例:非常早期的 C 编译器和语言。您可以通过该网站搜索更多相关信息。但我认为你不会得到所有问题的答案。

于 2013-01-30T19:30:07.613 回答
1

您可以做的一件怪异丑陋的事情可能会在游戏中形成一个巧妙的“谜题”,即非常早期的预处理器实际上会扫描并替换字符串文字内容中定义的宏!

所以,例如

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

将被预处理为

char *s = "That would be a barlish thing to do!";
于 2014-08-12T22:02:29.627 回答
1

负责标准化 C 语言的 ANSI X3J11 委员会成立于 1983 年,并于 1985 年 4 月发布了初稿。根据 Eric S. Raymond 的说法,“自从 X3J11 委员会关于拟议标准草案的工作文件的副本向 1985-1986 年的编译器实施者表明委员会的意图以来,[C 语言] 基本上是稳定的”。[1]

研究 '85-'86 时间范围内的编译器手册,例如 Lattice C [2] 或 Microsoft C 4.0 [3],表明这些编译器已经开始支持大部分 ANSI C89。最明显的遗漏是缺乏constvolatile支持(尽管 Microsoft C 已经将这些添加到保留关键字列表中)以及继续使用“K&R”风格的函数定义。

所以到 1988 年,看到 ANSI C89 代码在野外出现并不是不合理的,即使标准本身还没有发布——仅仅是因为编译器编写者已经将部分标准合并到他们的编译器中好几年了.

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

[2] https://archive.org/details/Lattice_C_AmigaDOS_Compiler_Version_3_Programmers_Reference_Guide_1986-09-12_Lattice_Inc

[3] http://www.os2museum.com/wp/dos/dos-library/

于 2019-05-27T11:41:35.680 回答
0

http://cm.bell-labs.com/who/dmr/

尤其是“1972-73 年间两个原始 C 编译器的复活,包括源代码。”

于 2013-01-30T20:46:40.720 回答
0

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

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

来自 C89 的基本原理:

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

于 2013-01-30T19:25:41.767 回答