器→工具, 编程语言

编程语言基础:C语言

钱魏Way · · 460 次浏览

C语言的起源可以追溯到20世纪60年代末期。它是由贝尔实验室的丹尼斯·里奇(Dennis Ritchie)和肯·汤普森(Ken Thompson)在开发UNIX操作系统时创建的。

早期的UNIX系统最初是用汇编语言编写的,但汇编语言与硬件紧密相连,移植到不同的计算机架构上非常困难。为了改善这种情况,汤普森设计了一种名为”B”的高级语言,并用它来重新编写UNIX的部分组件。不久之后,丹尼斯·里奇在”B”语言的基础上发展出了一种新的语言,这就是C语言。

C语言最初的设计目标是提供一种能以高级语言的方式进行编程,但同时又能直接操作硬件的语言。这使得C语言既有高级语言的抽象能力,又有低级语言的效率,因此非常适合用于系统编程。

C语言在1972年首次发布,之后在1978年发布的《The C Programming Language》一书(也被称为“K&R C”)进一步推广了C语言的使用。这本书是丹尼斯·里奇和布莱恩·柯林汉(Brian Kernighan)合著的,书中详细介绍了C语言的使用方法,被认为是C语言的经典教材。

自那时以来,C语言已经成为最广泛使用的编程语言之一,直到今天仍然在操作系统、嵌入式系统等许多领域中被广泛使用。

作为一中古老的编程语言一直存在着,有些人想问,现在还值得去学习C语言吗?学习更加现代的如JAVA、Python、GOLANG是否会更加合适?以下是我的梳理及看法。

C语言进化史(标准化)

  • 1979年之前,混乱时代,没有统一的标准
  • 1978年 Brian W. Kernighan & Dennis M. Ritchie 编写的《The C Programming Language》出版,成了事实上的标准,简称K&R C
  • 美国标准协会ANSI,在1989年12月通过了第一个标准,称为ANSI C
  • 1990年,国际标准化组织(ISO)将ANSI C作为国际标准。通常成为C89或C90
  • 1999年,国际标准化组织(ISO)经过重新梳理,并通过了C99标准
  • 2011年,国际标准化组织(ISO)通过了C11标准,增加了新的特性,提升对C++的兼容。
  • 2018年,国际标准化组织(ISO)通过了C18标准,C18没有引入新的语言特性,只对C11进行了补充和修正。

为什么要学习C语言?

反方观点:

  • 1970年的作品,老古董了,计算机技术日新月异,已被时代淘汰,已有更“先进”的语言供“选择”
  • 应用场景少,如网页制作、APP开发、机器学习等大部分都不使用C 语言,工作机会也较少

我的观点:

  • C语言有自己的市场定位,类似驱动程序、操作系统或者是编程语言都比较适合用C去实现,另外大部分语言都提供C语言接口,在一些需要接触到硬件或队性能有更高的场景下都可以嵌入C 语言代码,如JAVA有JNI,Python有CPython,Ruby也允许你使用C编程扩展。
  • C 语言可以帮你更好的学习其他语言。大部分编程语言是基于C 语言实现的(如Python、PHP等),另外一部分是基于C 语言的拓展(如C++、JAVA、Objective C、Javascript等),一旦深入了解C语言后,你能更好的理解其他编程语言在更高层次上的抽象背后的原理。
    • 更好的理解数据结构,相比Python或者JAVA可以让你更好的知道常见的数据结构是如何实现的,在了解各种数据结构的优缺点,也就能更好的去决定采用何种数据结构去解决现实问题。
    • 更好的理解内存管理,C语言的指针可以让你更清楚的了解数据是如何存储和读取的。而像Java、Python等完全将内容管理给掩藏了(事实上编程时经常会出现GC问题)
  • 学习C语言看上去不会马上给予你回报,但从长远看,学习C语言可以为你打下很好的基础。

我对C语言的认识:

  • C 语言是为C编译器打造的一套语法规则
  • C 编译器实质上是代码生成器(C语言->汇编到->机器码)
  • C 语言的很多特性是为了方便编译器设计而建立的
  • C 语言源自个人项目,一些设计上的缺陷沿用至今
  • C 语言也有不断进化,一些缺陷有被改进,有添加一些新的特性

学习C语言的好处:

  • C语言比较适合用来理解常见的数据结构,如堆栈、二叉树、队列等是如何构建的,其他语言,比如Python或者JAVA,虽然也支持使用这些常见的数据结构,但是你很难知道其内部是如何实现的。
  • 在理解了数据结构的实现原理后,你能更清楚的各种数据结构的优缺点,也就能更好的去决定采用何种数据结构去解决现实问题。
  • C语言的指针有助于我们更好的理解编程语言中的内存管理概念。而像Java、Python等完全将内容管理给掩藏了(事实上编程时经常会出现GC问题)
  • 学习C语言看上去不会马上给予你回报,但从长远看,学习C语言可以为你打下很好的基础。
  • 在接触gdb以后,可以让你更好的掌握调试技巧。
  • 一旦深入了解C语言后,你能更好的理解其他编程语言在更高层次上的抽象背后的原理。
  • C语言只是一个健身房,而真正PK的时候要使用的是拳击房(Python、JAVA)
  • C短小精炼,并不像JAVA那么庞大,单它却可以完成非常多的任务。
  • C语言有自己的市场定位,类似驱动程序、操作系统或者是编程语言都比较适合用C去实现。
  • 大部分语言都提供C语言接口,如JAVA有JNI,Python有CPython,Ruby也允许你使用C编程扩展
  • 尽快C有很多缺陷,但是大部分编程语言是使用C语言实现的(如Python、PHP等),另外一部分是基于C的拓展(如C++、JAVA、Objective C、JAVASCRIPT等)

尽管C语言在很多场景下被慢慢取代,另外也有更优秀的D语言、GO语言或Rust,但是还是非常推荐各位程序员学好C语言。

编程语言关系图:(右键可查看全图)

C语言学习书籍推荐

以下这些C语言书籍是我过去一段时间看过的关于C语言的书籍,关于书籍的评价非常的主观,推荐给大家,期望对想学习C语言的你有所帮助。

  • 《C 语言程序设计现代方法 — K.N.King》
    • 推荐等级:★★★★★
    • 评级:基于C99标准,内容全面翔实
  • 《征服C指针 — 前桥和弥》
    • 推荐等级:★★★★★
    • 评价:包含了大量技术内幕及细节,是知识架构的极好补充
  • 《C11 编程导论 — Paul Deitel & Harvey Deitel》
    • 推荐等级:★★★★
    • 评价:全英文,最新的C11标准,作为阅读补充
  • 《明解C语言 — 柴田望洋》
    • 推荐等级:★★★★
    • 评价:书写风格浅显易懂,但不深入,适合作为第一本入门书籍,如果你是应付大学计算机考级,那么推荐此书。
  • 《C和指针 — Kenneth A. Reek》
    • 推荐等级:★★★
    • 评价:内容全面,但没第一本《C 语言程序设计现代方法》好,相比较没有什么特色,所以不太推荐
  • 《C 程序设计语言 — Brian W. Kernighan & Dennis M. Ritchie》
    • 推荐等级:★★★
    • 评价:传说中的KR C,讲解不够详细,在当时那个年代可能存在一定的地位,与目前主流C标准存在差异,不建议阅读
  • 《C 专家编程 — Peter Van Der Linden》
    • 推荐等级:★★
    • 评价:很多的技术内容,只适合做补充阅读资料
  • 《C 陷阱与缺陷 — Andrew Koening》
    • 推荐等级:★★
    • 评价:书很薄,内容不多,大部分内容被第二本书《征服C指针》涵盖,不建议阅读
  • 《C语言核心技术 — Peter Prinz & Tony Crawford》
    • 推荐等级:★
    • 评价:第一部分语言没什么新意,主要看了第二部分标准链接库和第三部分基本工具,只做补充,意义不大
  • 《C 程序设计 — 谭浩强》
    • 推荐等级:★
    • 评价:大学教材,大部分知识过期,不建议阅读
  • 《啊哈C语言》
    • 推荐等级:不推荐
    • 评价:仅适合小学生

C语言项目推荐

在Github上,有许多小而美的C项目,这些项目代码简洁明了,易于理解,可以作为学习C语言编程的好资源。以下是一些值得学习的C项目:

  • TINY:TINY是一个小型的HTTP服务器,用纯C语言编写,代码不到2000行。
  • Kilo:Kilo是一个小型的文本编辑器,用C语言编写,代码不到1000行。
  • Snake:Snake是一个经典的贪吃蛇游戏,用C语言编写,代码不到1000行。
  • Xv6:Xv6是一个类Unix操作系统,用C语言编写,代码量不到10000行。
  • SQLite:SQLite是一个轻量级的关系型数据库引擎,用C语言编写,代码量不到50000行。
  • cJSON:cJSON是一个用于解析和生成JSON格式数据的C语言库,代码简洁,易于使用。

以上只是一部分小而美的C项目,值得学习的C项目还有很多,可以根据自己的兴趣和需求进行选择。

C编译器项目推荐

在GitHub上,有很多C编译器项目,这些项目不仅可以用于学习C语言编译器的实现原理,还可以帮助我们更好地了解C语言的底层原理和计算机体系结构。以下是一些值得学习的C编译器项目:

  • Tiny C Compiler (TCC): Tiny C Compiler是一个小型的C编译器,使用ANSI C编写,代码简洁易懂,包括了前端、中间件和后端。
  • Chibi Scheme: Chibi Scheme是一个小型的Scheme解释器,同时也支持C语言扩展。
  • pcc: pcc是一个小型的C编译器,代码简洁,易于阅读,支持多种目标平台。
  • LLVM: LLVM是一个开放源代码的编译器基础架构,用于构建编译器和相关工具。
  • lcc: lcc是一个小型的C编译器,代码简洁易懂,支持多种目标平台。
  • NASM: NASM是一个小型的汇编器,使用ANSI C编写,支持多种目标平台。

以上是一些值得学习的C编译器项目,它们有不同的特点和优势,可以根据自己的兴趣和需求进行选择。

C语言有哪些应用场景?

C语言是一种通用的、过程式的编程语言,因为它的高效性和灵活性,被广泛应用在许多不同的领域和场景。以下是C语言的一些主要应用场景:

  • 操作系统开发:许多流行的操作系统,包括Linux和Windows,都使用C语言进行开发。C语言能够直接访问硬件和内存,这使得它非常适合进行底层的系统开发。
  • 嵌入式系统:在嵌入式系统和微控制器编程中,C语言也是主要的编程语言。由于C语言的高效性和对硬件的直接控制,它非常适合资源有限的嵌入式系统。
  • 系统软件:除了操作系统,许多系统软件,如数据库管理系统、网络驱动程序等,也使用C语言编写。
  • 编译器和解释器:许多编程语言的编译器和解释器是用C语言编写的,包括Python、Ruby、Perl等。
  • 游戏开发:虽然现在许多大型的游戏开发通常使用如C++、C#或Java这样的高级语言,但还是有一些游戏或者游戏引擎使用C语言进行开发,因为C语言可以提供更好的性能和内存控制。
  • 图形和图像处理:一些要求高性能的图形和图像处理软件,如Photoshop,部分也是用C语言编写的。

总的来说,C语言由于其运行效率高、能直接访问底层硬件的特性,使其在需要高性能和底层硬件访问的领域中非常实用。

C和C++有何异同?

C和C++都是广泛使用的通用编程语言,C++实际上起源于C,所以两者有许多共同点。然而,C++在C的基础上添加了一些新的特性,尤其是面向对象编程和泛型编程的特性,因此两者也有许多不同。

这里是C和C++的一些主要相同点和不同点:

相同点:

  • 基本语法:C和C++的基本语法非常类似,包括变量声明、基本数据类型、控制结构(例如if、for、while等)、函数等。
  • 底层访问:C和C++都允许程序员直接访问内存,包括指针操作等,这使得它们非常适合系统级编程和性能关键的应用。
  • C标准库:C++支持C标准库,所以在C++中可以使用printf、scanf等C语言的标准函数。

不同点:

  • 面向对象编程:C++支持面向对象编程,包括类、继承、封装、多态等。C语言没有内建的面向对象编程支持。
  • 标准模板库(STL):C++有一个强大的标准模板库,包括一系列的容器类(如vector、list、map等)和算法。C语言没有类似的库。
  • 异常处理:C++支持异常处理,可以抛出和捕获异常。C语言没有异常处理机制,错误通常通过返回码或全局变量来表示。
  • 运算符重载:C++允许运算符重载,用户可以定义特定类的运算符的行为。C语言没有运算符重载。
  • 字符串处理:在C++中,有一个内建的string类用于字符串处理,而C语言中,字符串是通过字符数组或者字符指针来处理的。
  • 类型安全:相比C,C++是更加类型安全的语言。例如,C++中禁止了一些不安全的类型转换和隐式类型转换。

简单来说,C++是C的一个超集,它包含了C的大部分特性,同时添加了一些新的特性。然而,虽然C++兼容大部分C代码,但并不是所有C代码都是合法的C++代码。

参考链接:

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注