点击我的视频网校,学习编程课程,或者关注我的微信公众号“编程之路从0到1”,了解课程更新

1.0概述

本教程视频已同步到B站: 程序员的C——实用编程,不玩虚的!

概述

历史背景

ANSI C、ISO C和标准C是美国国家标准协会(ANSI,American National Standards Institute)和国际标准化组织(ISO,International Organization for Standardization)先后发布的C语言编程标准。在历史上,这些名称专门指该标准的原始版本和获得最佳支持的版本(称为C89或C90)。鼓励用C语言编写软件的开发人员遵守这些标准,因为这样做有助于编译器之间的可移植性。

C的第一个标准是由ANSI发布的。虽然这个文档后来被国际标准化组织(ISO)采用,ISO发布的后续修订版也被ANSI采用,但 "ANSI C "仍被用来指代该标准,虽然有些软件开发者使用ISO C这个术语,但其他软件开发人员则对"标准主体"保持中立,并使用标准 C来称呼。

C语言的几版标准

C89
1983年,美国国家标准协会成立了一个委员会X3J11,制定了C语言的标准规范,该标准于1989年完成,并被批准为ANSI X3.159-1989 “Programming Language C”。这个版本的语言通常被称为 “ANSI C”。后来有时也用 "C89 "这个标签来区别于C90,但使用的是相同的标签方法。

C90
与C89相同的标准被国际标准化组织批准为ISO/IEC 9899:1990,只是在格式上做了修改,有时被称为C90。因此,"C89 "和 "C90 "指的是基本相同的语言。

该标准已被ANSI/INCITSISO/IEC撤销。

C95
1995年,国际标准化组织公布了ANSI-C标准的扩展版,称为修正案1。它的全名最终是ISO/IEC 9899:1990/AMD1:1995或简称为"C95"。除了纠错之外,还对语言能力进行了进一步的修改,比如:

  • 改进了标准库中对多字节和宽字符的支持,引入了<wchar.h><wctype.h>以及多字节I/O。

  • 在语言中增加digraphs

  • 标准宏的规范,用于运算符的替代规范,例如对于&&and

  • 标准宏__STDC_VERSION__的规范

除修正案外,ISO还公布了两份C90的技术勘误:

ISO/IEC 9899:1990/Cor 1:1994 TCOR1于1994年发布。
ISO/IEC 9899:1990/Cor 2:1996,于1996年发布

C99

2000年3月,ANSI采用了ISO/IEC 9899:1999标准。这个标准通常被称为C99。在以前的标准基础上增加了一些值得注意的内容,包括:

  • 新的内置数据类型:long long_Bool_Complex_Imaginary
  • 一些新的核心语言功能,包括静态数组索引、指定的初始化器、复合字元、可变长度数组、灵活的数组成员、变量宏和限制关键字
  • 一些新的库头,包括 stdint.h, tgmath.h, fenv.h, complex.h
  • 提高了与一些C++特性的兼容性,包括内联函数、带//的单行注释、混合声明和代码,以及标识符中的通用字符名。
  • 删除了几个危险的C89语言特征,如隐式函数声明和隐式int

ISO为C99发布了三份技术更正:

  • ISO/IEC 9899:1999/Cor 1:2001(E)
  • ISO/IEC 9899:1999/Cor 2:2004(E)
  • ISO/IEC 9899:1999/Cor 3:2007(E),值得注意的是废止了标准库函数 gets,该标准已被ANSI/INCITS和ISO/IEC撤销,改用C11

C11

2011发布,"C11 "曾被称为C1X,这是非正式称呼。与上一次修订版相比,引入的显著特征包括改进的Unicode支持、使用新的_Generic关键字的type-generic表达式、跨平台的多线程API(threads.h)以及核心语言和库(stdatomic.h)中的原子类型支持。

ISO已经为C11发布了一份技术更正:

  • ISO/IEC 9899:2011/Cor 1:2012

C18

"C18 "是ISO/IEC 9899:2018的非正式名称。2018年6月发布,是C语言编程的最新标准。C18在没有引入新语言功能的情况下解决了C11中的缺陷,预计C18将被C2x所取代。

C2x是下一个(C18之后)主要C语言标准修订的非正式名称,预计要到2021年才能进行投票。

注意,GCC 9和 Clang 9.0 编译器支持使用-std=c2x 选项来支持这个标准。

K&R C

前面介绍了标准C,那么在1983年之前,C语言的生态是什么样子的呢,C语言又以什么作为一个准则呢?

1978年,Brian Kernighan和Dennis Ritchie出版了第一版《C编程语言》,这本书被C程序员称为K&R,多年来一直作为C语言的非正式规范,早期被奉为C语言圣经。它所描述的C语言版本通常被称为 “K&R C”。虽然该书的第二版涵盖了后来的ANSI C标准,但即使在1989年ANSI标准发布之后的许多年来,K&R C仍然被认为是 “最低共同点”,当C程序员需要最大限度的可移植性时,他们会将自己限制在这个标准内,因为许多老旧的编译器仍然在使用这个规范,而且精心编写的K&R C代码也可以是合法的标准C,可以使用__STDC__

#if defined(__STDC__) && __STDC__
 extern int getopt(int, char * const *, const char *);
#else
 extern int getopt();
#endif

POSIX

便携操作系统接口(POSIX)是IEEE计算机协会为保持操作系统之间的兼容性而指定的一系列标准。POSIX定义了应用程序接口(API),以及命令行shell和实用程序接口,以便软件与Unix和其他操作系统的变体兼容。

最初,"POSIX "这个名称是指1988年发布的IEEE Std 1003.1-1988。POSIX标准的家族被正式指定为IEEE 1003,国际标准名称为ISO/IEC 9945

这些标准产生于1985年左右开始的一个项目。Richard Stallman向IEEE建议使用POSIX这个名字,而不是以前的IEEE-IX。委员会认为这个名称更容易发音和记忆,因此采用了这个名称。

选择Unix作为标准系统接口的基础,部分原因是它 “不受制造商影响”。然而,Unix有几个主要的版本,因此需要开发一个"共母系统"。类似Unix操作系统的POSIX规范最初由核心编程接口的一个文档组成,但最终发展到19个独立的文档(POSIX.1、POSIX.2等)。标准化的用户命令行和脚本界面是基于UNIX System V shell的。许多用户级的程序、服务和实用程序(包括awk、echo、ed),以及所需的程序级服务(包括基本的I/O:文件、终端和网络)也被标准化。POSIX还定义了一个标准的线程库API,它被大多数现代操作系统所支持。2008年,POSIX的大部分内容被合并为一个标准(IEEE Std 1003.1-2008,也称为POSIX.1-2008)。

适用于微软Windows的POSIX

Cygwin为微软的Windows提供了一个基本上符合POSIX的开发和运行时环境。
MinGW是Cygwin的一个分支,它提供了一个不太符合POSIX的开发环境,并通过Msvcrt(微软旧的Visual C运行时库)支持兼容的C程序应用程序。

微软POSIX子系统,是一个可选的Windows子系统,包含在基于Windows NT的操作系统中,直到Windows 2000。POSIX-1在1990年修订版中的样子,没有线程和套接字。

Interix,原为Softway Systems公司的OpenNT,是微软POSIX子系统的升级和替代产品,于1999年被微软收购。它最初是作为一个独立的附加产品销售的,后来将其作为一个组件纳入到Windows Services for UNIX(SFU)中,最后将其作为一个组件纳入到Windows Server 2003 R2和以后的Windows OS版本中,名称为 “基于UNIX的应用程序子系统”(SUA);后来在2012年(Windows 8)被废弃,2013年(2012 R2,8.1)被放弃。它可以使某些微软Windows产品完全符合POSIX标准。

Windows Subsystem for Linux,又称WSL,是一个兼容层,用于使用Linux镜像(如Ubuntu、Debian或OpenSUSE等)在Windows 10上原生运行Linux二进制可执行文件,作为Windows Services for UNIX的升级和替代。它于2016年4月发布了测试版。第一个可用的发行版是Ubuntu。

Windows C Runtime Library和Windows Sockets API实现了常用的POSIX API函数,用于文件、时间、环境和套接字的访问,尽管支持在很大程度上仍然是不完整的,而且不能与POSIX兼容的实现完全互操作。

附录:操作系统家谱体系

现代操作系统,基本上都是从Unix系统派生或衍生,可谓是现代操作系统的源头

操作系统源头

完整的Unix相关操作系统家谱

家谱

  • SVR 4

SVR4(UNIX System V Release 4)是 AT&T 的 UNIX 系统实验室的一个商业产品。它基本上是一个操作系统的大杂烩,这个操作系统之所以重要,是因为它是 System III/V 分支各家商业化 UNIX 操作系统的“先祖”,包括 IBM 的 AIX、HP 的 HP-UX、SGI 的 IRIX、Sun(后被 Oracle 收购)的 Solaris 等等。

  • Solaris

Solaris 是由 Sun Microsystems(现为 Oracle)开发的 UNIX 系统版本,它基于 SVR4,并且在商业上获得了不俗的成绩。2005 年,Sun Microsystems 开源了 Solaris 操作系统的大部分源代码,作为 OpenSolaris 开放源代码操作系统的一部分。相对于 Linux,这个开源操作系统的进展比较一般。

  • BSD

BSD(Berkeley Software Distribution),是由加州大学伯克利分校的计算机系统研究组(CSRG)研究开发和分发的。4.2BSD 于 1983 年问世,其中就包括了网络编程套接口相关的设计和实现,4.3BSD 则于 1986 年发布。

  • Mac OS X

Mac 系统又被称为 Darwin,是一个 UNIX 分支衍生的操作系统。

  • Linux

全世界绝大部分数据中心操作系统都是跑在 Linux 上的,Android手机也是一个被“裁剪”过的 Linux 操作系统。Linux是一种类Unix操作系统,并非直接从其源码衍生。

现代操作三大派系

877648aec48b4185f64889b17a889bde

Windows 操作系统包含两个独立的内核(DOS 系和 NT),它仅从 Unix 借鉴了一些东西(例如文件树)

视频课程

了解视频课程,关注博主的视频网校

云课堂


关注公众号:编程之路从0到1

编程之路从0到1

评论

公众号:编程之路从0到1

公众号

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×