Skip to content

Commit c1d4c6c

Browse files
authored
Update README.md
1 parent 14a23c5 commit c1d4c6c

File tree

1 file changed

+5
-1
lines changed

1 file changed

+5
-1
lines changed

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,11 @@ https://www.zhihu.com/question/20004379/answer/20123641
221221
### 链接器(Linker):
222222
* 链接器是一个程序,将一个或多个由编译器或汇编器生成的目标文件外加库链接为一个可执行文件。
223223
* 例如,hello程序中调用了printf函数,它是每个C编译器都会提供的标准C库中的一个函数。printf函数存在于一个名为printf.o的单独的编译好了的目标文件中,而这个文件必须以某种方式合并到我们的hello.o程序中。链接器(ld)就负责处理这种合并。结果就得到hello文件,它是一个可执行目标文件,可以被加载到内存中。由系统执行。
224-
### 计算机的工作原理详情:
224+
### 代码执行的完整过程:
225+
* 以文本形式存在的源代码 → 编译器将源代码转换成与特定CPU架构兼容的汇编代码或机器码目标文件 → 链接器将目标文件与库文件(如标准C库)和其他必要的代码连接在一起生成最终包含了程序的全部代码和数据的可执行文件并以二进制形式存储 → 操作系统负责加载可执行文件到内存中 → 一旦程序被加载到内存中,CPU开始逐条执行程序指令
226+
### 为什么有的语言执行更快:
227+
* 从编程语言层面上看,取决于编译后的产物在运行时有多少"动态决议"。例如,弱类型语言比强类型语言慢,是因为编译时类型是不确定的,需要运行时进行额外的型别推导,这就是"动态决议";例如,C++里虚函数比普通函数开销大,是因为编译时函数地址是不确定的。普通函数编译后生成的跳转目的地是一串固定的地址,而虚函数的跳转地址是在运行时从CPU的寄存器里读取的,这也是"动态决议",编译后的机器码多了一条寄存器取值指令;类似的场景还有GC机制、模板编程、JIT优化等等,归根结底就是如果在编译时候能完成更多事情,那么生成的机器码运行周期就越短,代码也就运行地越快。
228+
### CPU的工作原理详情:
225229
[《计算机的工作原理》](./计算机的工作原理.txt)
226230

227231

0 commit comments

Comments
 (0)