
编译原理
文章平均质量分 73
GR90
熟练使用C++写"Hello World"
展开
-
编译原理 (0) : 程序的虚拟内存和物理内存
但这些虚拟内存最终会映射到物理内存的不同区域(可能共享某些部分)。,但物理内存可能共享,编译链接过程分配的地址其实就是一个虚拟地址。公共库(如 C 标准库)在物理内存中只有一份,被所有进程共享。每个进程的这些区域是独立的,即使逻辑地址相同,物理内存也不同。进程无法直接访问其他进程的内存(除非通过共享内存机制)。虽然虚拟地址相同,但物理内存不同(修改一个进程的。操作系统内核维护每个进程的页表,确保隔离性。:即使一个进程崩溃,也不会影响其他进程。:进程无需关心物理内存的实际分配。可能指向不同的物理内存。原创 2025-04-24 10:08:03 · 314 阅读 · 0 评论 -
编译原理(2): 程序在内存中的分布
4、局部变量、形参在Stack区,从起始的高地址 -----> 低地址一个个排,Stack空间固定,如果数据过大就会栈溢出,造成程序崩溃。3、new出来的对象放在Heap区,从起始的低地址---->高地址一个个的排,理论上,只要有内存,可以一直生成。2、经过编译和链接阶段后,全局变量和静态变量的地址也是固定的。new出来的变量--------存于堆区(heap);函数代码----------------存于代码区;局部变量,函数形参----存于(stack);全局变量,静态变量----存于数据区;原创 2018-01-24 14:48:59 · 3295 阅读 · 0 评论 -
编译原理(3):预编译
其中,编译是主要部分,其中又分为六个部分:词法分析、语法分析、语义分析、中间代码生成、目标代码生成和优化。链接中,分为静态链接和动态链接,本文主要是静态链接。一、预编译:主要处理源代码文件中的以“#”开头的预编译指令。处理规则见下1.删除所有的#define,展开所有的宏定义。2.处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。3.处理“#include”预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件中包含其他...原创 2025-04-24 09:52:55 · 326 阅读 · 0 评论 -
编译原理(4):编译
编译器主要的目的是将便于人编写,阅读,维护的高级计算机语言所写作的源代码,翻译为计算机能解读、运行的低阶机器语言的程序。常用的表示方法是语法树,树中每个内部节点表示一个运算,而该节点的子节点表示运算的分量。在源程序的语法分析和语义分析完成之后(也会生成中间表示,区别语法树),很多编译器生成一个明确的低级的或类机器语言的中间表示。①.语法是语言学的一个分支,研究按确定用法来运用的词类、词的屈折变化或表示相互关系的其他手段以及词在句中的功能和关系。包含词的构词、构形的规则和组词成句的规则。原创 2020-06-02 16:28:16 · 1166 阅读 · 0 评论 -
编译原理(5):链接
才确定(通过 PLT/GOT 机制),此时不再是硬编码地址。链接时,链接器会检查所有目标文件,找到符号定义并绑定地址。重新编译后地址可能变化(如 ASLR 禁用时),但链接器会确保所有调用同步更新。,这是经过名称修饰(Name Mangling)后的唯一标识)。(因为最终地址由链接器在链接时分配),但它可以确定函数的。修正所有跨文件的函数调用地址,生成可执行文件(如。如果函数被内联展开,调用会直接替换为函数体,无需。如果未内联,则按普通函数处理(硬编码地址)。同一构建过程中,链接器分配的地址是固定的。原创 2025-04-24 17:35:54 · 337 阅读 · 0 评论 -
编译原理--符号表
符号表经过编译后,代码中的各种符号都被分配了地址,比将各种信息记录在符号表中,当符号在被用到时,系统去符号表里查询地址,类型等信息。符号表用来体现作用域与可见性信息,符号表中语言符号可分为关键字符号,操作符符号及标识符符号,符号表的作用:1、收集符号属性;(词法分析)2、上下文语义的合法性检查的依据;(语法分析)3、作为目标代码生成阶段地址分配的依据;(语义分析)符号表中的标识符一般设置的属性项目有:1、符号名2、符号的类型3、符号的存储类别4、符号的作用..原创 2020-12-02 09:33:37 · 12298 阅读 · 5 评论