根据世界编程语言排行榜(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语言也是一门通用性的语言,并没有针对某个领域进行优化,就目前而言,它可以进行以下几种类型的开发。
C语言能干什么?
1) 单片机/嵌入式开发
这是目前使用C语言最广泛的一个领域,尤其是单片机开发,基本被C语言霸占了。
嵌入式开发是一个比较广泛的概念,通常来说包含两个方向:
- 单片机开发:由于硬件资源有限,通常不使用操作系统,让代码跑在裸机上;或者,仅仅安装一个简单的实时操作系统(RTOS),比如 FreeRTOS、µC/OS、RT-Thread 等。
- 一个是基于复杂操作系统之上的开发,比如 Linux、Windows、Android 等。当然,这些操作系统都要针对嵌入式环境进行裁剪和优化,形成专门的嵌入式版本,以减少对资源的占用。这个才是通常所讲的嵌入式开发。
也就是说,单片机开发是嵌入式开发的一个分支,或者一个子集,或者一个分支。
几个例子:
- 家电(空调、自动洗衣机、遥控器)
- 汽车(ECU发动机控制单元、BCU车身控制单元、车辆信息检测)
- 医疗(心电图仪、血压仪、血糖仪、监护设备)
- 智能卡(门禁卡、公交卡、银行卡)
- 玩具(遥控汽车、摇摇椅)
2) 桌面软件开发
也叫 GUI 开发或者 PC 软件开发。
在实际应用中,C语言通常用来开发某些关键模块或者效率模块,而不是开发一个完整的软件。这些模块一般对性能有着很高的要求,同时也关注资源消耗情况,除了C语言也没有其它更好的选择了。
几个例子:
- Office早期版本使用C实现核心功能
- PS早期版本使用C实现核心功能
- CAD和3D建模软件使用C实现渲染和计算功能
- Notepad++、Sublime Text使用C实现核心的编辑功能
- MySQL Workbench和SQL Server Management Studio数据库客户端软件,使用C语言来实现数据库连接、查询、管理和界面
如果你想开发一个完整的桌面软件,那么可以使用以下的解决方案/技术栈/技术选型(以 Windows 为例说明):
- 基于 .NET 平台的 Windows Forms、WPF、UWP,可以使用 C#/VB.NET 编程。
- 基于 C++ 的 GUI 框架/库,比如 Qt、MFC、wxWidgets、GTK。
- 基于 Java 的 Swing、JavaFX。
- 基于 Python 的 Tkinter、PyQt。
- 基于 Web 技术(HTML、CSS 和 JavaScript)的 Electron 框架,VS Code、GitHub 客户端、Discord 就是用 Electron 开发。
- 基于 Dart 的 Flutter,跨平台,支持 Windows、Linux、macOS、Android、iOS、网站。
3) 系统组件开发
基础组件、核心算法、硬件驱动、通信协议的实现,都离不开C语言。
C语言底层开发举例:
- 基础组件:文件系统、进程管理、用户界面(CLI+GUI)
- 核心算法:加密/安全算法(MD5、SHA、AES、RSA、SSL)、调度算法(线程/进程调度、内存页面置换)、LZ压缩算法、CRC和海明码等数据校验算法、随机数生成算法(又细分为多种方式)
- 硬件驱动:声卡驱动、显卡驱动、网卡驱动、蓝牙驱动、键鼠驱动、扫描仪/打印机驱动、USB驱动
- 通信协议:TCP/IP协议族(UDP、DNS、路由选择)、HTTP/HTTPS、SMTP/POP3/IMAP、FTP、SNMP、Bluetooth、NFC
4) 开发操作系统
这是C语言的初衷,它就是为开发操作系统而生的,UNIX、Linux、Windows 的内核就大量使用C语言。
5) 开发其它编程语言
有些编程语言的编译器(解释器)和标准库就使用C语言开发,比如 Python、PHP、Rust、Perl。
有些编程语言是在C语言的基础上进行的扩展,比如 C++、Objective-C、Swift、D语言。
由于C语言具有可移植性,适应性强,有时也被用作不同编程语言的中间语言,这样不同编程语言之间就可以共享组件/模块。把C语言作为中间件的编译器有:
- Gambit(Scheme语言的编译器和开发环境)
- BitC(系统级编程语言)
- GHC(Haskell语言的编译器)
- Vala(基于C的语言,创建GNOME桌面程序)
- Squeak(基于Smalltalk的面向对象编程语言)
6) 信号处理
C语言在电气工程领域也有很多用途,它可以使用信号处理算法来管理微处理器、微控制器等集成电路。
几个例子:
- 无线通信中的调制和解调,包括数字调制解调、射频调制解调。
- 数字信号处理(DSP),包括滤波、频谱分析、时频分析、数字滤波器设计、谱估计。
7) 音视频处理
C语言的速度非常快,能够快速地对音频和视频数据进行处理。音频和视频数据通常比较大,需要高效的算法和数据结构来处理,而C语言运行速度非常快,能够及时处理这些数据。
C语言提供了丰富的底层库和工具,如 FFmpeg、OpenCV 等,这些库和工具可以方便地对音频和视频数据进行编码、解码、剪辑、处理和转换等操作。
C语言支持指针和位运算等底层操作,这些操作可以对音频和视频数据进行高效的操作,如数据拷贝、移位、变换等。这些操作对于实现一些高级算法和数据结构非常有帮助。
几个例子:
- 音频编解码:MP3、AAC、WAV
- 视频编解码:H.264、H.265、VP9
- 音频处理:音频滤波、均衡器、混响、降噪、语音识别、音频合成
- 视频处理:图像滤波、色彩空间转换、运动估计、视频编辑
- 媒体库:FFmpeg 和 OpenCV 可以用于编解码、格式转换、滤波、图像处理等
8) 数据库开发
数据库是软件领域的基础设施,它的性能直接影响整个应用程序的运行效率,所以必须使用一种高效的语言进行开发。
使用C语言开发的数据库有:MySQL、SQLite、PostgreSQL、Oracle Database、Microsoft SQL Server。
总结
虽然C语言的开发场景看起来很多,但是如果总结一下的话,无非就是:底层/系统开发 +关键组件/模块的开发 + 贴近硬件的开发,这些开发场景非常关注运行效率,或者响应时间,或者硬件资源。
程序员要学习C语言吗
C语言是一个老古董了,初学者如果不打算搞单片机/嵌入式开发,那么即使学了,一时半会可能也用不上(那些底层/系统开发和关键组件开发,离初学者太远),看起来有点鸡肋。然而,几乎所有大学的计算机/软件专业都将C语言作为必修课,这又是为什么呢?难道真的是因为大学教育落后吗?
当然不是!
C语言是一门基础语言,很多其它的课程都依赖C语言;如果你不了解C语言,那么这些课程是学习不了的。
不妨举几个例子:
- 编译原理课程通常以C语言为例讲解,因为C语言的编译过程相对简单、规范和透明,适合教学。
- 数据结构课程通常使用C语言编程,因为C语言比较底层,能够让大家看到数据结构的各种细节。另外,数据结构是一种被频繁调用的组件,必须要追求效率,C语言再合适不过了。
- 学习操作系统原理(内存、进程、线程、通信等)也要具备C语言基础,否则是学不明白的。
C语言是一门面向计算机的语言,它能帮助我们快速了解底层。而其它的高级语言(Python、Java、C# 等)是面向用户的,它能让我们快速上手,搞出点实用的工具来,比如桌面软件、网站、APP 等。
借助C语言学习原理,相当于修炼内功;使用其它语言开发程序,相当于精通招式。既有内功也有招式,才是一名合格的程序员。
从整体上讲,计算机软件大概可以分为两种:
- 一种是基础设施,比如操作系统、数据库、浏览器、云计算系统、大数据系统、编译器/编程语言、通信协议、区块链、标准库/运行库、算法实现等。
- 一种是应用软件,比如桌面软件、APP、网站、小程序等。
内功不扎实的话,开发一般的应用软件是没问题的,这也是各家互联网公司正在做的事情。但是,要想开发高性能的软件,或者开发基础设施,那绝对是不行的,门都没有。
互联网已经不再是浪潮之巅,只搞简单的应用软件越来越没有前途,所以各家公司也在慢慢下沉,越来越重视根基了。
这意味着,编程不再是一种小把戏,而是逐渐演变成了一种技术,或者一种科研,你需要系统性地学习理论和基础,那种「上几个月培训班就能找份月入过万的工作」的时代已经越来越远了。