“第一门编程语言学C靠谱吗?”
“C还有未来吗?”
“我应该考虑学C吗?”
“C太老了吧!”
你是否也听过类似的话语?
听说过无数次,有些是面对面的交谈,而有些来自某个论坛。
虽然答案无非是“取决于具体情况”,但以我的拙见,学习C编程是非常宝贵的经验。
我想通过这篇短文向你展示C伟大的一面。
01C的精神首先,我想引用文档C99RationaleV5.10中的一句话:
C89委员会始终将保留C的传统精神作为主要目标。C的精神体现在很多方面,但其本质在于社区对C语言所依赖的基本原则的看法。C的精神可以总结为以下几个方面:
●相信程序员。
●不阻碍程序员完成任务所需的工作。
●保持语言短小精悍。
●仅提供一种操作的方法。
●保持高速,即使无法保证可移植性。
下面,我将进一步讨论上述几点。
02中级编程语言编程语言可以大致分为两个级别:低级和高级。
低级语言靠近硬件,比低级语言更接近CPU的就只有电流了。这些语言又分为为机器码和汇编两种。前者是原始数据流,通常是二进制数据。为了便于人类使用,通常我们以“可读”的十六进制形式进行处理。
第二代语言汇编在机器码之上提供了一层抽象。这些语言大部分是人类可读的符号(包括符号地址)、操作码、地址、数字常量、字符串等的映射。而且每个处理器各有不同。
相较而言,高级语言提供了哪些抽象?
根据维基百科:
与低级编程语言相比,高级语言使用了自然语言元素,更易于使用,而且还可以自动化(甚至完全隐藏)计算机系统中的重要领域(例如内存管理),从而简化程序的开发过程,而且也比低级语言更易于理解。编程语言提供的抽象数量决定了其“高级”程度。
简而言之:低级语言=更加靠近机器,高级语言=更加人性化。
C是高级编程语言,但在C刚刚创建的时候,大多数功能仍然是通过低级的汇编完成的。因此,与其他广泛使用的语言相比,C拥有更底层的抽象级别,因此我喜欢将其称为“中级编程语言”。
你可以轻松地将C代码编译成汇编(而不是二进制代码),并检查CPU执行的指令,在这个过程中C语言不会加入太多语言特有的代码。
此外,如果有需要,流行的C编译器还提供了更低级的选项,允许你使用内联汇编完全掌控CPU。纵观编程领域,能够做到这一步的编程语言可谓少之又少。
03简洁低级语言的编程难度很高。不是因为这些语言过于复杂,而是因为这类编程很容易出错,因此需要投入更多精力、记忆和心思。
C是中级编程语言,因此“根据定义”C语言编程更加容易。但令人惊讶的是,与高级语言相比,C语言的学习非常简单。
为什么?
因为C语言的语法非常简单,还有结构化的范例。循环、函数、结构、指针、变量、类型等核心基础知识的学习都非常容易。大约只需一周的努力学习即可入门。剩下的就是数学和计算机科学理论了。
但是,不要误会我的意思!如果想完全掌握C语言,你需要付出大量的努力!事实上,学习任何东西都需要付出大量的努力!
04快速、轻量级与其他语言(例如Java)相比,标准C库很小,所以你完全可以记住所有的功能。虽然有些功能应该在很久以前就弃用了,但是C语言的性能仍然非常出色。
如果连libc都觉得太大怎么办?即便你完全不用libc也没有关系。只要不包含括任何头文件即可,甚至连简单的printf()都不使用。你可以将其替换成其他库。
C语言非常成熟,重视对内存的管理,拥有内联汇编、少量抽象,且语言没有过度膨胀,因此程序员能够很好地控制程序。
因此,C语言成为了OS内核(Linux、WindowsNT或macOS的XNU等)以及其他语言(例如Python)的理想选择。
这也是为什么C在嵌入式系统上如此受欢迎的原因,因为嵌入式系统不允许浪费任何资源。
05无所不在=可移植性你能否想到任何没有C编译器的重大平台?除了有些只运行汇编的平台,我从未听说过没有C编译器的平台。高端游戏PC、NASA航天器、售票机等各种平台都使用了C编程。真的是无所不在,C软件遍布全世界。
如上所述,对于围绕在我们日常生活中的微控制器和其他形式的嵌入式系统来说,C语言是主流选择。
你听说过FFI吗?事实证明,许多编程语言都可与C兼容。
你不必担心是否可在某些工作中使用C语言,99%的情况下你都可以使用C!(尽管这并不意味着你应该在所有工作中都使用C……)。尽管C语言的代码并非%可移植,但你可以成为可移植的程序员。
06影响力C语言直接或间接地影响了无数语言,比如C++、Java、Go、D、Rust、Perl,甚至是PHP和Python。
显然,学习这些语言的时候,你并不需要C的知识,有时甚至还不能使用C的最佳实践。
然而,我认为记住编程语言的根源很重要。而且,如果你熟悉C,那么就会有一些优势,尤其是C++的学习。
07丰富的库我怀疑以上对于C语言的快速、轻量级、中级编程语言、汇编等方面的讨论,可能会给你一个错误的想法:你需要实现所有的功能。
虽然C确实没有Java中的LinkedHashMap或其他功能(如垃圾收集器),但C语言也不至于那么落后。
C是一种成熟的流行语言。无论你需要何种功能,相信都能找到相应的库(虽然有些功能太晦涩不容易表达,因此不太好找,但我相信这些库一定存在)。
你需要垃圾收集器?那么可以试试BoehmGC。你需要TUI?那么ncurses是不二的选择。还有很多很多库,我无法一一列举:GTK、PDCurses、libcurl、ALSA、Genann、libsoundio、SDL、SQLite、getopt、OpenGL、inih、GMP、cJSON、MuPDF、OpenSSL...
C是一种非常通用的语言,基本上可以编写任何东西:Web服务器、视频游戏(例如来自id-Software的经典游戏,