C
1.1、C简介

C语言的历史,必须从ALGOL——国际代数语言讲起。

ALGOL是计算机发展史上首批产生的高级语言,当时还是晶体管计算机流行的时代, 由于ALGOL语句和普通语言表达式接近,更适于数值计算,所以ALGOL多用于科学计算机。

ALGOL这个名称是算法语言(ALGOrithmic Language)的简称, 这种语言不是计算机制造公司为某种特定机器设计的, 而是纯粹面向描述计算过程的,也就是所谓面向算法描述的。

ALGOL是第一个清晰定义的语言,其语法是用严格公式化的方法说明的。

ALGOL语言并没有被广泛的使用,但它是许多现代程序语言的概念基础。

1958年,ACM小组和以当时联邦德国的应用数学和力学协会GAMM在苏黎世把他们关于算法表示法的建议综合为一, 形成了Algol 58,先被命名为IAL(国际代数语言,International Algebraic Language),后来改称Algol 58

1960年1月,图灵奖获得者艾伦.佩利(Alan J.Perlis)在巴黎举行的有全世界一流软件专家参加的讨论会上, 发表了"算法语言Algol 60报告",确定了程序设计语言Algol 60。1962年,艾伦.佩利又对Algol 60进行了修正。

Algol 60引进了许多新的概念如:局部性概念、动态、递归、巴克斯瑙尔范式BNF(Backus-Naur Form)等等。

Algol 60是程序设计语言发展史上的一个里程碑,它标志着程序设计语言成为一门独立的科学学科, 并为后来软件自动化及软件可靠性的发展奠定了基础。

1963年,英国剑桥大学推出了CPLCombined Programming Language)语言。CPL语言在Algol 60的基础上接近硬件一些,但规模比较大,难以实现。

1967年,英国剑桥大学的Matin RichardsCPL语言做了简化, 推出了BCPLBase Combined Programming Language)语言。

1969年,美国贝尔实验室的Ken ThompsonBCPL语言为基础,又作了进一步的简化, 设计出了很简单的而且很接近硬件的B语言(取BCPL的第一个字母),并用B语言写出了第一个UNIX操作系统。 但B语言过于简单,功能有限。

1971年,美国贝尔实验室的D.M.RitchieB语言的基础上开发了NEW B语言,也就是我们现在说的C语言。 最初,C语言的主要客户是编译器设计者,这也就是为什么“数组是从0开始而不是从1开始的原因”(其实还有许多为编译器设计者设计的特性)。

1973年,Ken ThompsonD.M.RitchieUNIXC语言重写,UNIX VersionV诞生,从此UNIX就和C语言成了孪生兄弟。

1.2、C的标准

随着C语言越来越受欢迎。 1978年,Brian W.KernighanD.M.RitchieSteve Johnson编写的PCC这个C语言编译器 (后来这个编译器被广泛移植)为基础,编著了《The C Programming Language》(简称TCPL), 人们把这个C语言版本称为K&R C

20世纪80年代,C语言广泛流行,许多人为其写变种, 各种C语言版本涌出。 因为C语言没有一个统一的标准,导致了它的代码无法在各种编译器上实现,C语言受到了变种松散的威胁,因此,C语言必须进行标准化。

version别名编号
C89ANSI CANS X3.159-1989
C90ISO CISO/IEC 9899:1990
C99ISO CISO/IEC 9899:1999
C11ISO CISO/IEC 9899:2011
C18ISO CISO/IEC 9899:2018

ANSI CISO C都是定义的最基本的,没有涉及到操作系统级别的内容, 操作系统级别的标准就是由POSIX来定义的。

编程语言标准可以看作语言使用者和编译器实现者之间的协议。 协议的一部分是编译器实现者同意提供,用户可以使用的功能。而其它部分则包括用户同意遵守, 编译器实现者认为会被遵守的规则。只要双方都恪守自己的保证,程序就可以正确运行。 如果任何一方违背它的诺言,则结果肯定失败。

1.3、C标准实现库 

C标准实现库就是实现了C的标准的库。对于这个名称还有其他称呼,比如CRTC Runtime Library,C运行时库), 这是因为C标准实现库通常被编译成动态库,其他软件在运行的时候加载这些动态库。还有人称呼C标准实现库libc或者C函数库, 这些都是说的一个意思,只是他们站在不同的角度上说的。

1.4、C开源库
单元测试CUnitCheck
解/压缩zlibzlib-ngbzip2xzlzolz4zstdlibarchive
加/解密nettlelibgcryptlibsodiumlibbcrypt
哈希算法libmdlibb2BLAKE3
SSL/TLSMesaLinkmbedTLSGnuTLSOpenSSLWolfSSLntbtls
网络libcurlnghttp2nghttp3ngtcp2libpcaplibwebsocketslibssh2libgit2libmnllibnllibnetlibmetalinkquichec-ares
YAMLlibyaml
XMLlibxml2Expat
JSONcJSONjson-cjanssonjson-glib
正则表达式pcrepcre2oniguruma
Unicodelibunistringutf8proc
MPIopen-mpi
数学计算openlibmOpenBLAS
多精度算数运算mpirgmpmpcmpfrisl
事件通知libeventlibevlibuv
命令行编辑readlinelibedit
绘图ncursespixman
图像处理libexiflibtifflibjpeg-turbolibpnglibwebpgifliblibimagequant
多媒体处理SDL2libogglibvorbislibtheora
其他libpipelinelibffilibtirpclibassuanneverbleedfreetypepthnpthlibsmip11-kitlibsampleratelibsndfilelibseccomplibisofslibburnlibbthreadcpu_featureslibasspoptlibunwindlibaio
1.5、C编译器

C语言是编译型语言,我们将源码编辑好之后,在运行之前, 必须要将这些源码转换成二进制的机器码,这样运行起来就会非常的快。

C语言的编译器常用的有:

1.6、C预处理器
1.7、汇编器
1.8、静态库打包器
1.9、链接器
1.10、调试器
1.11、静态代码分析工具
1.12、代码覆盖率报告工具
1.13、IDE

IDEIntegrated Development Environment,集成开发环境)

IDE是代码编辑器、编译器、调试器、运行可执行文件等功能全部集成在一起的软件。

IDE可以大大提高开发的效率和速度。

常用的开发C语言项目的IDE有:

1.14、语法