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)集合 总结 前言 今天要分享的内容是正则表达式,完美掌握正则表达式,才能更好地使用"三剑客"来…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
