C 语言发布于 1972 年,今年是 2023 年,它已经 50 多岁了,是一个不折不扣的“大叔”或者“大爷”。
但是呢,现在的 C 语言依然非常流行,每一个科班出身的程序员都必学 C 语言。在 2023 年 10 月份发布的世界编程语言排行榜中,C 语言拿了一个第二名的好成绩,占据了 12.08% 的市场份额。
第一名是 Python,占据了 14.82% 的市场份额,比 C 语言多一丢丢。
1972 年,一个叫丹尼斯·里奇(Dennis Ritchie)的程序员大佬,在美国著名的贝尔实验室中开发了 C 语言。C 语言的初衷很简单,就是被设计成一种系统编程语言,帮助团队开发 UNIX 操作系统。
UNIX 可以说是现代操作系统的开山鼻祖,你所听说过的大部分操作系统都受到 UNIX 的影响,比如:
- Linux 是模仿 UNIX 进行开发的,可以说是 UNIX 的山寨版;
- macOS、iOS、iPadOS、watchOS 是在 UNIX 的基础上衍生出来的,可以说是基于 UNIX 进行的二次开发;
- Android、HarmonyOS 都使用了 Linux 内核;
- 深度(Deepin)、优麒麟(Kylin)、统信 UOS 等国产操作系统的内核都是 Linux。
为了让初学者更加精准地理解 C 语言,这里我们不妨给 C 语言贴几个标签。
标签 1:中级语言
很多教材都把 C 语言定位成高级语言,但是从现在的编程环境来看,这种说不再准确了。C 语言最好的定位应该是中级语言。
第一,C 语言比较简单,它的语法特性并不丰富,不支持面向对象,不支持泛型编程,不支持函数编程,而 Java、Python、C#、JavaScript 等高级语言,至少支持其中的两种。
语法特性多了,开发起来就比较方便,维护大型项目也更加得心应手。
第二,C 语言语法严格,编写 C 语言代码需要非常小心,稍微不注意就会出错,比如指针。而 Python、JavaScript、 PHP 等高级语言,代码书写非常灵活,基本不太关注细枝末节,死扣那些和项目功能无关的边边角角。
语法要求严格的话,就会耗费过多精力,写起代码来效率就低。
第三,C语言不支持垃圾内存回收,需要自己管理内存,实在是太麻烦了,一不小心就会出现内存泄露(Memory leak)、 段错误(Segmentation fault)等运行时错误。
虽然有一些工具(Valgrind、ASan 等)可以帮助检测类似的问题,但是这些工具使用起来也非常麻烦,还需要了解 很多底层知识。更要命的是,工具也不是万能的,总有一些不常见的内存问题是无法检测的。
内存问题,是 C/C++ 程序员最头疼的问题。
第四,使用 C 语言开发对程序员的要求很高,程序员需要对计算机底层的执行细节有更深入的了解,比如内存布局、 编译原理等,所以基础不扎实的程序员压根就玩不了 C 语言。
总起来说,C 语言在使用的灵活性和强大型方便,比不过 Java、Python、C#、JavaScript、PHP 等语言,所以它不高级;但是,C 语言又比汇编好用太多了,简直不是一个时代的产物,所以它也不低级。
既不高级也不低级,那就算是中级语言吧。
标签 2:通用语言
根据世界编程语言排行榜(TIOBE)的统计,能叫得上名字来的编程语言大概有 300 多种,其中常用的有 50 种,也就是榜单里面的前 50 名。
从应用范围上来说,这些编程语言大致可以分为两种:
- 一种是专用型语言,也就是针对某个特定领域而设计出来的语言;
- 另一种是通用型语言,它们可以开发多种类型的应用程序,而不是局限在某个特定的领域。
专用型编程语言举例:
编程语言 | 说明 |
---|---|
PHP | 专门用来开发网站后台。 |
JavaScript | 最初只能运行在浏览器里面,用于开发网站前端,实现一些网页特效;后来有“好事”的程序员把它从浏览器里面提取出来,拿到操作系统上直接运行,这个时候 JavaScript 又变成了一种通用型的语言,可以干很多其它事情了,比如开发网站后台、GUI 程序、APP 或者一些小工具。 |
SQL | 专门用于操作数据库的语言,可以实现数据的增删改查。 |
MATLAB | 主要用于数值计算、科学计算和数据可视化等领域。它提供了许多工具箱,可以进行信号处理、图像处理、控制系统设计等任务。 |
R语言 | 用于统计分析和数据科学,是一种开源的语言和环境,提供了许多数据分析和可视化的函数和工具。 |
VHDL/Verilog | 用于数字电路设计,是一种硬件描述语言。它们允许开发人员描述数字电路的行为和结构,并用于电路仿真和综合等任务。 |
通用型编程语言举例:
编程语言 | 说明 |
---|---|
Python | 能做的事情很多,可以用于网络爬虫、自动化运维、数据分析、自动化办公、Web 后台、机器学习/人工智能等多个方向的开发。 |
Java | 可以用于服务器后台开发、Android 开发、大数据开发和桌面软件开发。 |
Objective-C Swift | 开发苹果系统上的应用程序,具体包括 iOS、macOS、watchOS、iPadOS 等。 |
Go语言 | 也称 Golang,主要用于高并发和分布式的服务器端编程,比如云计算、云原生、网站后台、游戏后台、区块链等;另外,Golang 在命令行工具(CLI)开发方面也有不少应用。 |
C++ | 主要用于单片机/嵌入式开发、底层和系统开发、Linux 开发、桌面软件开发、游戏后端和引擎开发等。 |
Rust | 系统级编程语言,针对 C/C++ 缺陷而设计,在很大程度上和 C/C++ 形成竞争,可用于单片机/嵌入式开发、底层和系统开发、游戏后端和引擎开发、网络编程、数据库开发、Web 后台开发、桌面软件开发等。 |
C语言也是一门通用性的语言,并没有针对某个领域进行优化,就目前而言,它可以进行以下几种类型的开发。
标签 3:高效语言
C 语言先被“翻译”成汇编代码,然后再由汇编器编译成机器代码,也就是 0 和 1 组成的那一堆东西。
C 语言语法特性并不丰富,不支持那些高级的玩法,没有乱七八糟的语法糖,什么东西都得由你自己实现,所以 C语言生成的汇编代码比较简洁,比直接手写汇编代码也复杂不了多少。
因为简单,因为原始,所以运行效率高,而且是极高,比汇编也差不了多少,所以在很多场景下都可以代替汇编的工作。
C 语言的运行效率,不是 Python、Java、JavaScript、C#、PHP 这些高级语言所能比肩的,它们之间甚至会存在数量级的差距。
总结
C 语言是一种高效的、通用的中级语言。
C 语言是一名合格的程序员必须掌握的编程语言,很少有不了解 C 语言的大佬。
C 语言除了能让你学习编程相关的概念,带你走进编程的大门,还能让你明白程序的运行原理,比如,计算机的各个部件是如何交互的,程序在内存中是一种怎样的状态,操作系统和用户程序之间有着怎样的“爱恨情仇”,这些底层知识决定了你的发展高度,也决定了你的职业生涯。
如果你希望成为出类拔萃的人才,而不仅仅是码农,这么这些知识就是不可逾越的。也只有学习 C 语言,才能更好地了解它们。