Java程序从编写到最终运行需要经历的过程

本文介绍了Java程序从源代码到可执行程序的全过程,包括编译阶段与运行阶段的关键步骤,以及如何配置环境变量以确保正确执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java程序从编写到最终运行需要经历的过程

编译阶段

  1. 注意:java程序员直接编写的java代码(普通文本)是无法执行被JVM识别的。java程序员编写的java代码这种普通文本必须经过一个编译,将这个“普通文本代码”变成“字节码”,JVM能识别“字节码”。java代码这种普通文本变成字节码的过程,被称为:编译

  2. java代码这种普通文本被称为:java源代码。(你编写的代码是源代码)源代码不能直接执行,需要先进行编译,生成源代码对于的“字节码”,JVM可以识别的是字节码。

  3. 编译阶段和运行阶段可以在不同的操作系统上完成吗?

    完全可以,因为Java是跨平台的,可以做到一次编译到处运行。

    在windows上编译

    编译之后生成了“字节码”

    把“字节码”放到linux上运行

  4. java源代码一旦编译之后,源代码可以删除吗?只留下字节码可以执行吗?

    完全可以执行,因为源代码不参与程序的执行过程。参与程序执行过程的是字节码。

    但是最好不要删除源代码。因为有可能执行结果不是你需要的。当执行结果不是你需要的时候,你可以重新打开源代码进行修改,然后重新编译生产新的字节码,再重新执行。这样会有新的执行效果。

  5. 放源代码的文件扩展名必须是:xxx**.java**

    编译生成的字节码文件扩展名是:xxx.class

    注:1个java源代码文件是可以编译生成多个class文件的。最终运行的是class文件。

  6. 问题:字节码文件是二进制文件吗?

    字节码文件不是二进制文件。如果是二进制的话,就不需要JVM了。因为操作系统可以直接执行二进制。

  7. 编译需要使用的命令是:

    C:\Users\llhnb>F:\JDK\bin\javac.exe

    打开DOS命令窗口,看看javac命令是否可用。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W7k8rGn9-1602506902976)(C:\Users\llhnb\Pictures\Saved Pictures`S]F89HPDP157XAHEAXG`GO.png)]

  8. 怎么查看编译器版本?

    C:\Users\llhnb>F:\JDK\bin\javac -version

    java 1.8.0_131

  9. 怎么查看编译器版本?

    C:\Users\llhnb>F:\JDK\bin\java -version
    java version “1.8.0_131”
    Java™ SE Runtime Environment (build 1.8.0_131-b11)
    Java HotSpot™ 64-Bit Server VM (build 25.131-b11, mixed mode)

  10. 配置环境变量path的步骤:

    此电脑–>属性–>高级系统设置–>环境变量

    **注意:**环境变量包括“系统变量”和“用户变量”

    ​ 系统变量:范围比较大,系统变量会让计算机所有用户都起作用。

    ​ 用户变量:范围比较小,这个变量只是作用于当前用户。

  11. path环境变量的作用是什么?

    给windows操作系统指路,告诉windows操作系统去哪里找这个命令文件。

    path环境变量中有很多很多的路径,路径和路径之间用半角分号分隔。

    path=A;B;C;D…

    path是环境变量的名字。

    A;B;C;D…是环境变量path的值。

    注:要学会融会贯通,当在DOS命令窗口中使用该软件的某个命令的时候,如果出现“命令找不出错误了”,这个时候希望大家能够想起来配置环境变量path。

  12. javac命令怎么用?

    语法格式:javac java源文件的路径

    什么是java源文件?

    java源文件的名字以“.java"结尾,该文件中写了java源代码。

    java源文件的路径是什么意思?

    注意:路径永远包括绝对路径和相对路径。

    神操作???

    把java源文件直接拖进DOS命令窗口,那DOS命令窗口就有这个路径了。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zrtU3Dpn-1602506902979)(C:\Users\llhnb\Pictures\Saved Pictures\2.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZO7fTTx3-1602506902980)(C:\Users\llhnb\Pictures\Saved Pictures\3.png)]

  13. JDK的bin目录下有:

    javac.exe 负责编译

    java.exe 负责运行

  14. 为什么ipconfig、ping等命令可以使用呢?为什么javac用不了?

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V8aBXhnG-1602506902982)(C:\Users\llhnb\Pictures\Saved Pictures\72D99DF466C5A4C667181EC0B36837C2.png)]

    我们发现windows操作系统中有这样一个环境变量,名字叫做:path,

    并且发现path变量的值是:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yrnKwteo-1602506902984)(C:\Users\llhnb\Pictures\Saved Pictures\1.png)]

    注意:改完环境变量之后,DOS窗口必须关闭重新打开才会起作用。

    将path环境变量中的:c:\windows\system32;删除之后再测试:

    C:\Users\Administrator>ifconfig

    'ifconfig’不是内部或外部命令,也不是可运行的程序或批处理文件。

运行阶段

  1. 前提:class文件(字节码)生成了,没有字节码文件程序是无法运行的。

    如果该文件的名字叫做:HelloWorld.class

    那么HelloWorld就是一个类名。

  2. 运行时需要用到的命令

    使用JDK的bin目录下的:java.exe命令来运行。

    语法格式:java 类名

    例:java HelloWorld

  3. 运行步骤:

    • 先使用cd命令切换到HelloWorld.class文件所在的路径
    • 执行java HelloWorld

​ 切记:java命令后面只要是跟路径,就一定不行。

​ java命令后面只能跟类名。

  1. ”java HelloWorld"的执行过程以及原理。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TZKJ6SqR-1602506902986)(C:\Users\llhnb\Pictures\Saved Pictures\4.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IQIE3qQG-1602506902987)(C:\Users\llhnb\Pictures\Saved Pictures\5.png)]

  2. classpath环境变量的作用是什么?

    是给类加载器指路的。

    在没有配置环境变量classpath的时候,默认从当前路径下加载。

    如果配置了环境变量classpath的话,就只能从指定的路径加载了。

<think>嗯,用户问的是程序代码从编写运行经历了哪些环节。首先,我需要回顾一下整个软件开发的流程,确保没有遗漏任何步骤。可能用户是刚开始学习编程,或者对底层过程感兴趣,所以需要解释得清晰易懂。 用户之前问过HTTP/1.1和HTTP/2的区别,所以可能有一定的技术背景,但这次的问题更基础,应该覆盖从编写代码到运行的全过程。需要分步骤说明,每个环节的关键点是什么。 首先想到的是编写代码,然后编译、链接、加载到内存、执行。但可能还要细分,比如预处理、编译、汇编、链接这些编译器的步骤。另外,不同语言的流程可能不同,比如解释型语言和编译型语言,但用户可能指的是像C/C++这样的编译型语言,或者需要一般性的回答。 需要考虑用户是否了解编译器、解释器、虚拟机等概念,可能需要简要说明。例如,解释型语言如Python和编译型语言如Java的流程差异。不过用户的问题可能更倾向于传统的编译执行过程,所以先按编译型语言来回答,再补充其他情况。 另外,要考虑程序在操作系统中的执行过程,比如进程创建、内存分配等。这些步骤可能对用户来说比较抽象,需要用简单的例子说明,比如打印“Hello World”的过程。 还需要注意术语的正确性,比如预处理、目标代码、可执行文件、链接库、动态链接、静态链接等,但要用中文解释清楚。同时,是否需要提及调试、测试环节?可能用户问的是技术上的环节,而不是开发流程,所以可能不需要。 总结下来,大致步骤应该是:编写源代码 → 预处理 → 编译 → 汇编 → 链接 → 加载到内存 → 执行。每个步骤需要简要说明做了什么,以及为什么需要这个步骤。 同时,可能需要用比喻来帮助理解,比如把编译过程比作翻译,链接比作组装零件等。还要注意不同操作系统和硬件的差异,比如可执行文件格式的不同,但保持回答的一般性。 最后,检查是否有遗漏的环节,比如优化、静态分析等,但用户可能只需要基础流程,所以保持简洁。可能需要提到解释型语言的解释执行和即时编译(JIT)作为补充,但重点还是在传统流程。</think>程序编写运行的完整过程涉及多个技术环节,不同编程语言的具体流程可能略有差异,但核心步骤大致相同。以下是详细的流程解析(以C/C++为例): --- ### **一、完整流程图** ```plaintext 编写源码 → 预处理 → 编译 → 汇编 → 链接 → 加载到内存 → CPU执行 ``` --- ### **二、关键环节详解** #### **1. 编写源代码** - **形式**:程序编写人类可读的文本文件(如`.c`、`.cpp`、`.py`)。 - **示例**: ```c #include <stdio.h> int main() { printf("Hello World!"); return 0; } ``` #### **2. 预处理(Preprocessing)** - **作用**:处理源码中的宏、头文件等指令。 - **操作**: - 展开`#include`引入的头文件内容。 - 替换`#define`定义的宏。 - 条件编译(`#ifdef`、`#endif`)。 - **生成文件**:`.i`(预处理后的文本文件)。 - **命令示例**: ```bash gcc -E hello.c -o hello.i # 生成预处理文件 ``` #### **3. 编译(Compilation)** - **作用**:将预处理后的代码**转换为汇编代码**。 - **核心过程**: - **词法分析**:拆分代码为单词(Token)。 - **语法分析**:构建抽象语法树(AST)。 - **语义分析**:检查类型、作用域等逻辑错误。 - **中间代码生成**:生成与机器无关的中间表示(如LLVM IR)。 - **优化**:删除冗余代码,提升效率。 - **生成文件**:`.s`(汇编语言文件)。 - **命令示例**: ```bash gcc -S hello.i -o hello.s # 生成汇编代码 ``` #### **4. 汇编(Assembly)** - **作用**:将汇编代码**转换为机器指令**(二进制目标文件)。 - **特点**: - 生成的目标文件包含机器码,但**地址未最终确定**。 - 依赖外部符号(如`printf`函数)尚未解析。 - **生成文件**:`.o`(Unix/Linux)或`.obj`(Windows)。 - **命令示例**: ```bash gcc -c hello.s -o hello.o # 生成目标文件 ``` #### **5. 链接(Linking)** - **作用**:合并多个目标文件与库文件,解析外部符号地址。 - **两类链接**: - **静态链接**:将库代码**直接复制**到最终执行文件(如`.a`文件)。 - 优点:运行时无需外部依赖。 - 缺点:文件体积大。 - **动态链接**:在运行时通过`.so`(Linux)或`.dll`(Windows)加载库。 - 优点:节省磁盘和内存空间。 - 缺点:需确保运行时库存在。 - **生成文件**:可执行文件(如`a.out`或`hello.exe`)。 - **命令示例**: ```bash gcc hello.o -o hello # 链接生成可执行文件 ``` #### **6. 加载到内存** - **操作流程**: 1. 操作系统创建进程,分配内存空间。 2. 将可执行文件代码段(`.text`)和数据段(`.data`、`.bss`)载入内存。 3. 初始化堆(Heap)和栈(Stack)空间。 - **关键地址**: - **程序计数器(PC)**:指向第一条指令地址。 - **全局变量**:存储在数据段。 #### **7. CPU执行** - **执行过程**: - CPU从内存中逐条读取机器指令并执行。 - 根据指令访问寄存器、内存或进行I/O操作。 - **示例**: - `printf("Hello World!")`最终通过系统调用(如`write`)输出到终端。 --- ### **三、不同编程语言的差异** | **语言类型** | **典型代表** | **关键区别** | |----------------|--------------|------------------------------------------| | **编译型语言** | C/C++、Go | 需完整经历预处理→编译→汇编→链接流程 | | **解释型语言** | Python、Ruby | 直接由解释器逐行翻译并执行,无目标文件生成 | | **虚拟机语言** | Java、C# | 先编译为中间字节码(如`.class`),再由JIT编译器或虚拟机执行 | --- ### **四、调试与优化的隐藏环节** 1. **符号表(Symbol Table)**: - 调试版本(Debug Build)会保留变量/函数名等元数据,用于调试器定位问题。 2. **剥离(Stripping)**: - 发布版本(Release Build)通常删除符号表以减小文件体积。 --- ### **五、从“Hello World”看完整过程** ```plaintext hello.c → 预处理 → hello.i → 编译 → hello.s → 汇编 → hello.o ↓ 系统库(如libc.a) → 链接 → hello(可执行文件) → 加载执行 → 输出结果 ``` --- **总结**:程序从代码到运行是层层转换的过程,核心目标是将人类可读的源码转化为CPU可执行的机器指令。理解这一流程有助于优化代码性能、调试复杂问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值