首页 > 编程语言 >一文掌握:java编译器:跑通helloworld并了解核心原理

一文掌握:java编译器:跑通helloworld并了解核心原理

时间:2024-11-15 16:51:25浏览次数:3  
标签:Java JDK AST 跑通 HelloWorld 编译器 java

本文旨在详细介绍Java编译器的工作原理及其在Windows系统下的具体使用方法,包括安装步骤、常用命令介绍以及大致原理。

通过本文,你可以全面掌握从编写代码到生成可执行文件的全过程,为Java开发奠定坚实的基础。

Windows下Java环境的搭建与程序编译

为了在Windows环境下运行Java的HelloWorld程序,你需要完成以下几个步骤:安装JDK(Java Development Kit)、配置环境变量、编写Java代码以及编译和运行你的程序。下面是详细的步骤指南:

1. 下载并安装JDK

首先,访问Oracle官方网站或者OpenJDK网站来下载适合你系统的JDK版本。这里推荐使用最新稳定版的JDK。

  • 根据你的系统选择合适的JDK安装包进行下载。
  • 下载完成后,双击下载文件开始安装过程。你可以接受默认设置,也可以根据需要自定义安装路径等选项。

2. 配置环境变量

安装完JDK之后,下一步是配置环境变量,这样可以在任何位置通过命令行调用Java工具。

  • 右键点击“此电脑”或“我的电脑”,然后选择“属性”。
  • 在打开的新窗口中找到“高级系统设置”并点击进入。
  • 在系统属性窗口里点击“环境变量”按钮。
  • 在环境变量界面中,有两个部分:“用户变量”和“系统变量”。通常建议修改“系统变量”以对所有用户生效。
  • 找到名为Path的系统变量,并选择编辑。如果没有现成的Path变量,则可以新建一个。
  • Path变量值的末尾添加一个新的路径条目,指向JDK安装目录下的bin文件夹。例如,如果你的JDK安装到了C:\Program Files\Java\jdk-17,那么应该添加的路径为C:\Program Files\Java\jdk-17\bin
  • 确保每个路径之间用分号;隔开。
  • 完成后点击确定保存更改,并关闭所有打开的窗口。

3. 验证安装

打开命令提示符(CMD),输入以下命令检查是否正确设置了Java环境:

java -version

如果显示了正确的Java版本信息,则表示配置成功。

4. 创建第一个Java程序

现在我们可以创建我们的第一个Java程序了。这个程序将打印出"Hello, World!"。

  • 使用文本编辑器如Notepad++创建一个新的文本文件。
  • 输入以下代码:
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}
  • 将文件保存为HelloWorld.java。注意确保扩展名是.java而不是.txt或其他。

5. 用编译器编译和运行Java程序

最后一步是编译刚刚创建的Java源码文件并运行它。

  • 打开CMD,切换到包含HelloWorld.java文件的目录。
  • 输入下面的命令来编译Java程序:
javac HelloWorld.java
  • 如果一切正常,这会在当前目录下生成一个名为HelloWorld.class的文件。
  • 接着输入以下命令来执行该程序:
java HelloWorld

你应该能看到控制台输出 Hello, World! 的消息。至此,你就成功地在Windows上设置好了Java开发环境,并运行了你的第一个Java应用程序。

Java编译器核心机制解析

  1. 词法分析:此步骤是将Java源代码文件分解成一系列的标记(tokens),这些标记代表了语言的基本构成元素,比如关键字、标识符、运算符等。
    1. 输入是:.java文件中的源代码文本,输出是一系列token。例如,对于int a = 10;
    2. 输出是这行代码,词法分析器会将其分解为[INT, IDENTIFIER:a, ASSIGN, INTEGER_LITERAL:10, SEMICOLON]这样的形式。
  1. 语法分析:接下来,编译器根据语法规则将上一步得到的token流组织成抽象语法树(AST)。这一步骤确保了代码结构符合Java语言规范。
    1. 输入是:词法分析阶段产生的token序列,而输出是一个表示程序逻辑结构的AST。以一个简单的表达式为例,如a + b * c
    2. 输出是:经过语法分析后会形成一个以加号操作作为根节点。
    3. 例如:左右子节点分别为变量a和乘法表达式的树形结构。
  1. 语义分析:在此阶段,编译器对AST进行检查,确保它不仅在语法上正确而且在意义上也是合理的。这包括类型检查、符号表构建等工作。
    1. 输入是:从语法分析阶段获得的AST,输出通常是更新后的AST以及一些附加信息,比如错误报告或警告。
    2. 输出是:警告信息或错误信息,如有。
    3. 例如:假设有一个函数调用print(x),如果x之前没有被定义过,则语义分析将会发现这一问题并抛出相应的错误信息。
  1. 中间代码生成:一旦通过了语义分析,下一步就是将优化过的AST转换成一种更加接近机器语言但仍然保持平台无关性的中间表示形式。这种中间代码通常被称为字节码(Bytecode),对于Java来说即为.class文件格式。
    1. 输入是:经由语义分析验证无误后的AST(抽象语法树)
    2. 输出是:包含可执行指令序列的目标文件。
    3. 例如:上述int a = 10;最终会被转化为类似ldc #2 // int 10这样的一条或多条JVM指令。
  1. 代码优化:虽然不是所有版本的javac都会执行这个步骤,但在某些情况下,编译器会对生成的中间代码实施进一步的优化措施,以提高程序运行效率或减小.class文件大小。这些优化可能涉及死代码消除、常量折叠等技术。
    1. 输入是:初步生成的中间代码
    2. 输出是:经过优化处理后的更高效版本。
    3. 例:如果检测到某段代码永远不会被执行,则可以直接从结果中移除这部分内容而不影响程序功能。
  2. 目标文件生成:最后一步是将优化后的中间代码写入磁盘上的.class文件中。
    1. 输入是:已经完全准备好的、可用于分发或直接运行的二进制数据流。
    2. 输出是:实际存在于文件系统中的类文件。
    3. 例:每个类都对应一个单独的.class文件,在该文件中包含了关于如何加载及初始化该类的所有必要信息。

标签:Java,JDK,AST,跑通,HelloWorld,编译器,java
From: https://blog.csdn.net/whisperzzza/article/details/143737764

相关文章

  • 【JavaScript】LeetCode:96-100
    文章目录96单词拆分97最长递增子序列98乘积最大子数组99分割等和子集100最长有效括号96单词拆分动态规划完全背包:背包-字符串s,物品-wordDict中的单词,可使用多次。问题转换:s能否被wordDict中的单词组成。dp[i]:长度为i的字符串s[0,i]能否被wordDict组成,dp[i]=......
  • 基于Java+SpringBoot的校园资产管理
    关注底部领取源码源码编号:S324源码名称:基于SpringBoot的校园资产管理用户类型:双角色,用户、管理员主要技术:Java、Vue、ElementUl、SpringBoot运行环境:Windows/Mac、JDK1.8及以上运行工具:IDEA/Eclipse数 据 库:MySQL5.7及以上版本数据库表数量:11张表是否有毕业论文......
  • 【JavaScript】LeetCode:91-95
    文章目录91不同路径92最小路径和93最长回文子串94最长公共子序列95编辑距离91不同路径动态规划dp[i][j]:从[0,0]到[i,j]的路径条数。dp[i][j]=从[0,0]到[i,j]上面一格的路径条数+从[0,0]到[i,j]左边一格的路径条数。初始化:因为第一行的格子只能由左......
  • 基于Java+SpringBoot的人事管理系统
    关注底部领取源码源码编号:S323源码名称:基于SpringBoot的人事管理系统用户类型:双角色,员工、管理员主要技术:Java、Vue、ElementUl、SpringBoot运行环境:Windows/Mac、JDK1.8及以上运行工具:IDEA/Eclipse数 据 库:MySQL5.7及以上版本数据库表数量:13张表是否有毕业论文......
  • 基于Java+SpringBoot的老年一站式服务平台
    关注底部领取源码源码编号:S322源码名称:基于SpringBoot的老年一站式服务平台用户类型:多角色,用户、商家、员工、管理员主要技术:Java、Vue、ElementUl、SpringBoot运行环境:Windows/Mac、JDK1.8及以上运行工具:IDEA/Eclipse数 据 库:MySQL5.7及以上版本数据库表数量:18......
  • Java常见修饰符
    目录一. 访问修饰符1.public(公共的)2. private(私有的)3. protected(受保护的)4. 默认(也称为包访问权限,没有修饰符)二. 非访问修饰符1.static(静态的)2. final(最终的)3.abstract(抽象的)4. synchronized(同步的)5. volatile(易变的)一. 访问修饰符1.public(公共的......
  • java工具类,把list转为map
    List和Map是Java集合框架中常用的数据结构,分别用于存储有序的元素列表和键值对。在某些场景下,我们需要将List转换为Map,以便更高效地访问和操作数据。本文将探讨几种常用的List转Map的方式,并对它们的特点进行分析比较。大体来说,List转Map的方式可以分为以下几种:使用for循环遍历、J......
  • 《Java核心技术 卷I》用户图形界面鼠标事件
    鼠标事件        如果只希望用户能够点击按钮或菜单,那么就不需要显式地处理鼠标事件,鼠标操作将由用户界面中的各种组件内部处理,不过,如果希望用户能使用鼠标画图,就需要捕获鼠标移动,点击和拖动事件。本节,我们将展示一个简单的图形编辑器应用,它允许用户在画布上放置、移......
  • 《Java核心技术 卷I》图形界面事件处理适配器类
    适配器类并不是所有的事件处理都像按钮点击那样简单,假设你想监视用户何时想要关闭主窗体,可能希望弹出一个对话框,只有在用户确认之后才退出程序。当程序试图关闭一个窗口时,JFrame对象就是WindowEvent的事件源,如果希望捕获这个事件,就必须有一个合适的监听器对象,并将它添加到窗体......
  • 如何用Java爬虫精准获取商品历史价格信息
    在数字化时代,商品价格信息的获取变得尤为重要。对于消费者来说,了解商品的历史价格趋势可以帮助他们做出更明智的购买决策。而对于商家来说,掌握价格数据则有助于制定更有效的销售策略。本文将详细介绍如何使用Java编写爬虫程序,精准获取商品的历史价格信息以及API数据。Java爬虫......