C语言简介

图片描述

图片来源于网络

1. C语言的起源

C 语言是一种高级语言,最初由 Dennis M. Ritchie [1] 为了开发一个操作系统而设计,最早在 1972 年在 DEC PDP-11 计算机上被首次实现。

2. 一次不务正业的发明

C 语言的发明和很多伟大的发明一样,都是一个人或者几个人不务正业闲着没事偶然间发明的。据说当时有一个年轻人为了能够在一台上机费更便宜的计算机上愉快的进行两人对战游戏,但不幸的是,这台机器上原有的操作系统只能支持一个人在线游戏,于是这位热爱游戏的年轻人不得不重新为这台机器编写一个新的操作系统,可以支持多用户,这样大家就可以一起同时在线玩这个游戏了。而在编写这个操作系统的过程中,他们对 B 语言进行了升级,于是 C 语言诞生了。

这个发明 C 语言的年轻人叫丹尼斯•里奇 Dennis M. Ritchie [1]。C 语言派生自 BCPL 语言,并且 C 语言对 BCPL 语言有了长足的扩展。因为 BCPL 简称为 B 语言,因此 C 语言就采用了字母表中的下一个字母来作为语言的名称。讲真这名字起得够随意的,不过话说回来了 B 语言这名字好像就是来自 A 语言的,有兴趣的同学可以去了解一下这三门语言之间的渊源,在这里我们就不多赘述了。

下面是一个 C 语言发展历史的列表:

语言 年份 开发者
Algol 1960 International Group
BCPL 1967 Martin Richard
B 1970 Ken Thompson
Traditional C 1972 Dennis Ritchie
K & R C 1978 Kernighan & Dennis Ritchie
ANSI C 1989 ANSI Committee
ANSI/ISO C 1990 ISO Committee
C99 1999 Standardization Committee
表1: C 语言发展历程 [3]

图片描述

图1: C 语言发明者 Dennis Ritchie [2]

3. C 语言的应用

了解了发明过程就大致知道了 C 语言的应用场景。基本的应用场景是操作系统的编写。

当然现在 C 语言的应用已经大大超出了这个范围。因为 C 语言与生俱来的特性是很容易与底层硬件打交道,所以目前 C 语言大量应用在需要直接硬件交互的场景。比如最近很多的物联网中的嵌入式设备,底层驱动,高性能计算,游戏后端服务,图形处理等等。

但是由于 C 语言不支持原生的面向对象的开发模式,因此有人说过,对于 C 语言,最大的工程就是开发一个操作系统。

如果你想开发更为复杂的系统,请使用别的语言。但是这不代表 C 语言已经过时了。恰恰相反, C 语言正在我们的生活中发挥着比以前更为重要的角色,你的手机,你的身边的智能终端,甚至你家的扫地机器人,都无时不刻都有 C 语言的身影。
图片描述

图2: 用 C 语言实现的 MP3 播放器 [4]

图片描述

图2: 用 C 语言实现的 MP3 播放器内部 [4]

4. C 语言的特点

C 语言有如下的特点:

  • 代码简洁不繁琐;
  • 具有良好的可移植性,代码与机器底层独立(相对于汇编语言而言);
  • 属于中层编程语言(底层的为汇编语言等,高层的为 Java 语言等);
  • 结构化语言;
  • 丰富的程序库可以使用;
  • 可以直接管理内存;
  • 运行速度快;
  • 提供了指针操作;
  • 可以使用递归;
  • 具有良好的扩展性。

5. C 语言的几个主要版本

从 C 语言发明到现在经历了如下的标准:

版本 标准 发布日期
K&R n/a 1978-02-22
C89 ANSI X3.159-1989 1989-12-14
C90 ISO/IEC 9899:1990 1990-12-20
C95 ISO/IEC 9899/AMD1:1995 1995-03-30
C99 ISO/IEC 9899:1999 1999-12-16
C11 ISO/IEC 9899:2011 2011-12-15

目前 C 语言执行的标准是 ISO/IEC 9899:2011,我们在课程中也会遵循此标准来完成代码。

6. 我们为什么要学习 C 语言

如果你想要从事下面的工作,那么 C 语言将是你非常好的一个选择:

  1. 从事需要直接操作操作硬件的编程的嵌入式设备开发,不需要操作系统的支持。比如我们常见的冰箱,洗衣机等等的控制;
  2. 嵌入式操作系统和实时操作环境下的开发;
  3. 基于 Linux 操作系统下的一些应用程序。主要是中间层面应用的开发,直接可以与底层硬件交互,而本身又不直接与最终用户进行交互;
  4. 音频和视频的解码器和编码器等;
  5. 协议栈的开发。

7. 学习基础

在这个教程中,大家最好能够对于 Linux 操作系统有使用经验。有简单的 Shell 命令使用经验。我们遇到的所有的操作基本都是通过命令行来进行的。虽然我也很喜欢图形界面操作,这也是趋势,但是 C 语言目前主要的应用场景都是在 Linux 下,所以大家最好学习一下相关的知识。