Skip to content

Commit 8dc1838

Browse files
committed
feat: update articles
1 parent 2168ca1 commit 8dc1838

File tree

32 files changed

+135
-50
lines changed

32 files changed

+135
-50
lines changed

CPP/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ C++1x 为自身的标准库增加了非常多的工具和方法,诸如在语
1414

1515
![](https://i.postimg.cc/W4pLpjFp/image.png)
1616

17-
C++ 不是 C 的一个超集,在编写 C++ 时,也应该尽可能的避免使用诸如 void\* 之类的程序风格。而在不得不使用 C 时,应该注意使用 extern "C" 这种特性,将 C 语言的代码与 C++代码进行分离编译,再统一链接这种做法,例如:
17+
C++ 不是 C 的一个超集,在编写 C++ 时,也应该尽可能的避免使用诸如 `void*` 之类的程序风格。而在不得不使用 C 时,应该注意使用 extern "C" 这种特性,将 C 语言的代码与 C++代码进行分离编译,再统一链接这种做法,例如:
1818

1919
```c
2020
// foo.h
+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# 编译与运行
2+
3+
# 编译器对比
4+
5+
GNU(Gnu's Not Unix)编译器套装(GNU Compiler Collection,GCC),指一套编程语言编译器,以 GPL 及 LGPL 许可证所发行的自由软件,也是 GNU 项目的关键部分,也是 GNU 工具链的主要组成部分之一。GCC(特别是其中的 C 语言编译器)也常被认为是跨平台编译器的事实标准。1985 年由理查德·马修·斯托曼开始发展,现在由自由软件基金会负责维护工作。GCC 原本用 C 开发,后来因为 LLVM、Clang 的崛起,它更快地将开发语言转换为 C++。GCC 在发布后很快地得到扩展,变得可处理 C++。之后也变得可处理 Fortran、Pascal、Objective-C、Java、Ada,Go 与其他语言。
6+
7+
许多操作系统,包括许多类 Unix 系统,如 Linux 及 BSD 家族都采用 GCC 作为标准编译器。苹果电脑预装的 Mac OS X 操作系统也采用这个编译器。GCC 目前由世界各地不同的数个程序员小组维护。它是移植到最多中央处理器架构以及最多操作系统的编译器。由于 GCC 已成为 GNU 系统的官方编译器(包括 GNU/Linux 家族),它也成为编译与创建其他操作系统的主要编译器,包括 BSD 家族、Mac OS X、NeXTSTEP 与 BeOS。GCC 通常是跨平台软件的编译器首选。有别于一般局限于特定系统与运行环境的编译器,GCC 在所有平台上都使用同一个前端处理程序,产生一样的中介码,因此此中介码在各个其他平台上使用 GCC 编译,有很大的机会可得到正确无误的输出程序。
8+
9+
Clang:是一个 C、C++、Objective-C 和 Objective-C++编程语言的编译器前端。它采用了底层虚拟机(LLVM)作为其后端。它的目标是提供一个 GNU 编译器套装(GCC)的替代品。作者是克里斯·拉特纳(Chris Lattner),在苹果公司的赞助支持下进行开发,而源代码授权是使用类 BSD 的伊利诺伊大学厄巴纳-香槟分校开源码许可。Clang 主要由 C++编写。Clang 项目包括 Clang 前端和 Clang 静态分析器等。这个软件项目在 2005 年由苹果电脑发起,是 LLVM(Low Level Virtual Machine)编译器工具集的前端(front-end),目的是输出代码对应的抽象语法树(Abstract Syntax Tree, AST),并将代码编译成 LLVM Bitcode。接着在后端(back-end)使用 LLVM 编译成平台相关的机器语言。Clang 本身性能优异,其生成的 AST 所耗用掉的内存仅仅是 GCC 的 20%左右。2014 年 1 月发行的 FreeBSD10.0 版将 Clang/LLVM 作为默认编译器。
10+
11+
- GCC 特性:除支持 C/C++/ Objective-C/Objective-C++语言外,还是支持 Java/Ada/Fortran/Go 等;当前的 Clang 的 C++支持落后于 GCC;支持更多平台;更流行,广泛使用,支持完备。
12+
13+
- Clang 特性:编译速度快;内存占用小;兼容 GCC;设计清晰简单、容易理解,易于扩展增强;基于库的模块化设计,易于 IDE 集成;出错提示更友好。

CPP/并发编程/libuv/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# libuv
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

CPP/快速开始/README.md

Whitespace-only changes.

CPP/编译与运行/README.md

-19
This file was deleted.

CPP/编译与运行/g++.md

-3
This file was deleted.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# 快速开始
+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# clang
2+
3+
# 常用指令
4+
5+
clang 提供了一些命令,让我们可以对编译的过程进行一些配置和查看,下面我们就对一些常用的指令进行一个基本的介绍。
6+
7+
```sh
8+
# 查看编译的步骤
9+
$ clang -ccc-print-phases main.m
10+
11+
0: input, “main.m”, objective-c
12+
1: preprocessor, {0}, objective-c-cpp-output
13+
2: compiler, {1}, ir
14+
3: backend, {2}, assembler
15+
4: assembler, {3}, object
16+
5: linker, {4}, image
17+
6: bind-arch, “x86_64”, {5}, image
18+
19+
# 查看编译结果
20+
$ clang -rewrite-objc main.m
21+
22+
# 查看操作内部命令,可以使用 -### 命令
23+
$ clang -### main.m -o main
24+
```
25+
26+
# 代码执行步骤
27+
28+
- 预处理完成后就会进行词法分析,这里会把代码切成一个个 Token,比如大小括号,等于号还有字符串等。`clang -fmodules -fsyntax-only -Xclang -dump-tokens main.m`
29+
30+
- 然后是语法分析,验证语法是否正确,然后将所有节点组成抽象语法树 AST。`clang -fmodules -fsyntax-only -Xclang -ast-dump main.m`
31+
32+
- 完成这些步骤后就可以开始 IR(intermediate representation)中间代码的生成了,CodeGen 会负责将语法树自顶向下遍历逐步翻译成 LLVM IR,IR 是编译过程的前端的输出后端的输入。`clang -S -fobjc-arc -emit-llvm main.m -o main.ll`
33+
34+
- 这里 LLVM 会去做些优化工作,在 Xcode 的编译设置里也可以设置优化级别-01,-03,-0s,还可以写些自己的 Pass,官方有比较完整的 Pass 教程: Writing an LLVM Pass — LLVM 5 documentation 。`clang -O3 -S -fobjc-arc -emit-llvm main.m -o main.ll`
35+
36+
- Pass 是 LLVM 优化工作的一个节点,一个节点做些事,一起加起来就构成了 LLVM 完整的优化和转化。如果开启了 bitcode 苹果会做进一步的优化,有新的后端架构还是可以用这份优化过的 bitcode 去生成。`clang -emit-llvm -c main.m -o main.bc`
37+
38+
- 生成汇编。`clang -S -fobjc-arc main.m -o main.s`
39+
40+
- 生成目标文件。`clang -fmodules -c main.m -o main.o`

CPP/语法基础/快速开始/gcc.md

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# gcc
2+
3+
hello 程序的生命周期是从一个高级 C 语言程序开始的,因为这种形式能够被人读懂。然而,为了在系统上运行 hello.c 程序,每条 C 语句都必须被其他程序转化为一系列的低级机器语言指令。然后这些指令按照一种称为可执行目标程序的格式打好包,并以二进制磁盘文件的形式存放起来。目标程序也称为可执行目标文件。Unix 系统上,从源文件到目标文件的转化是由编译器驱动程序完成的:
4+
5+
```sh
6+
unix> gcc -o hello hello.c
7+
```
8+
9+
GCC 编译器驱动程序读取源程序文件 hello.c,并把它翻译成一个可执行目标文件 hello。这个翻译的过程可分为四个阶段完成:
10+
11+
![image](https://user-images.githubusercontent.com/5803001/52256465-bce93280-2951-11e9-860c-5dba0ae2bcb2.png)
12+
13+
- 预处理阶段。预处理器(cpp)根据以字符 # 开头的命令,修改原始的 C 程序。比如 hello.c 中第 1 行的 #include <stdio.h> 命令告诉预处理器读取系统头文件 stdio.h 的内容,并把它直接插入到程序文本中。结果就得到了另一个 C 程序,通常是以 .i 作为文件扩展名。
14+
15+
- 编译阶段。编译器(cc1)将文本文件 hello.i 翻译成文本文件 hello.s,它包含一个汇编语言程序。汇编语言程序中的每条语句都以一种标准的文本格式确切地描述了一条低级机器语言指令。汇编语言是非常有用的,因为它为不同高级语言的不同编译器提供了通用的输出语言。例如,C 编译器和 Fortran 编译器产生的输出文件用的都是一样的汇编语言。
16+
17+
- 汇编阶段。接下来,汇编器(as)将 hello.s 翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序(relocatable object program)的格式,并将结果保存在目标文件 hello.o 中。hello.o 文件是一个二进制文件,它的字节编码是机器语言指令而不是字符。如果我们在文本编辑器中打开 hello.o 文件,看到的将是一堆乱码。
18+
19+
- 链接阶段。请注意,hello 程序调用了 printf 函数,它是每个 C 编译器都会提供的标准 C 库中的一个函数。printf 函数存在于一个名为 printf.o 的单独的预编译好了的目标文件中,而这个文件必须以某种方式合并到我们的 hello.o 程序中。链接器(ld)就负责处理这种合并。结果就得到 hello 文件,它是一个可执行目标文件(或者简称为可执行文件),可以被加载到内存中,由系统执行。
20+
21+
# gcc 的组成
22+
23+
| 部分 | 描述 |
24+
| ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
25+
| c++ | gcc 的一个版木,默认语言设置为 [C++](http://c.biancheng.net/cplus/),而且在连接的时候自动包含标准 C++ 库。这和 g++ 一样 |
26+
| ccl | 实际的 C 编译程序 |
27+
| cclplus | 实际的 C++ 编泽程序 |
28+
| collect2 | 在不使用 GNU 连接程序的系统上,有必要运行 collect2 来产生特定的全局初始化代码(例如 C++ 的构造函数和析构函数) |
29+
| configure | GCC 源代码树根目录中的一个脚木。用于设置配置值和创建 GCC 编译程序必需的 make 程序的描述文件 |
30+
| crt0.o | 这个初始化和结束代码是为每个系统定制的,而且也被编译进该文件,该文件然后会被连接到每个可执行文件中来执行必要的启动和终止程序 |
31+
| cygwin1.dll | Windows 的共享库提供的 API,模拟 UNIX 系统调用 |
32+
| f77 | 该驱动程序可用于编译 Fortran |
33+
| f771 | 实际的 Fortran 编译程序 |
34+
| g++ | gcc 的一个版木,默认语言设置为 C++,而且在连接的时候自动包含标准 C++ 库。这和 c++ 一样 |
35+
| gcc | 该驱动程序等同于执行编译程序和连接程序以产生需要的输出 |
36+
| gcj | 该驱动程序用于编译 [Java](http://c.biancheng.net/java/) |
37+
| gnat1 | 实际的 Ada 编译程序 |
38+
| gnatbind | 一种工具,用于执行 Ada 语言绑定 |
39+
| gnatlink | 一种工具,用于执行 Ada 语言连接 |
40+
| jc1 | 实际的 Java 编译程序 |
41+
| libgcc | 该库包含的例程被作为编泽程序的一部分,是因为它们可被连接到实际的可执行程序中。 它们是特殊的例程,连接到可执行程序,来执行基木的任务,例如浮点运算。这些库中的例程通常都是平台相关的 |
42+
| libgcj | 运行时库包含所有的核心 Java 类 |
43+
| libobjc | 对所有 Objective-C 程序都必须的运行时库 |
44+
| libstdc++ | 运行时库,包括定义为标准语言一部分的所有的 C++ 类和函数 |
File renamed without changes.
File renamed without changes.

sidebar.md

+35-27
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,45 @@
11
- [CPP](/CPP/README.md)
22
- [C](/CPP/C/README.md)
33

4-
- [函数](/CPP/函数/README.md)
5-
- [Lambda](/CPP/函数/Lambda.md)
6-
- [变量操作](/CPP/变量操作/README.md)
7-
- [右值引用](/CPP/变量操作/右值引用.md)
8-
- [并发基础](/CPP/并发基础/README.md)
9-
- [线程](/CPP/并发基础/线程.md)
10-
- [进程](/CPP/并发基础/进程.md)
11-
- 数据结构
12-
- [向量](/CPP/数据结构/向量.md)
13-
- [序列类型](/CPP/数据结构/序列类型.md)
4+
- 工程实践
5+
- [编译与运行](/CPP/工程实践/编译与运行/README.md)
6+
7+
- 并发编程
8+
- [libuv](/CPP/并发编程/libuv/README.md)
9+
10+
- [并发基础](/CPP/并发编程/并发基础/README.md)
11+
- [线程](/CPP/并发编程/并发基础/线程.md)
12+
- [进程](/CPP/并发编程/并发基础/进程.md)
13+
- [线程协作](/CPP/并发编程/线程协作/README.md)
14+
- [共享内存](/CPP/并发编程/线程协作/共享内存.md)
15+
- [线程安全](/CPP/并发编程/线程安全/README.md)
16+
- [Mutex](/CPP/并发编程/线程安全/Mutex.md)
17+
- [Semaphore](/CPP/并发编程/线程安全/Semaphore.md)
18+
- [条件变量](/CPP/并发编程/线程安全/条件变量.md)
19+
- [死锁](/CPP/并发编程/线程安全/死锁.md)
20+
- [自旋锁](/CPP/并发编程/线程安全/自旋锁.md)
21+
- [读写锁](/CPP/并发编程/线程安全/读写锁.md)
1422
- 版本变迁
1523
- [C++11](/CPP/版本变迁/C++11.md)
1624
- [C++14](/CPP/版本变迁/C++14.md)
1725
- [C++17](/CPP/版本变迁/C++17.md)
18-
- 程序语法
19-
- [函数](/CPP/程序语法/函数.md)
20-
- [变量与表达式](/CPP/程序语法/变量与表达式.md)
21-
- 类与对象
22-
- [类与对象](/CPP/类与对象/类与对象.md)
23-
- [继承与重载](/CPP/类与对象/继承与重载.md)
24-
- [线程协作](/CPP/线程协作/README.md)
25-
- [共享内存](/CPP/线程协作/共享内存.md)
26-
- [线程安全](/CPP/线程安全/README.md)
27-
- [Mutex](/CPP/线程安全/Mutex.md)
28-
- [Semaphore](/CPP/线程安全/Semaphore.md)
29-
- [条件变量](/CPP/线程安全/条件变量.md)
30-
- [死锁](/CPP/线程安全/死锁.md)
31-
- [自旋锁](/CPP/线程安全/自旋锁.md)
32-
- [读写锁](/CPP/线程安全/读写锁.md)
33-
- [编译与运行](/CPP/编译与运行/README.md)
34-
- [g++](/CPP/编译与运行/g++.md)
26+
- 语法基础
27+
- [函数](/CPP/语法基础/函数/README.md)
28+
- [Lambda](/CPP/语法基础/函数/Lambda.md)
29+
- [变量操作](/CPP/语法基础/变量操作/README.md)
30+
- [右值引用](/CPP/语法基础/变量操作/右值引用.md)
31+
- [快速开始](/CPP/语法基础/快速开始/README.md)
32+
- [clang](/CPP/语法基础/快速开始/clang.md)
33+
- [gcc](/CPP/语法基础/快速开始/gcc.md)
34+
- 数据结构
35+
- [向量](/CPP/语法基础/数据结构/向量.md)
36+
- [序列类型](/CPP/语法基础/数据结构/序列类型.md)
37+
- 程序语法
38+
- [函数](/CPP/语法基础/程序语法/函数.md)
39+
- [变量与表达式](/CPP/语法基础/程序语法/变量与表达式.md)
40+
- 类与对象
41+
- [类与对象](/CPP/语法基础/类与对象/类与对象.md)
42+
- [继承与重载](/CPP/语法基础/类与对象/继承与重载.md)
3543
- [Python](/Python/README.md)
3644
- [内置数据结构](/Python/内置数据结构/README.md)
3745
- [dict](/Python/内置数据结构/dict.md)

0 commit comments

Comments
 (0)