Skip to content

计算机史与C ​

MULTICS 和 CP/M ​

​MULTICS 和 CP/M 虽然没有直接的前身,但它们都站在了当时计算机技术的前沿。 ​MULTICS 更多地关注大型计算机系统,而 CP/M 则面向个人计算机市场。

​早期批处理系统: 计算机只能顺序执行作业。 ​MULTICS: 多用户、多任务分时系统,对 Unix 产生了深远影响。 ​Unix: 从 MULTICS 分支出来,强调可移植性、多用户、多任务。 ​CP/M: 为 8 位微型计算机设计的操作系统,是 DOS 的前身。 ​DOS: 基于 CP/M 开发,面向个人计算机。

个人计算机市场 ​

​20世纪70年代,个人计算机开始逐渐走进人们的生活。这些早期的计算机硬件资源有限,需要一个简单高效的操作系统来管理。 ​命令行界面: 当时的计算机主要通过命令行的方式进行操作,用户需要输入特定的指令来完成各种任务。

DOS(Disk Operating System,磁盘操作系统) ​

起源 ​

86-DOS:

1980年,Seattle Computer Products公司开发了86-DOS操作系统,这是DOS的雏形。86-DOS运行在Intel 8086处理器上,并提供了一些基本的磁盘管理和文件操作功能。

微软的介入:

微软公司看中了86-DOS的潜力,购买了其授权,并对其进行了改进和扩展,推出了MS-DOS(Microsoft Disk Operating System)。

特点: ​

​①单用户单任务操作系统: 只能由一个用户使用,并且一次只能运行一个程序。 ​②命令行界面: 用户通过输入命令与计算机交互,没有图形界面。 ​③面向磁盘操作: DOS 的主要功能是管理磁盘上的文件和程序。 ​④代表: MS-DOS 是最著名的 DOS 操作系统,曾广泛应用于个人计算机。 ​⑤历史地位:DOS 在个人计算机普及初期扮演了重要的角色,为后来的 Windows 操作系统奠定了基础。

Windows 1.0 的诞生 ​

​最早的 Windows 操作系统是 1985年 发布的 Windows 1.0。

​在 Windows 1.0 之前,个人计算机主要使用的是命令行界面,比如 DOS。用户需要输入复杂的命令才能操作计算机。随着计算机技术的不断发展,人们对更加直观、方便的操作界面产生了需求。

​Windows 1.0 的出现正是为了满足这种需求。 它提供了一个图形用户界面(GUI),用户可以通过点击鼠标和图标来操作计算机,大大降低了使用门槛。

大型计算机系统 ​

UNIX ​

起源:UNIX 起源于 1969 年,由贝尔实验室的 Ken Thompson 和 Dennis Ritchie 等人开发。它最初是为多用户、分时系统设计的操作系统。

linux ​

​linux的开发始于1991年 作者是Linus目的在于创建一个自由、开源的Unix-like操作系统内核,以便用户能够在个人计算机上运行类似Unix的环境

linux本身并不是一个完整的操作系统,而是一个 操作系统内核。内核是操作系统的心脏,负责管理系统资源、进程调度等底层任务。 开源性 是 Linux 的核心特点,这使得它成为了一个非常灵活和强大的平台。

Ubuntu: 基于Linux的桌面操作系统 ​

Ubuntu 是一个基于 Linux 内核的 完整的操作系统。它在 Linux 内核的基础上,添加了桌面环境、软件包管理系统、以及大量的预装软件,形成了一个可以直接使用的操作系统。 Ubuntu 以用户友好、易于安装和使用而著称,非常适合个人用户和开发者。 Debian 是 Ubuntu 的基础,它也是一个非常流行的 Linux 发行版。

CentOS: 基于RHEL的企业级Linux发行版 ​

CentOS 也是一个基于 Linux 内核的完整的操作系统,但它与 Ubuntu 有所不同。 CentOS 是 Red Hat Enterprise Linux (RHEL) 的社区版,它与 RHEL 在功能上几乎完全兼容,但完全免费。 CentOS 更注重稳定性和安全性,因此非常适合用于服务器环境。

三者关系总结 ​

Linux 是一个内核,提供操作系统的底层功能。 Ubuntu 和 CentOS 都是基于 Linux 内核构建的完整的操作系统。 Ubuntu 更面向桌面用户,而 CentOS 更面向服务器用户。

Basic语言: ​

1960早年代的一种教育普及语言。 Basic语言作为一种教育语言 与后来的系统编程关系不大 。

B语言 ​

在1960年代 贝尔实验室参与了Multics(Multiplexed Information and Computing Service)操作系统的开发。这个项目的目标是创造一个强大、复杂的多用户操作系统。

虽然Multics在功能上非常先进 但其复杂性使得开发和维护变得困难。在Multics项目中 肯·汤普逊(Ken Thompson)和其他开发者逐渐意识到 需要一个更简单、更易于实现的操作系统。

1969年 汤普逊开始开发Unix 这个新系统的设计理念是简单性和模块化。为了支持Unix的开发而设计的 提供一种更简洁的编程语言 以便快速开发和修改系统软件,B语言诞生了。

B语言的语法和结构都经过简化 适合在当时的计算机资源有限的环境下使用。由于B语言的简单性和灵活性 它成为了Unix系统早期版本的主要编程语言。在B语言的使用过程中 开发者发现B语言的功能有限 特别是在处理数据类型和复杂结构方面。

C语言 ​

介绍 ​

C语言的主要目标是为Unix系统提供一种更强大和灵活的编程语言 能够更有效地进行系统编程。 它引入了类型系统、结构体、指针等概念 增强了对系统资源的控制能力(手动管理内存)。

C语言最初在1972年用于重写Unix操作系统的核心部分 使得Unix能够更容易地移植到不同的计算机硬件上。C 语言是与 UNIX 操作系统一起被开发出来的 但它不只支持UNIX。 C语言是一门面向过程的计算机编程语言 与C++、C#、Java、Python等面向对象编程语言有所不同。

特点 ​

①直接操作硬件: C语言允许程序员直接操作硬件,包括内存、寄存器等,这对于需要精细控制硬件的嵌入式系统来说非常重要。 ②执行效率高: C语言编译生成的代码执行效率高,占用系统资源少,这对于资源有限的嵌入式设备来说至关重要。 ③接近汇编语言: C语言的语法相对简单,但又保留了部分汇编语言的特性,可以实现对硬件的精细控制。

不是面向对象语言的原因: ​

​ C语言虽然有结构体 但它本质上并不是面向对象语言 这主要是因为它缺少面向对象编程的几个核心特性。

①没有类和对象的概念:

C语言的结构体虽然可以用来组织数据,但它不是真正的类。

类是面向对象编程的核心概念,它不仅包含数据 还包含操作这些数据的函数(方法)。C语言中没有对象这个概念 结构体只是一个数据集合。

②不支持继承和多态:

继承是面向对象编程中非常重要的特性 它允许一个类继承另一个类的属性和方法。C语言的结构体不支持继承。 ​多态是指不同对象对同一消息做出不同响应的能力。C语言也没有直接支持多态的机制。

③没有封装性:

封装是将数据和操作数据的方法结合在一起形成一个独立的单元。C语言的结构体虽然可以封装数据,但不能很好地封装方法。

GNU ​

GNU是一个项目,是一个开发大量免费Unix软件的集合。

为什么叫GNU呢?起名就是 GNU IS NOT Unix。其中GNU的编译器集合,又叫GCC。

Gcc在委员会指导下,它的C编译器紧跟C标准,有各种版本以适应不同硬件平台和操作系统。如unix linux windows

GCC、LLVM 和 Clang 是编译器领域的三大巨头,它们之间有着密切的联系。 ​

GCC(GNU Compiler Collection) ​

​① 历史最悠久: GCC 是一个功能强大、性能优异的编译器套件,支持多种编程语言,包括 C、C++、Objective-C、Fortran 等。 ​② 开源: GCC 是一个开源项目,经过多年的发展,拥有庞大的用户社区和丰富的生态系统。 复杂性高: 由于历史悠久,GCC 的代码库非常庞大且复杂,这使得它的维护和扩展变得困难。

LLVM(Low Level Virtual Machine) ​

​① 模块化设计: LLVM 采用模块化的设计,将编译过程分为前端、优化器和后端三个阶段。这种设计使得 LLVM 具有高度的灵活性,可以支持多种编程语言和硬件平台。 ​② 中间表示(IR): LLVM 引入了中间表示(IR),这是一种类似于汇编语言的低级语言,但具有更强的表达能力。IR 使得 LLVM 可以进行更高级的优化。 ​③ 可扩展性强: LLVM 的架构非常灵活,可以方便地添加新的前端和后端,支持新的编程语言和硬件平台。

Clang ​

① LLVM 前端: Clang 是 LLVM 的一个前端,主要用于编译 C、C++ 和 Objective-C 语言。 ② 性能优异: Clang 的编译速度比 GCC 更快,错误提示也更加友好。 ③ 模块化设计: Clang 继承了 LLVM 的模块化设计,具有高度的灵活性。

三者之间的关系 ​

① Clang + LLVM = GCC 的替代品: Clang 和 LLVM 的组合可以作为一个完整的编译器,在很多方面都优于传统的 GCC。 ② LLVM 是一个基础设施: LLVM 提供了一个强大的编译器基础设施,Clang 是基于 LLVM 的一个前端。 ④ GCC 兼容 LLVM: GCC 也可以使用 LLVM 作为后端,这使得 GCC 可以受益于 LLVM 的优化和扩展能力。

总结 ​

GCC 是一款成熟稳定的编译器,但其复杂性限制了它的发展。 LLVM 提供了一个灵活的编译器基础设施,具有良好的可扩展性。 Clang 是一个基于 LLVM 的高性能编译器前端,在编译速度和错误提示方面表现出色。

在选择编译器时,可以根据以下因素进行考虑: ​

1.项目需求: 如果需要支持多种编程语言或进行复杂的优化,LLVM 是一个不错的选择。 2.编译速度: 如果对编译速度有较高要求,Clang 是一个很好的选择。 3.生态系统: GCC 拥有庞大的生态系统,而 LLVM 的生态系统也在不断发展。

总的来说,LLVM 和 Clang 的出现为编译器领域带来了新的活力,它们正在逐渐取代 GCC 的地位。

MinGW ​

全称: Minimalist GNU for Windows

C编译器不是windows的标准软件包的一部分,你需要从网上下载(如MinGW),以便于在pc上使用命令来操作GCC编译器

作用: 将 GCC 编译器移植到了 Windows 平台上,使得我们在 Windows 系统上可以使用 GCC 来编译 C/C++ 代码。 特点: ① 提供了在 Windows 上使用 GCC 的接口。 ② 包含了 Win32 API,使得编译出来的程序可以在 Windows 环境下运行。

CMake ​

作用: 一个跨平台的构建工具,用于生成特定平台的构建文件(如 Makefile、Visual Studio 项目文件等)。 特点: ① 编写 CMakeLists.txt 文件来描述项目结构和编译规则。 ② 可以根据不同的平台和编译器生成相应的构建文件。 ③ 简化了项目构建过程,提高了可移植性。

GCC(全称: GNU Compiler Collection) ​

作用: 一个功能强大的编译器套件,用于将 C、C++ 等高级语言编译成机器码。 特点: ① 开源免费,支持多种编程语言。 ② 编译优化能力强,生成高效的机器码。

三者之间的关系 ​

CMake 生成构建文件,GCC 执行编译: CMake 通过解析 CMakeLists.txt 文件,生成适合当前平台的构建文件(如 Makefile)。然后,构建工具(如 make)会根据生成的构建文件调用 GCC 编译器来编译源代码。 Mingw 提供 GCC 在 Windows 上的运行环境: Mingw 将 GCC 移植到了 Windows 平台上,使得我们可以使用 CMake 生成针对 Mingw 的构建文件,然后使用 Mingw 提供的 GCC 编译器来编译我们的项目。

流程 ​

1.Cmake读取cmakeList.txt文件,确定结构、源码文件和依赖项目 2.Cmake根据系统环境和选定的编译器(minGW) 生成对应的构建文件(MakeFile) 3.minGW通过make命令调用gcc或g++

g++ ​

g++介绍 1.C++ 编译器的代名词: 由于 g++ 在 C++ 社区中非常流行,以至于很多人将 g++ 等同于 C++ 编译器。 2.简单易用: g++ 的命令行选项相对简单,易于上手,所以被广泛使用。 3.开源免费: 作为 GCC 的一部分,g++ 也是开源免费的,这使得它成为了很多开源项目的首选编译器。

g++ 与 GCC 的关系 1.g++ 是 GCC 的一部分: g++ 是 GCC 中专门用于编译 C++ 代码的编译器。 2.功能重叠: 实际上,gcc 和 g++ 可以用来编译 C++ 代码。之所以有 g++,主要是为了方便用户记忆和使用。

ISO: ISO(International Organization for Standardization,国际标准化组织)

ANSI : ANSI(American National Standards Institute,美国国家标准协会) ANSI C也就是美国国家标准协会发布的C语言的标准,因为这个东西本来就是人家创建的,所以他说的就是标准,就是这么简单。

C标准 下面说的各个C语言的发布版本都是C语言的标准,只是版本的更迭

  • C89 1983年,美国国家标准协会(ANSI)成立了一个委员会 X3J11 ,以建立C的标准规范。

  • C90 1990年,国际标准化组织(ISO)采用了ANSI C标准(格式有所更改),称为 ISO / IEC 9899:1990 ,也称为 C90 。所以 C89 和 C90 几乎上是同一个标准,本来 C89 是 ANSI 在83创建的,然后在90年 ISO 采用了这套标准。

  • C99 进一步修订 C 标准,于1999年发布 ISO / IEC 9899:1999 ,通常被称为 C99 。引入了一些新的特性。比如内联函数,几种新的数据类型等等。

  • C11 2011年12月8日正式发布, C11 标准为 C 和库添加了许多新功能,包括类型通用宏,匿名结构,改进的 Unicode 支持,原子操作,多线程和边界检查功能。它还使现有 C99 库的某些部分可选,并提高了与 C ++ 的兼容性。

C标准不仅描述c语言,还描述如何执行c域处理器,c标准库有哪些函数以及详述这些函数的工作原理。C域处理器在程序执行之前查看程序,故称之为预处理器。根据程序中的预处理器操作,预处理器把符号缩写替换成其表示的内容。预处理器可以包含程序所需的其他文件。基本上他的工作是把一些文本转换成另外一些文本。