当前位置: 首页 > news >正文

JVM专题二:Java如何进行编译的

编程语言分类

       通常我们将编程语言分为高级语言低级语言,通常高级语言因为其易用性和可移植性而被广泛使用,而低级语言在需要对硬件进行精细控制时非常有用,例如在嵌入式系统编程或操作系统开发中。

        高级语言更接近人类语言,易于阅读和编写,它们提供了抽象层,使得程序员可以不必关注底层硬件细节。Java、C、Python等都是高级语言的例子,它们允许开发者使用高级的语法和结构来编写程序,然后通过编译器或解释器将这些代码转换成机器可以执行的指令。

        低级语言,如机器语言和汇编语言,更接近于计算机硬件。机器语言由一系列二进制代码组成,是计算机可以直接执行的指令。汇编语言是一种低级语言,它使用助记符来表示机器指令,比机器语言更易于人类理解和编写,但仍然需要通过汇编器转换成机器语言。

当然,让我们通过一些简单的例子来展示高级语言和低级语言之间的差异:

假设我们要编写一个程序,计算两个数的和。在Python这样的高级语言中,代码可能如下所示

高级语言的例子(Java)

public class Main {public static void main(String[] args) {int a = 3;int b = 5;int result = addNumbers(a, b);System.out.println("结果是: " + result);}public static int addNumbers(int a, int b) {return a + b;}
}

这段代码非常直观,几乎不用解释就可以看出它的功能。

低级语言的例子(汇编语言)

如果我们使用汇编语言来完成同样的任务,代码可能会复杂得多,并且依赖于特定的处理器架构。以下是一个在x86架构上使用汇编语言计算两个数和的示例:

; 低级语言(汇编语言)示例
section .dataa dd 3       ; 定义变量a并初始化为3b dd 5       ; 定义变量b并初始化为5result dd 0  ; 定义结果变量并初始化为0section .textglobal _start_start:mov eax, [a] ; 将变量a的值移动到寄存器eaxadd eax, [b] ; 将变量b的值加到eaxmov [result], eax ; 将结果存储回变量result; 这里通常会有退出程序的代码,但为了简化,我们省略了这部分

机器语言的例子(X86架构)

如果我们使用汇编语言来完成同样的任务,代码可能会复杂得多,并且依赖于特定的处理器架构。以下是一个在x86架构上使用汇编语言计算两个数和的示例:

00000001 00000011  LOAD R0, 3  ; 加载数字3到寄存器0
00000010 00000001  LOAD R1, 5  ; 加载数字5到寄存器1
00000011 00000001  ADD R1, R0  ; 将寄存器0的值加到寄存器1
11111111 11111111  HALT        ; 停止程序

在这个示例中,我们使用了一些假设的指令:

  • LOAD 指令将一个立即数加载到寄存器中。(这个指令稍微关注下,后续记录多线程介绍内存屏障会再次提到)
  • ADD 指令将两个寄存器的值相加。
  • HALT 指令停止程序执行。

注意:这个示例是非常简化的,实际的机器语言指令集要复杂得多,并且每个CPU架构都有自己独特的指令集。在实际编程中,我们几乎不会直接编写机器语言代码,因为这是低效且容易出错的。相反,我们使用高级语言编写代码,然后由编译器或汇编器转换成机器语言。

通过上述的示例代码,可以知道高级语言与低级语言之间的转换确实不是简单的一对一映射。高级语言的抽象层级使得程序员可以不必关心底层硬件的具体实现细节,而编译器则负责将这些高级语言编写的代码转换成计算机能够理解的机器指令。

编译过程

编译过程通常包括以下几个步骤:

  1. 预处理:处理源代码中的预处理指令。
  2. 词法分析:将源代码分解成一系列的词素(tokens)。
  3. 语法分析:构建语法树,检查代码的语法结构。
  4. 语义分析:检查代码的语义正确性。
  5. 优化:对代码进行优化,提高执行效率。
  6. 代码生成:将优化后的代码转换成目标代码,通常是机器指令。

编译器与汇编器

  • 编译器:如javac,是将高级语言代码转换成机器指令的程序。编译器处理的是高级语言的抽象概念,如变量、控制流、函数等,并将它们转换成可以在特定平台(JVM)上执行的机器代码。
  • 汇编器:将汇编语言代码转换成机器语言。汇编器的工作相对简单,因为它处理的是接近机器指令的助记符。
  • JVM提供特定的平台,可以将.class文件编译成机器预言,通常将JVM称之为后端编译

高级语言的优点

使用高级语言编程的优点包括:

  • 易用性:高级语言更接近自然语言,易于学习和使用。
  • 可读性:代码结构清晰,易于阅读和理解。
  • 可维护性:由于代码的清晰结构,维护和修改代码变得更加容易。
  • 跨平台性:高级语言编写的程序通常可以在不同的硬件和操作系统上运行,只需重新编译即可。
  • 安全性:高级语言提供了更多的安全特性,如类型检查、内存管理等,减少了运行时错误。

高级语言的缺点

尽管高级语言有许多优点,但也存在一些缺点:

  • 编译时间:编译过程可能需要一些时间,特别是对于大型项目。
  • 性能开销:高级语言编写的程序可能在性能上不如直接用低级语言编写的程序,因为高级语言的抽象层级可能会引入一些运行时开销。
  • 依赖编译器:程序的行为在一定程度上依赖于编译器的实现。

相关文章:

JVM专题二:Java如何进行编译的

编程语言分类 通常我们将编程语言分为高级语言和低级语言,通常高级语言因为其易用性和可移植性而被广泛使用,而低级语言在需要对硬件进行精细控制时非常有用,例如在嵌入式系统编程或操作系统开发中。 高级语言更接近人类语言,易于…...

道路元素位置和方向的坐标系统: 点 线 面 连接点

道路元素位置和方向的坐标系统: 下图道路元素在地球坐标系中的位置,该位置由三个坐标轴(x, y, z)组成的笛卡尔坐标系来确定。这种描述特别适用于三维建模和地理信息系统(GIS)中,其中道路被视为一个三维模型…...

二、Docker常用命令

一、帮助启动类命令 1、启动docker [rootlocalhost ~]# systemctl start docker 2、停止docker [rootlocalhost ~]# systemctl stop docker 3、重启docker [rootlocalhost ~]# systemctl stop docker 4、查看docker状态 [rootlocalhost ~]# systemctl status docker 5、开机自…...

通过docker启动Jenkins容器报错

项目场景: 通过docker启动Jenkins容器 问题描述 Jenkins容器启动失败,通过sudo docker logs -f jenkins命令 查看日志如下: touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied Can not write to /var…...

webui automatic1111上可以跑stable diffusion 3的方法

stable diffusion 3 可以简单句子生成高质量图形,可以生成准确的文字,甚至可以支持中文。 stable diffusion 3 最初只支持API调用,最后把模型也完全开放了。Comfyui因为天生架构优势,第一时间跑起来了。既支持远程API模型调用&am…...

基于顺序表基础实现通讯录项目

基于顺序表基础实现通讯录项目 前言通讯录的实现 前言 Hello,亲爱的CSDN的小伙伴们,你们好!基于上一篇博客的基础上,今天我来带领大家实现通讯录项目,上一篇博客在这里哦!顺序表的实现 通讯录的实现 顺序表的实现在…...

加班的员工,循环的电池

宁德时代回应"896" 6月17日,宁德时代因内部宣告「实行 895 工作制,大干 100 天,外籍人员不强制」冲上热搜,虽后来辟谣 只是发出号召,并无强制员工实行"895"工作制,但舆论并无消退。 昨…...

windows安装Nacos并使用

Nacos(前身为阿里巴巴的Nacos Config和Nacos Discovery)是一个开源的动态服务发现、配置和服务管理平台,由阿里巴巴开发并维护。它提供了一种简单且易于使用的方式来管理微服务架构中的服务注册、发现和配置管理。 主要功能包括:…...

准备篇(三)网页相关知识

Java script小脚本 - 爬取 bilibili 表情Java script 小脚本 - 爬取 bilibili 表情 随便点开一个视频,注意这个页面 URL 对应的 HTML 代码中没有表情的代码, 需要先点一下评论区,然后再在这个页面 URL 对应的元素中找到表情所在的源码。(但是我不知道这个带表情 <pic…...

基于SSM的医药垃圾分类管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SSM的医药垃圾分类管理系统,java项目…...

web 应用防火墙的作用是什么

产品定义 Web应用防火墙&#xff08;原生版&#xff09;&#xff08;CT-WAF&#xff0c;Web Application Firewall&#xff0c;简称WAF&#xff09;为用户Web应用提供一站式安全防护&#xff0c;对Web业务流量进行智能全方位检测&#xff0c;有效识别恶意请求特征并防御&#…...

搜索框回车刷新表格(解决搜索框回车刷新页面问题)

问题&#xff1a;解决搜索框回车刷新页面问题 在 Vue 中&#xff0c;keyup.enter.native 用于监听键盘的回车事件并调用 handleQuery 方法。如果页面在按下回车键后整个刷新&#xff0c;这通常不是 Vue 组件内部行为导致的&#xff0c;而是可能由于以下原因&#xff1a; 表单默…...

洞察用户需求,Xinstall数据统计App让你的App运营如虎添翼

在互联网时代&#xff0c;App推广和运营面临着前所未有的挑战。流量红利逐渐衰退&#xff0c;用户获取成本不断攀升&#xff0c;如何确保在多变的互联网环境下&#xff0c;迅速搭建起能时刻满足用户需求的运营体系&#xff0c;成为众多企业急待解决的问题。今天&#xff0c;我们…...

如何正确的报考志愿

高考&#xff0c;作为中国学子人生中的一次重要考验&#xff0c;不仅关系到学生的未来发展方向&#xff0c;也关系到家庭和社会的期待。在高考分数受限的条件下&#xff0c;选择一个心仪的专业还是选择一个知名度更高的学校&#xff0c;成为了许多考生和家长面临的难题。本文将…...

go的reflect实战

架构设计&#xff0c;有处设计&#xff0c;需要将string类型转为instance的实际类型&#xff0c;不更改业务代码的前提下&#xff0c;修改接口数据 因为涉及到unmarshal&#xff0c;因此要先判断instance中的存储的值是否已经是一个指针 如果不是&#xff0c;则需要包装为一个指…...

【学习】常用的分类网络

1. LeNet 提出时间&#xff1a;1998年最新版本&#xff1a;原始版本使用的数据集格式&#xff1a;MNIST&#xff08;28x28灰度图像&#xff09;优点&#xff1a; 结构简单&#xff0c;易于理解和实现。对于小规模图像数据集&#xff08;如MNIST&#xff09;有很好的表现。缺点…...

3. 向索引库中导入数据

1. 准备数据库对象 import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstr…...

java-冒泡排序 2

### 9. 冒泡排序的变种冒泡排序有许多变种&#xff0c;例如鸡尾酒排序&#xff08;Cocktail Shaker Sort&#xff09;&#xff0c;它是冒泡排序的双向版本。鸡尾酒排序在每次遍历时&#xff0c;先从左到右&#xff0c;再从右到左&#xff0c;双向 地“冒泡”&#xff0c;使得排…...

记一次面试

Linux查日志&#xff0c;怎么把最后1000行写到另一个文件中 在Linux中&#xff0c;如果你想要查看日志文件的最后1000行并将其写入到另一个文件中&#xff0c;你可以使用tail命令。tail命令默认用于输出文件的最后几行。 以下是如何使用tail命令将日志文件的最后1000行写入到另…...

Linux提升篇-正则表达式

文章目录 前言一、基本正则表达式基本正则表达式&#xff08;BRE&#xff09;集合 二、扩展正则表达式扩展正则表达式&#xff08;ERE&#xff09;集合 总结 前言 今天要分享的内容是正则表达式&#xff0c;完美掌握正则表达式&#xff0c;才能更好地使用"三剑客"来…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…...

Linux 下 DMA 内存映射浅析

序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存&#xff0c;但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程&#xff0c;可以参考这篇文章&#xff0c;我觉得写的非常…...

C++--string的模拟实现

一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现&#xff0c;其目的是加强对string的底层了解&#xff0c;以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量&#xff0c;…...

数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)

目录 &#x1f50d; 若用递归计算每一项&#xff0c;会发生什么&#xff1f; Horners Rule&#xff08;霍纳法则&#xff09; 第一步&#xff1a;我们从最原始的泰勒公式出发 第二步&#xff1a;从形式上重新观察展开式 &#x1f31f; 第三步&#xff1a;引出霍纳法则&…...

小智AI+MCP

什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析&#xff1a;AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github&#xff1a;https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...