mirror of
https://github.com/Aexiar/c.git
synced 2024-10-22 14:05:45 +02:00
2024年10月15日 10:49
This commit is contained in:
parent
cab65d7295
commit
6e44509fe2
4
docs/notes/01_c-basic/00_xdx/assets/24.svg
Normal file
4
docs/notes/01_c-basic/00_xdx/assets/24.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 6.3 MiB |
@ -858,3 +858,94 @@ int main() { // 定义主函数
|
||||
> * ① C 语言适合底层编程、系统级开发,性能高、控制力强,但对程序员的要求也更高。而 Java 语言则更适合应用层开发,拥有丰富的库和工具支持,开发效率更高,并且由于自动内存管理和异常处理,编写的代码通常更加安全和健壮。
|
||||
> * ② 两者各有优势,选择使用哪种语言应根据项目需求和开发环境来决定。
|
||||
|
||||
# 5.4 C 语言的优缺点
|
||||
|
||||
### 5.4.1 概述
|
||||
|
||||
* 当今繁荣昌盛的互联网世界是建立在 C 语言基础之上的,如:
|
||||
* ① 操作系统:C 语言设计的初衷就是用来编写操作系统。目前所有的主流操作系统内核,所采用的编程语言都是 C 语言。
|
||||
* ② 网络协议栈:一般和内核采用相同的语言实现,也就是 C 语言。
|
||||
* ③ WEB 服务器和 HTTP 服务器:Apahce、NGINX 是采用 C 语言编写的,Tomcat 是采用 Java 语言编写的,只能运行 Java 应用程序。
|
||||
* ④ 关系型数据库:MySQL 是采用 C/C++ 语言编写的,而 PostgreSQL 和 SQLite 主要由 C 语言编写的。
|
||||
* ⑤ 非关系型数据库:Redis 主要由 C 语言编写的,MongoDB 是由 C++ 语言编写的,而 Elasticsearch 由 Java 语言编写的。
|
||||
* ...
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> * ① C/C++ 非常适合做基建开发,而 Java 和 Go 等非常适合做业务开发。
|
||||
> * ② 近几年,Rust 语言很火,有望替代 C/C++ 做基建开发,因为其是内存安全的,并且没有 GC(垃圾收集器) 。
|
||||
|
||||
* C 语言是一门接近“低级语言”的“中级语言”,如下所示:
|
||||
|
||||
![](./assets/24.svg)
|
||||
|
||||
### 5.4.2 C 语言的优点
|
||||
|
||||
* ① C 语言是一门接近硬件层面的编程语言,提供了接近硬件的操作能力。
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> * ① C 语言通过提供直接内存访问、指针操作和系统调用等功能,允许程序员以接近硬件的方式编写代码。
|
||||
> * ② 这种能力使得 C 语言特别适合用于嵌入式系统开发以及系统编程。
|
||||
|
||||
* ② C 语言拥有在所有编程语言中几乎独一档的高运行效率。
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> * ① C 语言提供了接近硬件的操作能力,这意味着 C 程序可以更好的利用硬件资源。
|
||||
> * ② C 语言编译器将源代码直接编译成机器代码(或非常接近的汇编语言),而非解释执行或编译为中间代码。
|
||||
> * ③ C 语言还提供了各种特性使得程序员可以控制优化 C 程序的几乎每一个细节。如:C 语言的手动内存分配控制,这意味着可以精确地管理资源使用,从而提高效率。
|
||||
> * ④ 在平均一般情况下,如果一个C程序的执行速度是 100%,那么:
|
||||
> * C++ 可能由于复杂性的影响,性能会轻微下降,一般是 95% 左右。
|
||||
> * Java 由于JVM等特性的影响,运行效率一般低于 C/C++,大概在 50%-80% 范围内。
|
||||
> * Python 是一种脚本语言,需要解释执行,效率很差,可能在 5%-30% 之间。
|
||||
|
||||
* ③ C 语言的语法非常简洁,没有太多复杂的特性。
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> * ① 作为一门接近硬件的编程语言,C 语言的抽象层次很低,没有很多高级的抽象特性。
|
||||
> * ② 这使得 C 语言简单易学,同时对于想要深入理解计算机原理的人来说,C 语言的低抽象性也可以使得学习者可以更好的忽略语言特性,关注具体原理。
|
||||
|
||||
* ④ C 语言作为一门"中级语言",市面上流行的编程语言基本都可以找到它的影子(C-like 语言),所以学习 C 语言对于学习其他编程语言也有很大的帮助。
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> 很多类 C 的编程语言都有 C 语言的身影,如:C++、Java 等。
|
||||
|
||||
* ⑤ C 语言的生命力旺盛,从诞生到如今始终都是最流行的开发语言之一。
|
||||
|
||||
### 5.4.3 C 语言的缺点
|
||||
|
||||
* ① C 语言是一门非常容易出错,却非常不容易发现错误的编程语言。
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> * ① C 语言的语法相对**非常宽松**和灵活,给予了程序员很大的自由度,但出错的概率也大大增加了。
|
||||
> * ② C 语言给程序员很大的自主性和控制权限,但即便是熟练的 C 程序员也无法保证能够完美的控制程序,如:内存管理,手动的内存管理不仅增加了编程的复杂性,而且非常容易出错,非常容易造成内存泄漏和使用未初始化的内存导致未定义行为。
|
||||
> * ③ C 语言追求效率,所以没有专门的异常机制来指示程序出现的问题。C 程序甚至不会去检查数组下标越界的问题。
|
||||
> * ...
|
||||
|
||||
* ② C 语言缺少一些必要的高级特性,使得C程序的可维护性很差。
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> 一个复杂的 C 程序,如果在设计之初没有考虑到维护问题,那么将很难对它做出修改或扩展。(这也是 C++ 出现的目的)
|
||||
|
||||
* ③ 相比较现代的高级语言,C 语言经常可以写出可读性十分差的代码。
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> * ① 一方面是由于 C 语言作为一门小型语言,它缺乏一些现代高级语言中的特性,并且其标准库相对较小。因此,程序员往往需要自行编写复杂的代码实现,这些代码对于其他人可能难以理解。
|
||||
> * ② 另一方面,C 语言诞生于编程发展的初期,那时的编程哲学倾向于代码的极致简洁性。这种风格有时会导致代码过于晦涩难懂,尤其是当程序员过分追求聪明的技巧时,可能会编写出只有自己能理解的代码。
|
||||
> * ③ 在现代编程中,尤其是团队协作环境下,高度重视代码的可读性和维护性。因此,强调编写清晰易读的 C 代码,而不是单纯追求代码的简洁。
|
||||
|
||||
* ④ C 语言的核心语法特性在不同编译器和平台之间是保持一致的,这是因为不同平台的编译器实现都必须遵循 C 语言的标准(如:ISO C标准)。这确保了无论在 Windows 还是 Linux 平台上,基本的语法、控制结构和数据类型等基础元素都是相同的。
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> * ① 由于 C 语言提供了接近操作系统层面的编程能力,当涉及到与操作系统直接交互的特定功能,如:系统调用或使用特定平台的库函数时,就会出现不同平台间的实现差异。
|
||||
> * ② 这些差异并不是由 C 语言本身的语法差异引起的,而是由不同操作系统平台的不同特点所引起的。
|
||||
> * ③ 这种差异性一方面影响了 C 语言的跨平台性,也增加了 C 语言的学习成本,例如:尽管 Windows 和 Linux 平台上的 C 语言核心编程逻辑相似,但在实现平台特定功能时所需的 API 调用和编程细节可能大不相同。
|
||||
> * ④ 需要注意的是,尽管存在平台间的差异,但这并不意味着 Windows 和 Linux 下的 C 语言是两种截然不同的语言。适应不同的平台环境和编程接口对程序员而言,不算什么特别困难的事情。
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user