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架构都有自己独特的指令集。在实际编程中,我们几乎不会直接编写机器语言代码,因为这是低效且容易出错的。相反,我们使用高级语言编写代码,然后由编译器或汇编器转换成机器语言。
通过上述的示例代码,可以知道高级语言与低级语言之间的转换确实不是简单的一对一映射。高级语言的抽象层级使得程序员可以不必关心底层硬件的具体实现细节,而编译器则负责将这些高级语言编写的代码转换成计算机能够理解的机器指令。
编译过程
编译过程通常包括以下几个步骤:
- 预处理:处理源代码中的预处理指令。
- 词法分析:将源代码分解成一系列的词素(tokens)。
- 语法分析:构建语法树,检查代码的语法结构。
- 语义分析:检查代码的语义正确性。
- 优化:对代码进行优化,提高执行效率。
- 代码生成:将优化后的代码转换成目标代码,通常是机器指令。
编译器与汇编器
- 编译器:如
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应用防火墙(原生版)(CT-WAF,Web Application Firewall,简称WAF)为用户Web应用提供一站式安全防护,对Web业务流量进行智能全方位检测,有效识别恶意请求特征并防御&#…...
搜索框回车刷新表格(解决搜索框回车刷新页面问题)
问题:解决搜索框回车刷新页面问题 在 Vue 中,keyup.enter.native 用于监听键盘的回车事件并调用 handleQuery 方法。如果页面在按下回车键后整个刷新,这通常不是 Vue 组件内部行为导致的,而是可能由于以下原因: 表单默…...

洞察用户需求,Xinstall数据统计App让你的App运营如虎添翼
在互联网时代,App推广和运营面临着前所未有的挑战。流量红利逐渐衰退,用户获取成本不断攀升,如何确保在多变的互联网环境下,迅速搭建起能时刻满足用户需求的运营体系,成为众多企业急待解决的问题。今天,我们…...
如何正确的报考志愿
高考,作为中国学子人生中的一次重要考验,不仅关系到学生的未来发展方向,也关系到家庭和社会的期待。在高考分数受限的条件下,选择一个心仪的专业还是选择一个知名度更高的学校,成为了许多考生和家长面临的难题。本文将…...
go的reflect实战
架构设计,有处设计,需要将string类型转为instance的实际类型,不更改业务代码的前提下,修改接口数据 因为涉及到unmarshal,因此要先判断instance中的存储的值是否已经是一个指针 如果不是,则需要包装为一个指…...
【学习】常用的分类网络
1. LeNet 提出时间:1998年最新版本:原始版本使用的数据集格式:MNIST(28x28灰度图像)优点: 结构简单,易于理解和实现。对于小规模图像数据集(如MNIST)有很好的表现。缺点…...

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. 冒泡排序的变种冒泡排序有许多变种,例如鸡尾酒排序(Cocktail Shaker Sort),它是冒泡排序的双向版本。鸡尾酒排序在每次遍历时,先从左到右,再从右到左,双向 地“冒泡”,使得排…...
记一次面试
Linux查日志,怎么把最后1000行写到另一个文件中 在Linux中,如果你想要查看日志文件的最后1000行并将其写入到另一个文件中,你可以使用tail命令。tail命令默认用于输出文件的最后几行。 以下是如何使用tail命令将日志文件的最后1000行写入到另…...
Linux提升篇-正则表达式
文章目录 前言一、基本正则表达式基本正则表达式(BRE)集合 二、扩展正则表达式扩展正则表达式(ERE)集合 总结 前言 今天要分享的内容是正则表达式,完美掌握正则表达式,才能更好地使用"三剑客"来…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...