计算机基础篇-程序运行基础知识
程序诞生
机器语言(0 和 1)->汇编代码->高级语言
1、机器语言,又称机器码、原生码,电脑CPU可直接解读,因该语言与运行平台密切相关,故通用性很差;
2、汇编语言,是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在不同的设备中,汇编语言对应着不同的机器语言指令集, 运行时按照设备对应的机器码指令进行转换,所以汇编语言可移植性也较差;

3、高级语言,与前两种语言相比,该类语言高度抽象封装,语法结构更接近人类语言,逻辑也与人类思维逻辑相似,因此具有较高的可读性和编程效率。但是高级语言与汇编语言相比,因编译生成的辅助代码较多,使运行速度相对“较慢”。java,c,c++,C#,pascal,python,lisp,prolog,FoxPro,易语言等等 均属于高级语言。
编译型与解释型
通过IDE(Integrated Developmet Environment)可快速生成程序,根据程序的生成和运行过程,程序大致可分为两类:编译型程序和解释型程序。
编译型程序:程序在执行前编译成机器语言文件,运行时不需要重新翻译,直接供机器运行,该类程序执行效率高,依赖编译器,跨平台性差,如C、C++、Delphi等;
解释型程序:程序在用编程语言编写后,不需要编译,以文本方式存储原始代码,在运行时,通过对应的解释器解释成机器码后再运行,如Basic语言,执行时逐条读取解释每个语句,然后再执行。由此可见解释型语言每执行一句就要翻译一次,效率比较低,但是相比较编译型程序来说,优势在于跨平台性好。
编译型程序(C/C++为例)
以下是 C 语言生成可执行文件的过程

大致分为编译和链接两个过程.
解释型程序(比如 python)

Java首先将源代码通过编译器编译成.class类型文件(字节码),这是 JAVA 自定义的一种类型,只能由JAVA虚拟机(JVM)识别。程序运行时JVM从.class文件中读一行解释执行一行。另外JAVA为实现跨平台,不同操作系统对应不同的JVM。从这个过程来看JAVA程序前半部分经过了编译,而后半部分又经过解析才能运行,可以说是一种混合型程序,由于该类程序运行依赖虚拟机,一些地方称其为“虚拟机语言”
虚拟机语言(以 JAVA 为例):

各语言开发运行一图流

编译型程序完整流程图
编译型程序执行流程(以C/C++为例)═══════════════════════════════════════════════════════════════════┌─────────────────────────────────────────────────────────────┐│ 开发者编写源代码 ││ (开发阶段 - 离线) │└───────────────────────┬─────────────────────────────────────┘ ▼ ┌─────────────────┐ │ 源代码文件 │ │ (.c, .cpp等) │ └────────┬─────────┘ ▼ ┌─────────────────────────────┐ │ 编译器 (Compiler) │ │ (一次性编译过程) │ └─────────────┬───────────────┘ │ ┌───────────┴───────────┐ ▼ ▼ ┌─────────────┐ ┌─────────────┐ │ 预处理阶段 │ │ 词法分析 │ │ Preprocessor│ │ Lexical │ │ │ │ Analysis │ └──────┬──────┘ └──────┬──────┘ │ │ └───────────┬───────────┘ ▼ ┌─────────────┐ │ 语法分析 │ │ Syntax │ │ Analysis │ └──────┬──────┘ ▼ ┌─────────────┐ │ 语义分析 │ │ Semantic │ │ Analysis │ └──────┬──────┘ ▼ ┌─────────────┐ │ 中间代码生成 │ │ Intermediate│ │ Code Gen. │ └──────┬──────┘ ▼ ┌─────────────┐ │ 代码优化 │ │ Code │ │ Optimization│ └──────┬──────┘ ▼ ┌─────────────┐ │ 目标代码生成 │ │ Target Code │ │ Generation │ └──────┬──────┘ ▼ ┌─────────────┐ │ 汇编阶段 │ │ Assembler │ └──────┬──────┘ ▼ ┌─────────────┐ │ 链接阶段 │ │ Linker │ └──────┬──────┘ ▼ ┌─────────────────┐ │ 可执行文件 │ │ (.exe, .out等) │ └────────┬────────┘ │ ▼┌─────────────────────────────────────────────────────────────┐│ 运行阶段 (用户端) ││ (可反复执行,无需编译) │└───────────────────────┬─────────────────────────────────────┘ ▼ ┌─────────────────┐ │ 操作系统加载 │ │ Program Loader│ └────────┬────────┘ ▼ ┌─────────────────┐ │ 分配内存空间 │ │ Memory │ │ Allocation │ └────────┬────────┘ ▼ ┌─────────────────┐ │ 初始化运行时 │ │ Runtime Init. │ └────────┬────────┘ ▼ ┌─────────────────┐ │ 执行机器指令 │ │ CPU直接执行 │ │ (无需中间解释) │ └────────┬────────┘ ▼ ┌─────────────────┐ │ 程序输出结果 │ │ Program Output │ └─────────────────┘
解释型程序完整流程图
解释型程序执行流程(以Python为例)═══════════════════════════════════════════════════════════════════┌─────────────────────────────────────────────────────────────┐│ 开发者编写源代码 ││ (开发阶段) │└───────────────────────┬─────────────────────────────────────┘ ▼ ┌─────────────────┐ │ 源代码文件 │ │ (.py, .js等) │ └────────┬─────────┘ │ ▼┌─────────────────────────────────────────────────────────────┐│ 运行阶段 (用户端) ││ (每次执行都需解释) │└───────────────────────┬─────────────────────────────────────┘ ▼ ┌─────────────────┐ │ 解释器启动 │ │ Interpreter │ │ Startup │ └────────┬────────┘ ▼ ┌─────────────────┐ │ 读取源代码 │ │ Read Source │ │ File │ └────────┬─────────┘ ▼ ┌─────────────────────────────┐ │ 逐行/逐块解释执行循环 │ │ (Line-by-Line Execution) │ └─────────────┬───────────────┘ │ ┌───────────┴───────────┐ ▼ ▼ ┌─────────────┐ ┌─────────────┐ │ 词法分析 │ │ 执行当前行 │ │ Lexical │ │ Execute │ │ Analysis │←───────→│ Current Line│ └──────┬──────┘ └──────┬──────┘ │ │ ▼ │ ┌─────────────┐ │ │ 语法分析 │ │ │ Syntax │ │ │ Analysis │←──────────────┘ └──────┬──────┘ │ ▼ ┌─────────────┐ │ 生成中间表示 │ │ Intermediate│ │ Code/Object│ └──────┬──────┘ │ ▼ ┌─────────────┐ │ 执行中间代码 │ │ Execute │ │ Intermediate│ │ Code │ └──────┬──────┘ │ └────────────┐ ▼ ┌─────────────────┐ │ 是否有下一行? │ │ More Lines? │ └────────┬────────┘ Yes │ │ No ▼ ▼ ┌─────────────┐ ┌─────────────────┐ │ 读取下一行 │ │ 程序结束 │ │ Read Next │ │ Program End │ │ Line │ └─────────────────┘ └──────┬──────┘ │ ▼ 继续解释执行循环
混合型程序(编译+解释)流程图
混合型程序执行流程(以Java为例)═══════════════════════════════════════════════════════════════════┌─────────────────────────────────────────────────────────────┐│ 开发者编写源代码 │└───────────────────────┬─────────────────────────────────────┘ ▼ ┌─────────────────┐ │ Java源文件 │ │ (.java) │ └────────┬────────┘ ▼ ┌─────────────────────────────┐ │ javac编译器 │ │ (编译为字节码) │ └─────────────┬───────────────┘ │ ┌───────────┴───────────┐ ▼ ▼ ┌─────────────┐ ┌─────────────┐ │ 词法/语法分析│ │ 语义分析 │ │ Lexical/ │ │ Semantic │ │ Syntax │ │ Analysis │ │ Analysis │ └──────┬──────┘ └──────┬──────┘ │ │ ▼ └───────────┬──────────────┐ ▼ │ ┌─────────────┐ │ │ 生成字节码 │ │ │ Bytecode │ │ │ Generation │ │ └──────┬──────┘ │ ▼ │ ┌─────────────┐ │ │ .class文件 │ │ │ (字节码) │ │ └──────┬──────┘ │ │ │ ▼ │┌─────────────────────────────────────────────────────────────┐│ 运行阶段 (JVM) │└───────────────────────┬─────────────────────────────────────┘ ▼ ┌─────────────────┐ │ JVM加载类 │ │ Class Loading │ └────────┬────────┘ ▼ ┌─────────────────┐ │ 字节码验证 │ │ Bytecode │ │ Verification │ └────────┬────────┘ ▼ ┌─────────────────┐ │ 解释器执行 │ │ Interpreter │ │ Execution │ └────────┬────────┘ ▼ ┌─────────────────┐ │ JIT编译器 │ │ (运行时优化) │ ├─────────────────┤ │ • 热点代码检测 │ │ • 编译为机器码 │ │ • 缓存优化代码 │ └────────┬────────┘ ▼ ┌─────────────────┐ │ 执行机器码 │ │ Execute Native │ │ Code │ └────────┬────────┘ ▼ ┌─────────────────┐ │ 程序输出 │ │ Program Output │ └─────────────────┘
现代语言混合执行模型
现代语言执行技术演进═══════════════════════════════════════════════════════════════════第一代:纯解释型┌─────┐ 解释器 ┌─────┐│源码 │───────────▶│结果 │└─────┘ 逐行解释 └─────┘典型:早期BASIC、Shell脚本第二代:纯编译型┌─────┐ 编译器 ┌─────┐ CPU ┌─────┐│源码 │───────────▶│可执行│──────────▶│结果 │└─────┘ └─────┘ 执行 └─────┘典型:C、C++、Fortran第三代:字节码+解释┌─────┐ 编译器 ┌─────┐ 解释器 ┌─────┐│源码 │───────────▶│字节码│───────────▶│结果 │└─────┘ └─────┘ 解释执行 └─────┘典型:Java、.NET(初始执行)第四代:字节码+JIT┌─────┐ 编译器 ┌─────┐ 解释器/JIT ┌─────┐│源码 │───────────▶│字节码│────────────▶│结果 │└─────┘ └─────┘ 动态编译 └─────┘典型:Java(HotSpot)、JavaScript(V8)、Python(PyPy)第五代:AOT编译┌─────┐ AOT编译 ┌─────┐ CPU ┌─────┐│源码 │───────────▶│可执行│──────────▶│结果 │└─────┘ 预编译为 └─────┘ 执行 └─────┘ 机器码典型:Java(GraalVM Native)、JavaScript(WebAssembly)
以上内容是对程序运行的简单描述,面向零基础,详细的内容可以等我的逆向分析篇.


评论