当前位置: 首页 > 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;才能更好地使用"三剑客"来…...

Nacos 2.2.0连接达梦数据库踩坑实录:从驱动版本到SQL脚本的完整避坑指南

Nacos 2.2.0与达梦数据库深度适配实战&#xff1a;从驱动选型到容器化部署的全链路解析 当微服务架构遇上国产数据库&#xff0c;技术适配的每个环节都可能成为关键战场。最近在将Nacos 2.2.0与达梦数据库进行生产级适配时&#xff0c;我经历了从驱动版本冲突到SQL脚本优化的完…...

HFSS19 实战解析:SMA接头馈电的微带分支滤波器仿真

1. SMA接头与微带分支滤波器设计基础 作为一名射频工程师&#xff0c;设计紧凑型滤波器是日常工作的重要部分。这次我们要用HFSS19仿真一个SMA接头馈电的微带分支带通滤波器。先说说为什么选择这个组合&#xff1a;SMA接头是射频电路中最常见的连接器之一&#xff0c;工作频率可…...

别再死记公式了!用Python的SymPy库5分钟搞定雅可比矩阵计算(附机器人学实例)

用SymPy解放双手&#xff1a;5分钟完成雅可比矩阵的符号计算与机器人学应用 记得研究生时期推导机械臂动力学方程&#xff0c;我曾在草稿纸上密密麻麻写满三页偏导数&#xff0c;最后发现一个正负号错误导致全部重算。直到遇见SymPy——这个Python符号计算库彻底改变了我的工作…...

SRS服务器从编译到实战:Ubuntu环境下的RTMP/WebRTC全协议测试

SRS服务器从编译到实战&#xff1a;Ubuntu环境下的RTMP/WebRTC全协议测试 在流媒体技术快速发展的今天&#xff0c;构建一个高效、稳定的视频服务器成为许多开发者和企业的核心需求。SRS(Simple Realtime Server)作为一款开源的实时视频服务器&#xff0c;凭借其对多种流媒体协…...

Windows主题自由革命:SecureUxTheme安全启动兼容的内存补丁终极指南

Windows主题自由革命&#xff1a;SecureUxTheme安全启动兼容的内存补丁终极指南 【免费下载链接】SecureUxTheme &#x1f3a8; A secure boot compatible in-memory UxTheme patcher 项目地址: https://gitcode.com/gh_mirrors/se/SecureUxTheme 厌倦了Windows千篇一律…...

Win10 22H2多合一版本实测:家庭版/专业版/企业版到底有什么区别?

Win10 22H2多合一版本深度解析&#xff1a;如何根据需求选择最佳系统版本 当你面对一个包含家庭版、专业版、企业版等多个版本的Win10 22H2多合一ISO镜像时&#xff0c;是否曾感到困惑&#xff1a;这些版本之间究竟有什么区别&#xff1f;哪个版本最适合我的使用场景&#xff1…...

RSA1 - Writeup by AI

RSA1 - Writeup by AI 1. 题目描述项目内容题目来源Bugku题目类型Crypto (密码学)考点RSA 大数分解、私钥计算题目信息 题目给出了 RSA 加密的三个参数&#xff1a; e 65537 N 1018261336751023520497560395829454421245429586704872293236600679847605951423419167478189648…...

TestNet资产管理平台:从安装到实战,全面超越灯塔的解决方案

1. TestNet资产管理平台&#xff1a;为什么你需要它&#xff1f; 如果你是一名网络安全工程师或者渗透测试人员&#xff0c;肯定对资产管理的繁琐深有体会。传统的资产管理工具要么功能单一&#xff0c;要么操作复杂&#xff0c;而TestNet资产管理系统的出现&#xff0c;彻底改…...

音乐播放器界面定制指南:foobar2000美化方案与体验提升

音乐播放器界面定制指南&#xff1a;foobar2000美化方案与体验提升 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn 在数字音乐时代&#xff0c;播放器已不仅是播放工具&#xff0c;更是个人音乐品味的…...

猫抓插件:5分钟掌握浏览器视频下载终极指南

猫抓插件&#xff1a;5分钟掌握浏览器视频下载终极指南 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾经遇到过想要保存网页视频却找不到下载按钮的烦恼&#xff1f;或者想收藏在线音乐却只…...