Java编译器/解释器

2024-03-05

为什么我们说Java是一种编译型和解释型语言?

这样做的好处是什么(被编译和解释)?


Java 在编译时被编译为中间“字节代码”。这与 C 等语言在编译时编译为机器语言形成对比。 Java 字节代码不能像编译的 C 代码那样直接在硬件上执行。相反,字节码必须在运行时由 JVM(Java 虚拟机)解释才能执行。像 C 这样的语言的主要缺点是,当它被编译时,该二进制文件只能在一种特定的体系结构(例如 x86)上运行。

像 PHP 这样的解释性语言实际上是独立于系统的,并且依赖于特定于系统和架构的解释器。这带来了更大的可移植性(相同的 PHP 脚本可以在 Windows 机器和 Linux 机器等上运行)。然而,这种解释会导致性能显着下降。像 PHP 这样的高级语言比可以由硬件执行的机器特定指令需要更多的时间来解释。

Java 寻求在纯编译语言(没有可移植性)和纯解释语言(速度明显慢)之间找到折衷方案。它通过将代码编译成更接近机器语言的形式来实现这一点(实际上,Java 字节代码是一种机器语言,简称为 Java 虚拟机),但仍然可以在体系结构之间轻松传输。因为 Java 仍然需要软件层(JVM)来执行,所以它是一种解释性语言。然而,解释器(JVM)在称为字节码的中间形式上运行,而不是在原始源文件上运行。该字节代码是由 Java 编译器在编译时生成的。因此,Java也是一种编译型语言。通过这种方式操作,Java 获得了编译语言的一些好处,同时也获得了解释语言的一些好处。但是,它也继承了这两种语言的一些限制。

正如 Bozho 指出的那样,有一些策略可以通过使用即时 (JIT) 编译来提高 Java 代码(以及 .Net 等其他字节代码语言)的性能。实际的过程因需求而异,但最终的结果是原始代码在编译时被编译为字节码,然后在运行时经过编译器运行才被执行。通过这样做,代码可以以接近本机的速度执行。有些平台(我相信.Net是这样做的)保存JIT编译的结果,替换字节码。通过这样做,程序的所有未来执行都将像该程序从一开始就被本机编译一样执行。

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

Java编译器/解释器 的相关文章

随机推荐

  • 设置 $.prop() 而不触发更改

    li li
  • 如何在 Jenkins 插件中将数据从 FileCallable 发送回 master 到记录器?

    我正在使用以下示例here http javadoc jenkins ci org index html hudson FilePath html void someMethod FilePath file make file a fres
  • 在运行时向窗体上的每个控件添加事件处理程序 VB6

    我有一个 VB6 应用程序 我希望其控件在应用程序范围内具有一致的行为 例如 其中一种行为是在文本框获得焦点时突出显示它 并在失去焦点时删除突出显示 我希望这种情况发生在每一种形式上 我想做的是拥有一个子过程 所有表单在加载时都可以调用该子
  • 监听 JBoss AS 6 中的登录事件

    我有一个在 JBoss AS6 中运行的应用程序 身份验证正在使用 FORM 身份验证方法进行 并且用户正在正确登录 我希望能够在用户成功登录时调用一段自定义的静态代码 不幸的是 我找不到任何侦听器 挂钩或回调 它们将在成功登录时执行代码
  • np.argsort 排除零值

    我有一个数组 0 2 0 0 0 0 3 0 0 0 0 4 我在用着np argsort对值进行排序并获取索引 所以 对于我的例子来说 它会是这样的 1 5 9 2 3 4 6 但是 我只想获取索引数组非零值 仅在我的示例中 1 5 9
  • SailsJS - 将 sails.io.js 与 JWT 结合使用

    我已经实现了一个 AngularJS 应用程序 使用 sails io js 通过 websockets 与 Sails 后端进行通信 由于后端基本上是一个纯 API 并且也会从其他应用程序连接 因此我尝试完全禁用会话并使用 JWT 我已经
  • 在独立运行的 Powershell 脚本之间传递信息

    抱歉之前是工资 我会再尝试 情况很复杂 无法解释 但基本上问题是 如何将字符串 最多 20 个字符 从一个脚本传递到另一个脚本在同一台机器上运行 这两个脚本在后台连续运行同一台机器 在下面相同的用户上下文 but 不能合并 I 不能点源一个
  • 我想在 Excel 中从数千个项目的列表中查找特定项目的最新日期

    因此 在上面第一个项目的示例中 我希望最晚日期为 2018 年 7 月 17 日 对于 Office 365 使用 MAXIFS MAXIFS B B A A A2 对于较旧的 USE AGGREGATE AGGREGATE 14 6 B
  • SolidJS:打字稿错误表示值的类型为“未定义”,尽管检查它不是

    我有一些 SolidJS 代码 例如 value undefined img src srcs value where value是一个信号 我在下面收到 TypeScript 错误value saying Type undefined c
  • 如何在Firemonkey中绘制虚线?

    我想在 Firemonkey 项目中的 TPaintbox 画布上绘制点状网格 结果应该如下所示 首先 我想我会绘制垂直虚线 然后绘制水平虚线 因此考虑到这一点 我尝试先绘制一条线 以使外观恰到好处 这就是我尝试过的 Canvas Stro
  • newBufferWithBytes() 有大小限制吗?

    我一直在使用 Metal 渲染多面体 当我尝试使用 newBufferWithBytes 渲染一个二十面体实体时 该问题发生了 该实体的顶点仅包含 1680 字节的数据 然后整个应用程序停止 CPU 和 GPU 帧都降至零 一切都恢复正常
  • Spring Security 具有数据库和多个角色?

    我正在尝试使用 spring 3 0 制作一个应用程序 现在我决定尝试一下 spring security 和 hibernate 我已经看到可以用数据库支持它 并且我已经看到了定义您自己的查询的参考 现在我遇到的问题是我找到的教程不太清楚
  • 如何高效存储100万个单词并通过starts_with、contains或ends_with进行查询?

    网站如何喜欢this https www morewords com contains c存储数万个 包含 c 的单词 或者类似this https word tips words with d and c 带有 d 和 c 的单词 或者更
  • 如何判断两个日期是否在同一天或同一小时? [复制]

    这个问题在这里已经有答案了 JavaScript Date 对象将日期与时间进行比较 因此 如果比较 time1 getTime time2 getTime 他们将是 false 如果至少有一毫秒不同 我们需要的是有一个很好的方法来按小时
  • 在 Google 脚本中尝试/捕获 HTTP 响应的最佳方法

    我对 JavaScript 和 Google apps 脚本还很陌生 这是我第一次尝试使用 Try Catch 语句 我正在运行连接到页面的脚本 它在大多数情况下都可以毫无问题地连接 但有时它不会响应并抛出 http 错误 或者 响应将为空
  • HtmlUnitDriver 无法正确获取页面

    我是这方面的新手 基本上我正在尝试使用 HtmlUnitDriver 这是我的代码 WebDriver driver new HtmlUnitDriver driver get http www google com System out
  • 如何通过单击按钮打开新窗口

    作为我的程序的一部分 我需要一个按钮 当用户单击它时 它会打开一个新窗口 好吧 我想我应该有一个类来制作框架并通过按钮调用它 但我没有任何开始的想法 我刚刚在程序中找到了按钮 但它不起作用 那么有人可以告诉我该怎么做吗 或编码 这是您想要执
  • 更改 Azure Devops 中的组织 URL 时对管道代理的影响

    我想在 Azure Devops 中重命名我的组织 URL 这 articles https support microsoft com en gb help 2793597 things to do before and after yo
  • 使用 Office 2010 COM 的 asp.net Web 服务

    我正在编写一个 Web 服务 并希望将 docx 或 doc 更改为 xps 我正在使用 Office com 来帮助我另存为 xps 格式 如下所示 WebMethod public string GetDocPreviewUrl str
  • Java编译器/解释器

    为什么我们说Java是一种编译型和解释型语言 这样做的好处是什么 被编译和解释 Java 在编译时被编译为中间 字节代码 这与 C 等语言在编译时编译为机器语言形成对比 Java 字节代码不能像编译的 C 代码那样直接在硬件上执行 相反 字