公共语言运行时&字节码本地代码转化思考

2023-11-04

一直以来不同平台的可执行文件的兼容性一直是计算机发展的困局。为了使软件能够在不同平台上运行,很多公司或个人都为此做出了巨大努力。而且有一些语言也是专门针对跨平台设计的,像java一样,说实话,就跨平台的能力来看,java是一款非常不错跨平台的语言。然而,事实摆在面前,java编写的应用软件无法脱离java虚拟机(也就是java运行时),而且在运行的过程中往往效率低下。对此,我们是不是应该提出一种新的解决方案解决跨平台与效率的冲突?
首先,我们来探索一下计算机的运行机制。
事实上,所以的,我们编写出来的程序源码都是无法直接在电脑上运行。这需要把这些代码变成目标代码,这个过程叫编译,你也可以说这是翻译,事实上确实如此。然而,目标代码也不一定就是可执行的。这些代码也都有别称如java称为字节码,也就是我们见到的.class文件。当然,这些文件并不能独立运行,人们提供了另一种方法来运行它,使用C或者是C++编写的本地可执行程序运行它,很简单,一个对于class文件,而且你的操作系统又是windows(2000以上)的,而且,你已经设置好了环境变量,就可以使用CMD运行class文件,也可以把命令写在文本文件中,修改文件后缀名,得到.cmd命令脚本或者.bat的批处理文件双击就可以运行class文件,以及jar(源包)
但最终说来,这都是通过运行时实现的,即class文件被java.exe加载到java虚拟机运行的。
你可以想象,一个本可以自己运行的程序却不能称作为程序需要别的代劳,就像一个没有发动机的大货车要另一台火车拖着跑,你能看到速度吗?如果这个火车又发动机有不一样了。
下面我们对这种运行时的做法进行一下分析:
还是著名的java运行机制。
对此我们先了解java虚拟机JVM:
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。编译虚拟机的指令集与编译微处理器的指令集非常类似。
很显然,开发基于java语言的应用的跨平台的移植能力是非常强悍的。jave虚拟机JVM将平台的特征隐藏,虚拟出“完全一样”的java计算机。这样开发出的应用都是应用在虚拟的java计算机上,又有什么不可兼容呢?
然而,但我们沉迷在java的与平台无关性能时,我们的机器或许会感到“疲劳”,
一个小的测试:自己编写一个只有一个操作的程序,这个操作是输出“HelloWorld!”分别用C++和java实现。对于C++编译后生成的本机程序.exe,单独执行内存256KB,加载到CMD中执行内存为619KB,而java编译后的class文件需要java.exe加载执行。内存为888KB。由于class文件无法自己执行,所以在执行效率方面是完全无法和C/C++这样的系统编程语言相比。另外,这个C++程序是有GCC编译的。GCC在Windows平台上的编译效果是无法和VC++相比,利用VC++编译,内存至少要下降到单独运行80KB以下。(另外有一种基于LLVM,(低层虚拟机)Clang编译器编译效率远远优于GCC),在ACM大学生程序设计大赛试题库中,对不同语言编写的程序运行时间有严格限制,一般说来java编写的程序一般是其他语言编写程序运行时长的2倍,越复杂的试题编写的程序运行时间的差距越大,有的达到3倍,或者4倍,或者5倍。或许有的问题使用java选择就是个错误。对java的态度来说,Google算得上滑稽了,或许,谷歌自以为他的JVM效率很高,甚至接近C/C++,于是在Andord上全部使用java开发应用,如今,谷歌正悄悄地开发API支持C/C++在Andord上开发应用,稀缺的硬件资源,绝对要高效利用!那么java好像完败了。很多钟情于C/C++的人都觉得Java就像一场庞氏骗局。大企业欺骗了程序员!
或许人们会说:但我们不能这样要求java,事实上java最大的特点是与平台无关性。其他的特点有很多语言都比它强N倍。
也许,甲骨文会说,嘿,java是个高效的语言。
当然,为了获取高效,Java虚拟机的运行机制也有一个容易被忽略的地方,那些常用的字节码将被翻译成本机代码放在缓存中运行。但是如果应用重新启动,那么有将要重新翻译,另外,只要使用Java虚拟机运行应用就必然会使应用效率低下,即使是利用JIT(即时编译)一样要消耗大量资源,而且JIT不像本地化一样彻底生成机器代码。所以基本上操作系统,编译器,数据库大部分都是C/C++编写的,一些特大型系统,如航空公式售票系统。还有一个要补充,跨平台java编程很容易忽视平台的硬件特征,结果显而易见,与硬件的契合度是令人失望的!
难道,我们正的要在跨平台和效率上做一个取舍吗?
很多人都会说不,也有人在不断改进java。
说到这里,我们回到正题上:怎样实现跨平台和高效?
java其实是一个很好的列子,而且java运行效率还是可以的,但是却不够,如何实现,这里我们提出:跨平台应用程序本地化方案(Cross - platform application localization scheme)(简称:CPALS)
意思即是将平台无关的二进制代码编译成本地代码应用脱离运行时,如Java的Class字节码文件可以使用这一解决方案生成本地独立可执行应用,在Windows平台上生成.exe,应用开发商只需要分发源包jar,无需考虑其他,用户也不需要考虑效率问题,而且用户可以自己自定义应用解决方案。
可能存在争议:既然运行时会解释,何必多此一举生成.exe呢。我们可以知道,在生成.exe的独立可执行文件时,应用的代码要优化,与操作系统的结合要加深,而且必要时可以增加与硬件的契合度。大幅提高使用效率。Java只是一个列子,对于所有的语言我们都可以如此大幅提高应用的效率。既然有抽象的虚拟化与硬件无关的过程,也有底层化契合硬件的步骤,而且一切交给编译器优化,我们无需担心兼容与高效的冲突!

这里注意的是:CPALS是将利用JVM运行的字节码转换为本地代码,具有完整的可执行文件格式和系统调度,而不是将源代码编译为本地代码.如果这样做,JAVA的存在便没有多大意义了.

adds:

事实上,也有基于JAVA转换成本地代码的编译程序,但是一般也是另一种形式的虚拟机,姑且不论虚拟机的效率而言,确实比JVM的字节码效率还是要高一些,毕竟本机操作系统+Runtime的效率还是不成问题,内存是可以降下来的,效率便有了。兼容性与本及代码,硬件的差距这个问题难以解决啊,虚拟机解决兼容,只有在最小损失下保证最大兼容性才是解决方案!

我们或许只能在虚拟机的路上走了,不要JAVA的臃肿的虚拟机,而是要比较底层的虚拟机,如LLVM。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

公共语言运行时&字节码本地代码转化思考 的相关文章

  • 如何将 javax.persistence.Column 定义为 Unsigned TINYINT?

    我正在基于 MySQL 数据库中的现有表创建 Java 持久性实体 Bean 使用 NetBeans IDE 8 0 1 我在这个表中遇到了一个字段 其类型为 无符号 TINYINT 3 我发现可以执行以下操作将列的类型定义为 unsign
  • 如何将画廊意图中的“打开”更改为“完成”?

    我使用以下意图打开画廊来选择多个图像和视频 Intent intent new Intent intent setType image video intent putExtra Intent EXTRA ALLOW MULTIPLE tr
  • Java Runtime.getRuntime().freeMemory() 问题

    我搜索并看到了一些线程 但没有一个能够解决我遇到的具体问题 我正在尝试使用以下方式监视我的内存使用情况Runtime getRuntime freeMemory Runtime getRuntime maxMemory and Runtim
  • 通过SOCKS代理连接Kafka

    我有一个在 AWS 上运行的 Kafka 集群 我想用标准连接到集群卡夫卡控制台消费者从我的应用程序服务器 应用程序服务器可以通过 SOCKS 代理访问互联网 无需身份验证 如何告诉 Kafka 客户端通过代理进行连接 我尝试了很多事情 包
  • 打印星号的 ASCII 菱形

    我的程序打印出这样的钻石 但只有当参数或菱形的每一面为4 例如如果我输入6 底部三角形的间距是错误的 我一直在试图找出答案 当参数改变时 底部的三角形不会改变 只有顶部的三角形会改变 它只适用于输入4 public static void
  • Java:在 eclipse 中导出到 .jar 文件

    我正在尝试将 Eclipse 中的程序导出到 jar 文件 在我的项目中 我添加了一些图片和 PDF s 当我导出到 jar 文件时 似乎只有main已编译并导出 我的意愿是如果可能的话将所有内容导出到 jar 文件 因为这样我想将其转换为
  • Spring Boot自动装配存储库始终为空[重复]

    这个问题在这里已经有答案了 每次我进入我的服务类时 存储库似乎都没有自动连接 因为它不断抛出 NullPointerException 谁能帮我检查一下我缺少什么吗 这是我的代码 演示应用程序 java package com exampl
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • 如何根据运行的 jar 的结果让我的 ant 任务通过或失败?

    我正在运行 CrossCheck 无浏览器 js 单元测试 作为 ant 脚本的一部分 如果 CrossCheck 测试失败 我希望 ant 报告失败 这是 build xml 中的相关部分
  • 生成的序列以 1 开头,而不是注释中设置的 1000

    我想请求一些有关 Hibernate 创建的数据库序列的帮助 我有这个注释 下面的代码 在我的实体类中 以便为合作伙伴表提供单独的序列 我希望序列以 1000 开头 因为我在部署期间使用 import sql 将测试数据插入数据库 并且我希
  • Freemarker 和 Struts 2,有时它计算为序列+扩展哈希

    首先我要说的是 使用 Struts2 Freemarker 真是太棒了 然而有些事情让我发疯 因为我不明白为什么会发生这种情况 我在这里问是因为也许其他人有一个想法可以分享 我有一个动作 有一个属性 说 private String myT
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • 使用布尔值进行冒泡排序以确定数组是否已排序

    我有以下用于冒泡排序的代码 但它根本不排序 如果我删除布尔值那么它工作正常 我知道 由于我的 a 0 小于所有其他元素 因此没有执行交换 任何人都可以帮助我解决这个问题 package com sample public class Bub
  • “无法实例化活动”错误

    我的一个 Android 应用程序拥有大约 100 000 个用户 每周大约 10 次 我会通过 Google 的市场工具向我报告以下异常情况 java lang RuntimeException Unable to instantiate
  • Spring-ws:如何从没有“Request”元素的 xsd 创建 Wsdl

    尝试为客户端实现 SOAP Web 服务 我需要一个 wsdl 文件来通过soapUI 测试该服务 但正如您在下面看到的 这个 xsd 没有 Request 和 Response 方法 所有请求和响应都被定义为基本 ServiceProvi
  • 在 Google App-Engine JAVA 中将文本转换为字符串,反之亦然

    如何从字符串转换为文本 java lang String to com google appengine api datastore Text 反之亦然 Check Javadoc http code google com appengin
  • Hamcrest Matchers - 断言列表类型

    问题 我目前正在尝试使用 Hamcrest Matchers 来断言返回的列表类型是特定类型 例如 假设我的服务调用返回以下列表 List
  • 使用按钮作为列表的渲染器

    我想使用一个更复杂的渲染器 其中包含列表的多个组件 更准确地说 类似于this https stackoverflow com questions 10840498 java swing 1 6 textinput like firefox
  • OpenCSV:将嵌套 Bean 映射到 CSV 文件

    我正在尝试将 bean 映射到 CSV 文件 但问题是我的 bean 具有其他嵌套 bean 作为属性 所发生的情况是 OpenCSV 遍历属性找到一个 bean 然后进入其中并映射该 bean 内的所有数据 如果找到另一个 bean 它就
  • org.apache.commons.net.io.CopyStreamException:复制时捕获 IOException

    我正在尝试使用以下方法中的代码将在我的服务器中创建的一些文件复制到 FTP 但奇怪的是我随机地低于错误 我无法弄清楚发生了什么 Exception org apache commons net io CopyStreamException

随机推荐

  • 什么是测试开发?现阶段找工作能否抢救一下?

    前言 最近开始投简历 除了开发 唉看到了测试开发这一职位 那这是个什么岗位的 像我这种开发干不过别人 但又会一点的应届生能否抢救一下 1 我对测试开发的首先印象 听名字就是测试跟开发的结合嘛 估计是测试的基础上 进行一些开发任务 提高测试的
  • 关于学习JPA出现的问题(1)——不允许有匹配 “[xX][mM][lL]“ 的处理指令目标(Unable to locate persistence units)

    这个错误比较简单 而且触发的条件很多 主要就是你的XML文件错了 导致读取不到文件信息 这个时候第一个要检查的是文件的格式 然后再检查标签 一般都能排查出来
  • 搭建国产化统信UOS操作系统虚拟机

    统信UOS作为国产化操作系统的生力军 近年来异军突起 我使用过银河麒麟 飞腾麒麟 最后还是推荐给大家这款UOS操作系统 一 下载镜像 首先需要登录统信操作系统的官方网站https www chinauos com resource down
  • 跨平台发布文章测试

    跨平台发布文章测试 跨平台发布文章测试 跨平台发布文章测试 跨平台发布文章测试 跨平台发布文章测试 本文由博客群发一文多发等运营工具平台 OpenWrite 发布
  • WPF 事件转命令

    WPF中不是所有的控件都有Command属性的 如果窗体我需要在ViewModel中处理Loaded事件命令 或者其他事件的命令时 很难都过绑定Command完成 必须要注册依赖属性或事件等 使用System Windows Interac
  • 时序预测

    时序预测 MATLAB实现PSO BiLSTM 粒子群优化双向长短期记忆神经网络 时间序列预测 目录 时序预测 MATLAB实现PSO BiLSTM 粒子群优化双向长短期记忆神经网络 时间序列预测 预测效果 基本介绍 模型介绍 PSO模型
  • div和section有什么区别?在加一个article标签

    1 div在html早期版本就支持了 section和article是html5提出的两个语义化标签 如果只是针对一个块内容做样式化 三者并无区别 2 作为语义化标签 section 应用的典型场景有文章的章节 标签对话框中的标签页 或者论
  • JavaSE、JavaEE和JavaME与Java的关系是什么?

    JavaSE JavaEE和JavaME都是建立在Java语言基础之上的不同分支 它们共同构成了Java平台的不同方面和应用领域 1 JavaSE Java Platform Standard Edition 是Java平台的基础 它提供了
  • 【分布鲁棒和多目标非负矩阵分解】基于DR-NMF的对NMF问题噪声模型的识别鲁棒性研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据 文章讲解 1 概述 文献来源 摘要 非负矩阵分解
  • 多益网络的四个笔试题(数学)

    题目1 有1 60 60个数字 然后对应把它们随机分成6组 每组10个数 问数字1和数字2分到同组的概率 我觉得答案是 9 59 同学不信 所以回来又仔细思考了一下 因为笔试的时候是很随意地想的 笔试时候的想法 数字1先选一个组 剩下59个
  • Time Series Data Augmentation for Deep Learning: A Survey

    本文属于数据增强系列综述的文章 针对 Time Series Data Augmentation for Deep Learning A Survey 的翻译 Time Series Data Augmentation for Deep L
  • zipkin以mysql的方式存储

    环境 centos java8 mysql zipkin 这篇教程用于搭建已mysql作为存储的zipkin 还不知道zipkin是什么的小伙伴请略过 zipkin学习传送门http blog csdn net liaokailin art
  • FatesrNet:Run, Don‘t Walk: Chasing Higher FLOPS for Faster Neural Networks

    概述 为了实现更快的网络 作者重新回顾了FLOPs的运算符 并证明了如此低的FLOPS主要是由于运算符的频繁内存访问 尤其是深度卷积 因此 作者提出了一种新的partial convolution PConv 通过同时减少冗余计算和内存访问
  • 【新手基础教程】片上外设之 SPI 的使用

    SPI 的使用 关于 SPI 详细介绍请参考SPI API 文档 1 使用方法 1 1 主机模式 从 machine 导入 SPI 模块 from machine import SPI 配置使用到的 pin 脚为片选 GPIO 功能和 SP
  • 软件外包开发在线监测工具

    软件系统上线后需要在线网络工具监测系统的运行 这样在系统出现故障时第一时间通知到系统维护人员 对于软件系统的稳定运行是必不可少的监测工具 今天和大家分享一些常用的在线监测工具 希望对大家有所帮助 北京木奇移动技术有限公司 专业的软件外包开发
  • Jenkins+Ant+Jmeter接口自动化集成测试实例

    本文转载自 http www cnblogs com TestWorld p 5564697 html 3467861 一 Jenkins安装配置 1 安装配置JDK1 6 环境变量 2 下载jenkins war 放入C jenkins目
  • 安装MacOSx,Linux,windows用以开发工作——安装Linux篇

    作者 faylan2 sina com 日期 2018 03 29 说明 欢迎邮件来往交流 本篇为安装CentOS7 Linux 分两种 一种为主板启动方式为BIOS 一种为主板启动方式为UEFI 本篇为真机安装 安装Linux 在安装前
  • Java中的stream之文件和stream之间的转换

    字节流 读取文件内容 public static String readFileByStream String filePath try FileInputStream fileInputStream new FileInputStream
  • 【解决】could not find an available, non-overlapping IPv4 address pool among the defaults to assign to t...

    在同一套环境中跑了很多个项目都是用 docker compose的方式启动的 导致创建的自定义网络过多出现下面的报错 Error response from daemon could not find an available non ov
  • 公共语言运行时&字节码本地代码转化思考

    一直以来不同平台的可执行文件的兼容性一直是计算机发展的困局 为了使软件能够在不同平台上运行 很多公司或个人都为此做出了巨大努力 而且有一些语言也是专门针对跨平台设计的 像java一样 说实话 就跨平台的能力来看 java是一款非常不错跨平台