【Story】编译器的基础概念与类型分类

news/2024/9/17 0:07:25/ 标签: C语言, c++, python, java, 编译器, gcc, gnu

LuckiBit

目录

  • 编译器详解
    • 1. 编译器的工作流程
      • 1.1 词法分析(Lexical Analysis)
        • 词法分析的例子
      • 1.2 语法分析(Syntax Analysis)
        • 语法分析的例子
      • 1.3 语义分析(Semantic Analysis)
        • 语义分析的例子
      • 1.4 中间代码生成(Intermediate Code Generation)
        • 中间代码的例子
      • 1.5 代码优化(Code Optimization)
        • 代码优化的例子
      • 1.6 目标代码生成(Code Generation)
        • 目标代码的例子
      • 1.7 代码链接(Linking)
        • 链接的例子
    • 2. 编译器的类型
      • 2.1 基于源语言的分类
      • 2.2 基于目标语言的分类
      • 2.3 单次和多次通过编译器
      • 2.4 跨编译器(Cross Compiler)
    • 3. 常见的编译器
    • 4. 编译器优化
      • 4.1 常见的优化技术
      • 4.2 优化的影响
    • 5. 编译器的挑战
      • 5.1 错误报告
        • 错误报告的例子
      • 5.2 平台独立性
        • 平台独立性示例
      • 5.3 编译速度
        • 编译速度优化的例子
      • 5.4 安全性
        • 安全性优化的例子
    • 6. 未来趋势
      • 6.1 并行编译和优化
        • 并行编译的关键技术
        • 示例:自动并行化
      • 6.2 机器学习与编译器
        • 机器学习在编译器中的应用
        • 示例:基于机器学习的优化
      • 6.3 领域专用编译器(Domain-Specific Compilers)
        • 领域专用编译器的特点
        • 示例:TensorFlow XLA(加速线性代数)
      • 6.4 安全性与隐私保护
        • 安全编译器的特性
        • 示例:LLVM SafeStack
    • 7. 结束语

编译器详解

编译器是一种将高级编程语言(如C、C++、Java、Python等)编写的源代码转换为机器语言或中间代码的工具,使计算机能够执行该程序。编译器的开发和使用在计算机科学中具有核心地位,它帮助程序员将抽象的、高层次的算法和逻辑翻译成具体的、计算机能够理解和执行的指令。

1. 编译器的工作流程

编译器的工作过程通常分为几个主要阶段,每个阶段都有其特定的任务和输出。理解这些阶段有助于掌握编译器的内部工作原理,并有效调试和优化代码。

1.1 词法分析(Lexical Analysis)

词法分析器是编译器的第一个阶段。它的任务是将源代码转换为一系列记号(Token),每个记号代表源代码中的一个基本语法单元,如关键字、变量名、操作符等。

  • 输入:源代码文件(纯文本)。
  • 输出:记号流(Token Stream),这些记号由词法分析器从源代码中识别出来。
词法分析的例子

假设有以下C代码片段:

int main() {return 0;
}

词法分析器会将其拆分为以下记号:

代码片段记号类型
int关键字
main标识符(函数名)
()分隔符
{分隔符
return关键字
0常量
}分隔符

1.2 语法分析(Syntax Analysis)

语法分析器接收词法分析器生成的记号流,将其转换为语法树或抽象语法树(AST)。语法树反映了程序的结构,并验证了程序是否遵循了语言的语法规则。

  • 输入:记号流。
  • 输出:语法树或抽象语法树(AST),用于进一步的编译过程。
语法分析的例子

以同样的C代码为例,语法分析器会生成一棵树状结构:

程序(Program)
├── 函数定义(Function Definition)├── 返回类型:int├── 函数名:main└── 函数体├── 语句块(Block)├── return语句└── 常量:0

1.3 语义分析(Semantic Analysis)

语义分析器通过分析语法树的内容,验证程序的语义正确性。它会进行类型检查、作用域解析、函数调用匹配等操作,以确保程序逻辑符合编程语言的规范。

  • 输入:语法树。
  • 输出:注释了语义信息的语法树或中间代码。
语义分析的例子

在语义分析中,编译器会检查如下一些规则:

  • 确保return语句中的值类型与函数返回类型int匹配。
  • 确保函数main在调用前已被正确声明。
  • 检查变量是否在使用前已声明,并且类型正确。

1.4 中间代码生成(Intermediate Code Generation)

中间代码生成器将语法树或抽象语法树转换为中间代码。中间代码是一种与特定平台无关的代码表示形式,便于后续的优化和目标代码生成。

  • 输入:语法树或抽象语法树。
  • 输出:中间代码。
中间代码的例子

以下是一个简单的中间代码示例(假设使用三地址代码表示):

t1 = 0
return t1

在这个示例中,t1是一个临时变量,用于保存常量0的值,然后通过return语句返回该值。

1.5 代码优化(Code Optimization)

代码优化器对中间代码进行优化,改进代码的执行效率或减少内存使用。优化的目标是生成更高效的目标代码,而不改变程序的逻辑行为。

  • 输入:中间代码。
  • 输出:优化后的中间代码。
代码优化的例子

代码优化可能会将冗余的计算删除,或将一些常见的表达式优化,例如:

  • 常量折叠:将2 + 3直接替换为5
  • 死代码消除:移除永远不会执行的代码。
  • 循环展开:优化循环,减少循环迭代的次数,提高执行效率。

1.6 目标代码生成(Code Generation)

目标代码生成器将优化后的中间代码转换为特定平台的机器代码或汇编代码。这个过程涉及将中间代码映射到具体的处理器指令集。

  • 输入:优化后的中间代码。
  • 输出:目标代码(机器码或汇编代码)。
目标代码的例子

在生成机器代码时,编译器会根据处理器的架构生成相应的指令,例如:

mov eax, 0    ; 将值0加载到eax寄存器
ret           ; 返回

1.7 代码链接(Linking)

在生成可执行文件之前,编译器将多个目标文件链接在一起,并解析外部函数调用、全局变量引用等。链接器会将不同模块(如库文件)整合到最终的可执行文件中。

  • 输入:目标代码(可能包含多个目标文件)。
  • 输出:可执行文件或库文件。
链接的例子

在链接阶段,假设程序调用了一个外部库中的函数,链接器会找到该函数的实现并将其包含在可执行文件中。

2. 编译器的类型

编译器的种类多样,通常可以根据源语言、目标语言、编译方式等多种标准来分类。

2.1 基于源语言的分类

编译器类型说明示例
C编译器用于将C语言源代码编译为机器代码。GCC(GNU Compiler Collection)、Clang、Visual C++。
C++编译器用于将C++语言源代码编译为机器代码。G++(GCC的C++编译器)、Clang++、MSVC(Microsoft Visual C++)。
Java编译器将Java源代码编译为Java虚拟机(JVM)字节码。Javac。
Python编译器Python通常是一种解释型语言,但也可以编译成字节码用于解释器执行。CPython(将Python代码编译为字节码),Jython(编译成Java字节码),PyPy(JIT编译)。

2.2 基于目标语言的分类

编译器类型说明示例
机器码编译器直接生成特定平台的机器码,如x86、ARM架构的机器码。GCC、Clang。
中间语言编译器生成与平台无关的中间代码,如Java字节码、.NET的MSIL(中间语言)。Javac(生成Java字节码),Mono(生成CIL,即Common Intermediate Language)。

2.3 单次和多次通过编译器

编译器类型说明示例
单次通过编译器(One-pass Compiler)在一次扫描中完成编译过程,通常效率较高,但功能相对简单。适用于早期的C语言编译器或嵌入式系统中的一些编译器
多次通过编译器(Multi-pass Compiler)需要多次扫描源代码,每次扫描完成不同的任务,通常用于复杂的编译器,能够提供更好的优化。GCC、Clang等现代编译器

2.4 跨编译器(Cross Compiler)

编译器在一种平台上运行,但生成另一种平台的代码。这在开发嵌入式系统或为不同硬件架构编写软件时非常重要。

编译器类型说明示例
编译器在一种平台上运行,但生成另一种平台的代码,常用于嵌入式系统开发或需要为不同硬件架构生成代码的场景。ARM GCC(在x86平台上编译生成ARM平台的代码)、Emscripten(将C/C++代码编译为WebAssembly)。

3. 常见的编译器

在不同的开发环境中,程序员会使用各种编译器来处理不同的编程语言和平台。以下是一些最常见的编译器及其特点:

编译器支持的语言主要特性平台兼容性
GCC(GNU Compiler Collection)C, C++, Fortran, Ada, 等。开源编译器,广泛支持多种平台,具有良好的优化功能和灵活的编译选项。Linux、Windows、macOS、Unix。
ClangC, C++, Objective-C。基于LLVM的编译器,具有快速编译速度、清晰的错误和警告信息,以及模块化设计,易于集成和扩展。Linux、Windows、macOS。
MSVC(Microsoft Visual C++)C, C++。集成在Visual Studio开发环境中,提供了丰富的调试和分析工具,专为Windows开发优化。Windows。
JavacJavaJava的标准编译器,将Java源代码编译为跨平台的字节码,可以在任何支持Java虚拟机(JVM)的系统上运行。跨平台(Java虚拟机)。
Intel CompilerC, C++。专门为Intel处理器优化的编译器,提供了高级的并行化和矢量化支持,适用于高性能计算。Linux、Windows、macOS。

4. 编译器优化

编译器的优化过程是编译中的关键步骤之一,旨在提高生成代码的执行效率,减少内存占用,并提高程序的运行速度。优化不仅限于减少代码量,还包括其他诸如寄存器分配、循环优化等技术。

4.1 常见的优化技术

优化技术说明示例
常量折叠在编译时计算表达式中所有可能的常量值,减少运行时的计算。int a = 2 + 3; 编译后直接变为 int a = 5;
循环展开通过减少循环的迭代次数或将多个循环体合并为一个,来提高执行效率。for (int i = 0; i < 4; i++) { sum += arr[i]; } 展开为 sum += arr[0] + arr[1] + arr[2] + arr[3];
死代码消除移除在程序中永远不会执行的代码,减少不必要的代码和资源消耗。删除如 if (false) { ... } 之类的代码块。
寄存器分配优化寄存器的使用,减少对内存的访问次数,提高程序的执行速度。将变量存储在寄存器中,而不是频繁从内存中读取。
代码移动将不依赖循环迭代的代码移动到循环体外,减少不必要的计算。将循环外的计算提到循环前:for (int i = 0; i < n; i++) { ... } 中的不变表达式可以提取出来。

4.2 优化的影响

不同级别的优化可能对编译时间、代码体积和运行时性能产生不同的影响。在实际应用中,开发者可以选择不同的优化等级,以权衡编译时间和运行效率。编译器通常提供多种优化级别,如-O1-O2-O3,这些选项决定了编译器应用哪些优化技术。

优化等级说明典型应用场景
-O0无优化,主要用于调试,生成的代码与源代码关系紧密,便于调试。调试时使用,以便精确定位问题。
-O1轻微优化,减少代码大小,同时避免影响调试。需要一定优化但不希望影响调试体验时使用。
-O2中度优化,提高执行效率,适度增加编译时间。一般应用程序的编译,平衡编译时间和运行效率。
-O3强力优化,最大化执行效率,可能增加编译时间和代码大小。性能关键的应用,如高性能计算、游戏引擎等。
-Os优化以减小代码体积,适用于嵌入式系统或存储空间有限的环境。嵌入式系统开发、内存受限的应用。

5. 编译器的挑战

编译器开发不仅技术复杂,还面临诸多挑战。编译器需要在生成高效代码、保持编译速度、报告准确的错误信息以及确保生成代码的安全性之间找到平衡。

5.1 错误报告

编译器需要在编译过程中检测和报告代码中的语法和语义错误。错误信息应当清晰、准确,以便开发者能够快速找到并修正问题。这对于初学者尤其重要,良好的错误报告能大大减少调试时间。

错误报告的例子
int main() {printf("Hello World")
}

如果漏掉了分号,编译器可能会报告如下错误:

error: expected ‘;’ before ‘}’ token

这种错误提示能够帮助开发者迅速找到问题的根源。

5.2 平台独立性

现代编译器通常需要支持多个平台,这要求编译器能够生成不同架构的目标代码,如x86、ARM、RISC-V等。这意味着编译器的后端需要根据不同的处理器架构生成相应的机器码,并处理平台特定的系统调用和库函数。

平台独立性示例

GCC作为一个跨平台的编译器,可以在同一套源代码上生成适用于不同操作系统和处理器架构的可执行文件:

gcc -o program_x86 program.c  # 生成x86平台的可执行文件
gcc -o program_arm program.c  # 生成ARM平台的可执行文件

5.3 编译速度

编译器的速度直接影响到开发效率,尤其在大型项目中,编译时间可能非常长。为了提升编译速度,现代编译器使用了并行编译、增量编译、预编译头文件等技术。

编译速度优化的例子
  • 并行编译:利用多核CPU同时编译多个源文件,例如GCC中的-j选项。
  • 增量编译:只编译发生变化的源文件,避免重复编译未修改的文件。
  • 预编译头文件:将常用的头文件预编译以加速编译过程。

5.4 安全性

编译器生成的代码必须是安全的,尤其在处理用户输入、网络数据时,编译器需要避免生成可能引发安全漏洞的代码。例如,缓冲区溢出、格式字符串漏洞等问题,都可能导致程序的崩溃或被恶意利用。

安全性优化的例子

编译器可以在编译时启用一些安全检查和防御措施,如:

  • 栈保护:检测栈缓冲区溢出(Stack Smashing),如GCC中的-fstack-protector
  • 格式字符串检查:检查格式字符串中的潜在漏洞。
  • 地址空间布局随机化(ASLR)支持编译器生成的可执行文件可以启用ASLR,以防止特定类型的攻击。

6. 未来趋势

随着硬件架构的多样化和应用场景的复杂化,编译器技术也在不断演进。未来,编译器将面对更多样化的硬件(如多核处理器、GPU、FPGA)和需求(如高性能计算、人工智能、边缘计算)的挑战。

6.1 并行编译和优化

随着多核处理器的普及,编译器在处理并行化和多线程编程方面的能力变得越来越重要。编译器不仅需要生成高效的并行代码,还需要支持开发者方便地编写和调试多线程应用。

并行编译的关键技术
  • 自动并行化编译器自动将串行代码转换为并行代码,识别并行执行的机会并生成相应的多线程代码。
  • OpenMP和MPI支持:这些是用于并行编程的标准,编译器需要提供良好的支持以简化并行代码的开发和优化。
  • GPU加速:现代编译器正在向支持GPU加速的方向发展,例如通过CUDA或OpenCL,将某些计算任务下放到GPU上执行。
示例:自动并行化

假设有以下简单的循环代码:

for (int i = 0; i < n; i++) {a[i] = b[i] + c[i];
}

自动并行化编译器可以将其转换为并行执行的代码,以便利用多核处理器的优势:

#pragma omp parallel for
for (int i = 0; i < n; i++) {a[i] = b[i] + c[i];
}

在这个例子中,#pragma omp parallel for指示编译器将循环并行化。

6.2 机器学习与编译器

随着机器学习的发展,编译器开始使用机器学习技术来改进代码优化和错误检测。例如,机器学习模型可以用于预测不同优化策略的效果,帮助编译器在编译时做出更智能的选择。

机器学习在编译器中的应用
  • 优化决策:通过机器学习模型来分析大量的历史编译数据,预测不同优化策略的效果,从而自动选择最佳的优化路径。
  • 代码生成:机器学习可以用于生成代码的优化版本,例如自动生成高效的矩阵运算代码或图像处理代码。
  • 错误检测:利用机器学习模型,编译器可以更准确地识别代码中的潜在错误或安全漏洞。
示例:基于机器学习的优化

假设编译器需要决定是否在某段代码中应用循环展开优化。传统上,编译器可能基于一些预设的规则做出决定,但使用机器学习模型时,编译器可以通过分析大量的编译和运行时数据,预测循环展开是否会提高代码的性能,并做出更合适的优化决策。

6.3 领域专用编译器(Domain-Specific Compilers)

随着特定领域(如人工智能、图形处理、网络通信)对性能要求的提高,领域专用编译器(Domain-Specific Compilers, DSC)的需求也在增加。这些编译器专门针对某一领域的代码进行优化,能够生成比通用编译器更高效的代码。

领域专用编译器的特点
  • 高效的领域优化:专注于某一领域的优化技术,能够生成在特定领域内性能最佳的代码。
  • 支持领域特定的语言:如SQL、VHDL、Verilog,或为人工智能模型量身定制的编译器
  • 与硬件协同设计:某些领域专用编译器与专用硬件(如AI加速器、FPGA)协同工作,最大化性能。
示例:TensorFlow XLA(加速线性代数)

TensorFlow的XLA(加速线性代数)编译器就是一个领域专用编译器,专门优化用于深度学习的张量运算。它能够通过特定的硬件加速技术(如GPU、TPU)生成高度优化的代码,大幅提升深度学习模型的执行效率。

6.4 安全性与隐私保护

未来的编译器将在代码安全性和隐私保护方面投入更多的关注。随着网络攻击的复杂性增加和隐私保护法规的日益严格,编译器需要提供更强大的工具来帮助开发者编写安全的代码。

安全编译器的特性
  • 自动漏洞检测编译器能够识别代码中的常见漏洞,如SQL注入、缓冲区溢出等,并在编译时发出警告或错误。
  • 隐私保护机制:在处理敏感数据时,编译器可以自动应用隐私保护机制,如数据加密、差分隐私等。
  • 合规性检查编译器可以帮助开发者确保生成的代码符合特定的隐私保护法规或安全标准。
示例:LLVM SafeStack

LLVM SafeStack是一种编译器技术,旨在提高程序的安全性。它将栈上的敏感数据与非敏感数据分离,防止缓冲区溢出攻击对程序的安全性造成威胁。

通过对编译器的详细分析和扩展讲解,我们可以看到编译器在软件开发中的核心作用以及它如何演进以应对不断变化的计算需求和安全挑战。无论是在传统的桌面应用、嵌入式系统,还是在新兴的领域,如人工智能和高性能计算,编译器技术都将继续发挥重要作用,为开发者提供强大且高效的工具来编写和优化代码。

7. 结束语

  1. 本节内容已经全部介绍完毕,希望通过这篇文章,大家对编译器有了更深入的理解和认识。
  2. 感谢各位的阅读和支持,如果觉得这篇文章对你有帮助,请不要吝惜你的点赞和评论,这对我们非常重要。再次感谢大家的关注和支持!点我关注❤️

http://www.ppmy.cn/news/1507363.html

相关文章

漏洞复现-Atlassian Confluence Data Center 与 Server 存在权限绕过漏洞 (CVE-2023-22518)

1.漏洞描述 Atlassian Confluence Server是澳大利亚Atlassian公司的一套具有企业知识管理功能&#xff0c;并支持用于构建企业WiKi的协同软件的服务器版本。 Atlassian Confluence Data Center 和 Confluence Server存在安全漏洞&#xff0c;该漏洞源于授权管理不当。 2.影响…

vscode 快速生成vue 格式

1.用快捷Ctrl Shift P唤出控制台 输入“Snippets”并选择 Snippets: Configure User Snippets 2.输入vue&#xff0c;选中vue.json vs code自动生成vue.json文件 3.在 vue.json 中添加模板 {"Print to console": {"prefix": "vue2","b…

大数据-69 Kafka 高级特性 物理存储 实机查看分析 日志存储一篇详解

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

SQL Zoo 5.SUM and COUNT

以下题目均来自sql zoo 1.Show the total population of the world.&#xff08;显示世界总人口&#xff09; select sum(population) from world 2.List all the continents - just once each.(列出所有的大洲——每个只列出一个) select distinct(continent) from world…

前端面试题——RN篇

文章目录 前言1.RN和React有什么区别2.RN核心组件3.scrollView和FlatList区别scrollViewList item 4.RN应用导航5.虚拟dom作用是什么目的是什么工作原理 6.RN相对于原生的ios和Android有哪些优/劣势优势劣势 7.RN生命周期8.li列表中有3条数据&#xff0c;删除第二条会发生什么9…

ES6模块化简明笔记

1、什么是模块化 详见看上一篇笔记CommonJs模块化简明笔记 2、为什么需要模块化 详见看上一篇笔记CommonJs模块化简明笔记 3、导入和导出的概念 详见看上一篇笔记CommonJs模块化简明笔记 4、模块导出&#xff08;暴露&#xff09; 4.1 导出&#xff08;暴露&#xff09;方式1&…

基于粒子群优化GRU神经网络的多输入回归分析,基于粒子群优化GRU网络多输入回归分析,基于粒子群优化GRU神经网络

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 gru的原理 粒子群算法原理 粒子群优化GRU神经网络的多输入回归分析 结果分析 展望 参考论文 背影 传统的方法回归分析容易陷入局部最优准确率低,为提高精度,本文用粒子群优化GRU神经网络的多输入回归分析 摘要 LSTM原理,…

攻防世界-web-ctf-upload

题目场景 查看源码 毫无有效的数据 官方WriteUp 本题需要利用文件上传漏洞点&#xff0c;通过绕过服务器的安全防护&#xff0c;达到getshell的目的 本题的主要考点为利用fastcgi的.user.ini特性进行任意命令执行 这里需要绕过的点如下 检查文件内容是否有php字符串 检查…

Less 教程:从入门到精通

Less 教程&#xff1a;从入门到精通 1. 引言 Less 是一种流行的动态样式表语言&#xff0c;它扩展了 CSS 的功能&#xff0c;使其更加强大和灵活。通过本教程&#xff0c;我们将深入探讨 Less 的基本概念、特性以及如何在项目中实际应用它。 2. Less 的基本概念 2.1 变量 …

vue3父组件向子组件传参的具体写法

在Vue 3中&#xff0c;父组件向子组件传参&#xff08;也称作传递props&#xff09;是一种非常基本的通信方式。下面我将详细解释如何在Vue 3中实现这一功能。 1. 定义子组件并接收props 首先&#xff0c;你需要在子组件中定义你想要接收的props。这通过在组件的props选项中完…

通过java.netHttpURLConnection类实现java发送http请求

import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; public static String postForBody(String param) { try { URL url new URL(“https://usapp-open.ulifecam.com”)…

axios中的baseURL与跨域问题

axios中的baseURL 01. baseURL与跨域02. axios的baseurl为相对地址03. axios的baseURL是使用绝对路径还是相对路径04. API 请求跨域05. 生产环境代理问题我理解的baseURL 01. baseURL与跨域 三种模式配置&#xff1a; 开发环境 .env.development测试环境 .env.production生产…

游戏在抖音只有一个答案,都选C

经过2023年至2024年间多个案例的曝光&#xff0c;游戏开发商与硬核联盟之间的分歧已不再是秘密。而与此同时&#xff0c;抖音游戏发行的影响力也日益凸显&#xff0c;开始被市场所看重。 抖音能否成为取代硬核联盟的下一个渠道窗口&#xff1f; 从产品角度分析&#xff0c;抖…

Python教程:Python线程池与进程池入门

目录 1. 线程与进程的基本概念 1.1 线程 1.2 进程 1.3线程池与进程池的选择 2. Python 中的线程池与进程池 2.1 线程池 2.2 进程池 3. 实战示例 3.1 使用线程池 3.2 使用进程池 4.max_workers 详解 4.1什么是 max_workers 4.2如何设置 max_workers 4.2.1 根据任务…

自动化专业英语

前言 电子信息、电气工程、自动化专业英语词汇汇总&#xff0c;不定期更新 常用 Asynchronous&#xff1a;异步synchronous&#xff1a;同步notification&#xff1a;通知blade&#xff1a;平面shaft&#xff1a;轴magnetic&#xff1a;磁场的bearing&#xff1a;轴承valve&…

2024前端面试(内容持续更新)

Vue篇 data为什么是个函数&#xff1f; 在‌Vue中&#xff0c;‌data必须是一个‌函数&#xff0c;这是因为当data是函数时&#xff0c;每个组件实例化时都会调用该函数&#xff0c;返回一个新的数据对象&#xff0c;从而保证每个组件实例拥有独立的数据&#xff0c;避免数据冲…

Java 集成测试详解及示例

通过综合指南探索 Java 集成测试的世界。了解工具、流程和最佳实践&#xff0c;并辅以实际示例。 随着软件系统变得越来越大、越来越复杂&#xff0c;组件和服务以错综复杂的方式交互&#xff0c;集成测试已变得不可或缺。通过验证所有组件和模块在组合时是否正常工作&#xff…

江苏省2024年中职职教高考_计算机应用专业综合理论试卷真题讲解

视频教程链接: 江苏省2024年中职职教高考_计算机应用专业综合理论试卷真题讲解

Android SurfaceFlinger——信号同步原理(五十一)

经过前面系列文章的学习,我们的已经理解了 SurfaceFlinger 运行机制以及同步机制,但是SurfaceFlinger 又是以什么方法是把需要刷新的信号发送给 App 进程的。 一、VSync简介 垂直同步(Vertical Synchronization,简称 VSync)是一种用于同步视频信号和显示设备刷新率的技术…

【多线程】初识进程和线程

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;多线程 / javaEE初阶 前言 在我们之前编写的所有代码&#xff0c;都只能用上一个核心。众所周知&#xff0c;现在大多数CPU都有多个核心&#xff0c;但此时&#xff0c;无论如法优化程序&#xff0c…