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称之为后端编译

高级语言的优点

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

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

高级语言的缺点

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/30727.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

现实网络中排障经验

将某工作站连接到交换机上的几个端口后,无法Ping通局域网内其它电脑,但桌面上“本地连接”图标仍然显示网络连通。后来经过排查,发现由于各种交换机配置都不一样,在配置交换机时,会很容易出现配置错误。所以建议&#…

awtk踩坑记录三:移植awtk-mvvm到Awtk Designer项目

从github下载并编译awtk, awtk-mmvm awtk: https://github.com/zlgopen/awtk/tree/master awtk-mvvm: https://github.com/zlgopen/awtk-mvvm 用awtk-designer新建项目并打开项目目录 首先修改project.json,使其awtk和awtk-mvvm指向上个步骤下载的路径&#xff0c…

【APP_汽修宝】数据采集案例APP_数据解密分析

如果不会写代码,那就出书、写博客、做视频、录播客。 📚 S35赛季末王者昭君罗 关键代码定位 使用方法【逆向-快速定位关键代码】通过hook常用函数HashMap方法 动态分析 下面是我们通过访问目标页面时 Frida hook 捕获HashMap的调…

Linux下手动修改服务器时间(没网环境下)

在客户服务器上更新程序时,发现服务器时间不对,现在应该是下午13:44:00,但服务器却显示为:21:40:53,所有是不对的。 date解决办法: 1、由于服务器是没有网的,只能手动设置时间,输入…

【YashanDB认证】-国产数据库-崖山的学习认证之路

一、前序 随着近几年国产数据库的发展,如今的很多的项目中对于底层数据核心数据库选型,越来越要求要符合信创标准,所以在日常工作中对国产数据库的关注也在增加。时常会关注国产数据库的一些实事信息,也会积极参与到各种推广活动&…

【Java核心技术12】面向对象编程(OOP):深入理解类与对象

引言 所有文章均为原创验证,您随手的 关注、点赞、收藏 是我创作最大的动力。 示例代码地址:https://gitee.com/code-in-java/csdn-blog.git Java,作为一种面向对象的编程语言,其核心思想是将数据和操作这些数据的方法封装在一起。…

MySQL NDB Cluster 8.4 这是什么版本

MySQL NDB Cluster 8.4 这是什么版本 MySQL NDB Cluster 8.4 是 MySQL 数据库的一种集群版本,主要用于需要高可用性、高性能和横向扩展的应用程序。NDB Cluster 通过分布式内存存储来实现这些特性,适合于需要快速响应时间和高可用性的场景,如…

idea-Spring框架与ioc容器

Sping是轻量级的开源J2EE框架,可以解决企业应用开发的复杂性 Spring有两个核心部分为Ioc和AOP Ioc:控制反转,吧创建对象过程交给Sping进行管理 AOP:面向切面,不修改代码进行功能增强 创建Maven项目 IDEA-2024 就直接创建java项目即可 创…

PostGreSQL遇到的坑

记录一下: 在postgresql中,alter table a add column b integer 和 alter table ”a“ add column b integer是不一样的, 前者是添加了字段a,后者是添加的是区分大小写的字段a,若后面是添加的“A”那么查询的时候也必须是select…

Android WebSocket长连接的实现

一、为什么需要 WebSocket 初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客…

SpringBoot引入外部依赖包

将需要引入的文件放置到与src同级别的目录下 如上&#xff0c;在src的同级&#xff0c;新建了一个lib目录&#xff0c;将jar包放置其中 在POM文件下&#xff0c;加入如下配置 <dependency><groupId>com.aliyun</groupId><artifactId>com.aliyun.filed…

搭建取图系统app源码开发,满足广泛应用需求

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 图片已成为信息传递的重要媒介&#xff0c;广泛应用于各个领域。为满足日益增长的图片需求&#xff0c;搭建一款高效的取图系统&#xff0c;可以为用户提供便捷、全面的…

linux c++学习笔记整理

文章目录 linux c学习笔记整理环境准备静态库与动态库静态库与动态库理论静态库与动态库示例代码 makemain函数的参数gdb调试程序linux的时间&#xff1a;一、linux的时间操作二、time()库函数三、tm结构体四、loacltime()函数五、mktime()库函数六、gettimeofday()库函数七、程…

windows服务器下jenkins c语言打包的一些经验share

前言 因为一些原因&#xff0c;需要从linux环境下的jenkins 打包c语言转移到使用windows环境下的jenkins打包c语言&#xff0c;从转移的过程中&#xff0c;发现了一些问题和解决方案&#xff0c;故在此和各位运维工程师分享一下。 一、windows 下的c语言编译环境配置 这边就…

中国最全的hive sql 函数集合(持续更新)

#6/20/24 增加greatest函数&#xff1a; select greatest(1,2,3,4,5,2) 结论&#xff1a;可以用hive presto spark得出正确的结果值 #6/20/24 增加last_value(cl1) ignore nulls over(order by ts ) as dt 函数&#xff1a; 有数据集&#xff1a; 1 1 1 2 2   3 3 …

模拟算法:代码世界的生活模拟器

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一. 模拟算法的总结 二. 模拟算法题目 2.1 替换所有的问号 2.2 提莫攻击 2.3 Z字形变换 2.4 外观数列 2.5 数青蛙 总结 前言 本篇详细介绍了模拟算法的使用&#xff0c;让…

自动化办公04 使用pyecharts制图

目录 一、柱状图 二、折线图 三、饼图 四、地图 1. 中国地图 2. 世界地图 3. 省会地图 五、词云 Pyecharts是一个用于数据可视化的Python库。它基于Echarts库&#xff0c;可以通过Python代码生成各种类型的图表&#xff0c;如折线图、柱状图、饼图、散点图等。 Pyecha…

《他强由他强,清风拂山岗;他横由他横,明月照大江》之四

JVM垃圾回收 1.JVM中判断对象存活的方法 引用计数法 每个对象都有一个与之关联的引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1。 优点:高效、简单 缺点:无法解决循环引用问题可达性分析算法 目前主流的商用程序语言(包括Java)主要采用的…

【腾讯云智笔试题——分苹果时间复杂度和空间复杂度都是O(1)】

文章目录 题目描述解题思路&#xff1a;思路讲解&#xff1a; 题目描述 有m个苹果&#xff0c;n个小孩。每个小孩都有一个编号&#xff0c;小明的编号是。要尽量公平的分苹果&#xff0c;相邻编号的小孩分到的苹果数目差距不能大于1。 请问如何在满足相邻编号的小孩分到的苹果…

wsl2平台鸿蒙全仓docker编译环境快速创建方法

文章目录 1 文章适用范围&#xff1a;2 WSL环境安装3 镜像迁移非C盘4 Docker环境准备4.1 docker用户组和用户创建4.2 Docker环境配置4.2.1 Ubuntu下安装docker工具4.2.2 鸿蒙Docker环境安装4.2.3 鸿蒙全仓代码拉取编译 5 鸿蒙全仓代码的更新策略6 参考文献7 FAQ7.1 缺头文件xcr…