C 和 C 的历史。第一部分:C语言的产生和标准化。带类的 C 变为 C
C 和 C 是编写大量代码的标志性语言。他们经历了什么道路才成为一体?本文介绍了 C 的出现及其正式标准化的开始。此外,您还将了解 C with Classes 及其最终转变为 C 。
1969 — 1973 C诞生于世
1969。阿波罗 11 号访问月球。 AT&T 贝尔实验室开发了一种我们今天熟知的 C 语言。此时,Unix 操作系统正处于早期开发阶段。
事实上,C 语言继承了 B 语言的主要功能。以及它名字的由来。至于Unix,最初是用汇编语言实现的,甚至没有高级语言的编译器。该项目的开发归因于C语言创建的原因之一。
1971 年,C 语言的编译器和一些实用程序被包含在 Unix 的第二个版本中。 1973 年,Unix 内核主要是用 C 编写的。
1978. 这本书成为第一个规范
Dennis Ritchie 和 Brian Kernighan 于 1978 年 2 月 22 日出版了第一版《C 编程语言》。这本书是第一本广泛使用的 C 语言材料。
图N1 - 《C 编程语言》第一版的封面
从发布到第一个官方语言认证,它已经成为 C 开发的标准。该“标准”被称为 K&R——以作者姓氏的第一个字母命名。
本书介绍了“Hello World”程序作为最小工作程序的示例。 1978 年之后,几乎所有有关编程语言的书籍都离不开这个代码示例。如今,将“Hello World”作为您的第一个程序显示已成为一项既定的传统。
#include <stdio.h> main() { printf("Hello, World\n"); }
K&R 展示了多种语言特性。例如,结构体 - 一组多个变量分组在一个名称下以便于引用,以及 long int 和 unsigned int 数据类型。
带赋值的加法/减法运算符在 K&R C 中也发生了变化。以前,要将值加一,必须编写 a = 1,但此类运算符会让 C 编译器感到困惑。此外,从人类的角度来看,a = 1(加一)和a = 1(赋值)之间的差异看起来相当脆弱。正是在K&R C,这些算子变成了我们熟悉的算子——a = 1.
书中的代码示例采用统一的风格设计,也以创建者姓氏的首字母命名。 K&R 风格以使用八个空格作为主要缩进而闻名(尽管更常用的是四个空格)。它也被称为“内核风格”,因为 Unix 内核就是用这种风格编写的。
#include <stdio.h> main() { printf("Hello, World\n"); }
1979. C 与类
1979 年 5 月,贝尔实验室员工 Bjarne Stroustrup 开始开发一个系统,该系统将成为第一个 Unix 集群。换句话说,他开始创建一个分布式计算系统,连接到由多台计算机组成的公共网络。
问题是缺乏合适的工具包。在现有的编程语言中,有两种选择可以帮助解决这个问题,但两者都有细微差别。 BCPL 语言速度很快,但不适合大型项目,因为它非常接近低级语言。另一方面,面向对象的编程语言 Simula 适合这项任务,但速度相当慢。因此 Stroustrup 开始实现他自己的基于 C 的语言。
早在 1979 年 10 月,向 C 添加类的 CPRE 预处理器就准备好了。这种语言被称为 C with Classes。人们可以编写程序代码并将其传递给预处理器。然而,它仍然被认为是 C 的扩展。
除了类之外,带有类的 C 的第一个版本还包括:
- 派生类,但还没有虚函数;
- 访问控制;
- 构造函数和析构函数;
- 朋友班;
- 函数参数类型的控制和转换。
1983.ANSI C
该语言越来越受欢迎:
- C 开始取代 Basic 成为微型计算机编程的主导语言;
- 新的编译器出现了。更重要的是,它们是由没有直接参与语言开发的人编写的。
但即使有这样的人气,C也只有K&R的不言而喻的水准。编译器的开发人员对该语言引入了许多非标准的更改。这就是代码可移植性问题开始升温的时候。鉴于这一系列问题,第一个 C 标准开始出现。
1983年,美国国家标准协会(ANSI)成立了一个委员会来起草该规范。标准化进程直到 1989 年才结束,当时该语言的第一个标准被批准为“ANSI X3.159-1989:编程语言 C”。同年,《C 编程语言》一书的第二版出版,描述了标准中出现的语言。一年的时间里,该标准经过微小修改就获得了国际标准化组织(ISO)的批准。
图N2 - 《C 编程语言》第二版的封面
除了自 K&R 以来语言发生的一些变化之外,该标准还包括全新的功能,例如函数原型和更复杂的预处理器。该标准还包括对标准库组成的描述。此外,一些之前没有定义的手段被给出了更精确的定义。
1983.C 与课程C
1982 年,Bjarne Stroustrup 开始致力于改变 C with Classes 的状态,其创建者称之为“中等成功”。从那时起,开发编译器花了一年的时间。 Cfront 于 1983 年问世。
它的主要功能是将带有类的 C 语言转换为 C 代码。之后,转换后的代码被传递给C编译器。此功能使更多人能够使用该编译器,以及在现有的 Unix 基础设施上使用它。
随着语言的发展,它的名称发生了多次变化。它最初被称为 C84,因为社区简称它为 C。然而,这个名称也具有误导性,因为它更像是一个新的 C 标准,而不是该语言的子集。而这实际上并没有帮助解决以前名字的问题。最终该语言被称为 C ,即 C 和增量运算符。
从带有类的 C 迁移到 C 时,该语言中出现了其他新功能:
- 虚函数;
- 函数名和运算符重载;
- 参考文献;
- 常量;
- 改进的类型检查;
- 用户控制的自由存储内存控制。
至今仍在使用的注释风格在语言发展的这个阶段扎根。该样式也用于其他语言。
这就是C在没有正式认证之前的生活。 Stroustrup 相当迅速地响应了程序员社区的请求。他正在出版代表该语言标准描述的作品。所以,该语言得以维持主要归功于其创建者的努力。
1985 年。“C 编程语言”。
1985 年 2 月,C 的第一个可发行版本发布。同年 10 月,语言创始人 Bjarne Stroustrup 发布了第一版《C 编程语言》一书。
图N3 - 《C 编程语言》第一版的封面
它就像 Kernighan 和 Ritchey 的书《C 编程语言》一样成为 C 语言的第一个默认标准。直到第一个官方标准。
在书中,Stroustrup 从 C 角度涵盖了语言特性和设计问题,并用大量代码示例为每一点增添了趣味。
此后,这本书又重印了三次,每次都有语言更新。在撰写本文时,最新的第 4 版包含 C 11 标准。
1989.C 2.0
1989年7月,Cfront 2.0编译器发布。它与之前的版本相比有了很大的修改,也给C语言带来了新意。
此时,模板已经成为热门话题。没有人怀疑它们会得到实施,因为这是一个现实的目标。至于另一个潜在的突出特性——多重继承——对编程社区的创建者来说是一个真正的挑战。许多人说在 C 中实现多重继承是不可能的。例如,在 Simula 中,由于垃圾收集器不可避免的复杂性,类似的建议被拒绝。然而,多重继承是非常需要的,因为它会大大简化库的开发,如果没有多重继承,库的代码会变得相当麻烦。
所以,Cfront 2.0 终究还是加入了多重继承。这种语言的添加引发了争议。例如,有些人认为,面向对象编程的缩影 Smalltalk 语言不具有多重继承。这就是为什么C当然不应该采用它。语言的创造者认为这种反应是由于过于重视多重继承而造成的。
上面的C版本还介绍了:
- 指向成员的指针,允许创建指向非静态字段和函数的指针;
- 静态和const成员函数;
- 访问修饰符受保护;
- 类型安全链接;
- 抽象类;
- 新建和删除特定于类;
1990. 博兰C
1990 年,Borland 发布了 Borland C 集成开发环境,用于开发 C 和 C 程序(真是一个转折,哈?)。它最初是为了在 DOS 下开发,但后来也引入了 Windows 支持。
图 N4 - Borland C 的屏幕截图
从历史上看,Borland C 是 Turbo C 的后代,但融合了 C 的特点——支持面向对象编程。
每个版本的环境都有自己的编译器支持自己的标准。随着时间的推移,Borland C 获得了许多用于快速应用程序开发的专用库。
Borland C IDE 的最后一个版本于 1997 年发布,之后被 Borland C Builder 系列所取代。 Borland C 的终结是在 2000 年,随着带有编译器的 Borland C 5.5 的发布。
Borland C 是一个非常舒适的 DOS 编辑器。甚至还有某种语法着色。
PVS-Studio分析器C和C核心架构师Yuri Minaev
Borland 四年后,微软发布了 Visual C 集成开发环境。
1990. C 语言的模板和异常处理机制
1986 年,Bjarne Stroustrup 写了一篇文章《什么是面向对象编程?》其中他指出了 C 的三个缺陷:
- 缺乏对参数化类型的支持;
- 缺乏标准的异常处理机制;
- 缺乏多重继承。
多重继承于 1989 年随 C 2.0 引入,其余缺陷于 1990 年通过新的语言功能得到修复。 Stroustrup 在《Annotated C Reference Manual》一书中对它们进行了描述。
模板和异常处理很快就相继出现。模板于 7 月在西雅图获得批准,异常处理机制于 11 月在帕洛阿尔托获得批准。它们的发布之所以接近,是因为这两项创新都解决了类似的问题。根据语言创建者本人的说法,模板允许您通过扩展静态类型系统的功能来减少程序执行期间的错误数量。而异常允许您处理剩余的错误。
参数化类型早在 C 的第一版中就被考虑过。然而,由于缺乏时间对设计和实施问题进行充分研究,它们不得不推迟。出于同样的原因,例外情况也被推迟。这并不是毫无意义的。他们的设计从1984年持续到1989年。
《带注释的 C 参考手册》还介绍了命名空间以及运行时识别类型的能力。
通用编程从那时开始获得动力。使用模板的 C 并不是先驱。在创建模板时,创建者从 ML、CLU 和 Ada 编程语言中汲取灵感。
但是,可以肯定地说,C 语言正在推广这种范式。在许多情况下,模板使得无需宏即可编写代码成为可能,从而减少了搬起石头砸自己脚的机会。美中不足的是,只有 C 20 才出现了简化泛型编程工作的完整操作功能。但即便如此,当程序员了解到模板可以在编译阶段启用计算时,他们并没有停下来......
另一方面,C 中的异常并不是那么明确。不幸的是,与早期的方法相比,他们并没有解决所有的错误处理问题。使用异常时,控制流变得非常重要。有很多方法会搬起石头砸自己的脚,比如私有继承异常、按值捕获异常、或者以错误的顺序排列 catch 块等。因此,一些编码标准禁止使用它们,例如 Google C 代码风格。
Philipp Khandelyants,PVS-Studio C 和 C 开发团队的团队负责人
《带注释的 C 参考手册》在某种程度上已成为官方 C 标准化的先驱。它描述了所有很快将成为该语言标准的创新。
在下一个系列中...
在这篇文章中,我们介绍了从 1969 年到 1990 年 C 和 C 的历史事件。在下一篇文章中,我们将深入研究从 1991 年到现在的 C 历史:
- Bjarne Stroustrup 关于 C 语言如何创建的书;
- C 98是第一个官方标准;
- C99—C 继续前进;
- 技术报告1——纸上的新C特性;
- Viva64 版本,稍后 — PVS-Studio;
- C 记录已取得的成就(C99、C11),C 获得动力(C 11、C 17);
- C 20 和 C 23。
以上是C 和 C 的历史。第一部分:C语言的产生和标准化。带类的 C 变为 C的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

C语言数据结构:树和图的数据表示与操作树是一个层次结构的数据结构由节点组成,每个节点包含一个数据元素和指向其子节点的指针二叉树是一种特殊类型的树,其中每个节点最多有两个子节点数据表示structTreeNode{intdata;structTreeNode*left;structTreeNode*right;};操作创建树遍历树(先序、中序、后序)搜索树插入节点删除节点图是一个集合的数据结构,其中的元素是顶点,它们通过边连接在一起边可以是带权或无权的数据表示邻

文件操作难题的真相:文件打开失败:权限不足、路径错误、文件被占用。数据写入失败:缓冲区已满、文件不可写、磁盘空间不足。其他常见问题:文件遍历缓慢、文本文件编码不正确、二进制文件读取错误。

C语言函数是代码模块化和程序搭建的基础。它们由声明(函数头)和定义(函数体)组成。C语言默认使用值传递参数,但也可使用地址传递修改外部变量。函数可以有返回值或无返回值,返回值类型必须与声明一致。函数命名应清晰易懂,使用驼峰或下划线命名法。遵循单一职责原则,保持函数简洁性,以提高可维护性和可读性。

C语言函数名定义包括:返回值类型、函数名、参数列表和函数体。函数名应清晰、简洁、统一风格,避免与关键字冲突。函数名具有作用域,可在声明后使用。函数指针允许将函数作为参数传递或赋值。常见错误包括命名冲突、参数类型不匹配和未声明的函数。性能优化重点在函数设计和实现上,而清晰、易读的代码至关重要。

C语言函数是可重复利用的代码块,它接收输入,执行操作,返回结果,可将代码模块化提高可复用性,降低复杂度。函数内部机制包含参数传递、函数执行、返回值,整个过程涉及优化如函数内联。编写好的函数遵循单一职责原则、参数数量少、命名规范、错误处理。指针与函数结合能实现更强大的功能,如修改外部变量值。函数指针将函数作为参数传递或存储地址,用于实现动态调用函数。理解函数特性和技巧是编写高效、可维护、易理解的C语言程序的关键。

C35 的计算本质上是组合数学,代表从 5 个元素中选择 3 个的组合数,其计算公式为 C53 = 5! / (3! * 2!),可通过循环避免直接计算阶乘以提高效率和避免溢出。另外,理解组合的本质和掌握高效的计算方法对于解决概率统计、密码学、算法设计等领域的许多问题至关重要。

C#和C 的历史与演变各有特色,未来前景也不同。1.C 由BjarneStroustrup在1983年发明,旨在将面向对象编程引入C语言,其演变历程包括多次标准化,如C 11引入auto关键字和lambda表达式,C 20引入概念和协程,未来将专注于性能和系统级编程。2.C#由微软在2000年发布,结合C 和Java的优点,其演变注重简洁性和生产力,如C#2.0引入泛型,C#5.0引入异步编程,未来将专注于开发者的生产力和云计算。

算法是解决问题的指令集,其执行速度和内存占用各不相同。编程中,许多算法都基于数据搜索和排序。本文将介绍几种数据检索和排序算法。线性搜索假设有一个数组[20,500,10,5,100,1,50],需要查找数字50。线性搜索算法会逐个检查数组中的每个元素,直到找到目标值或遍历完整个数组。算法流程图如下:线性搜索的伪代码如下:检查每个元素:如果找到目标值:返回true返回falseC语言实现:#include#includeintmain(void){i
