【问题标题】:What is the Correct Order Of Execution of a Java CodeJava代码的正确执行顺序是什么
【发布时间】:2021-03-12 12:30:14
【问题描述】:

我们在关于 java 代码执行的测试中遇到了这个问题:-

选择正确的java代码执行顺序

a) 类加载器

b) 解释

c) 编译

d) 字节码验证

e) Java 源代码

f) 执行

选项:-

  1. e-a-c-b-d-f
  2. e-a-b-c-d-f
  3. e-b-a-c-b-f
  4. e-c-a-d-b-f

我将选项 4 标记为我的选择。我不知道确切的原因,但对我来说那个听起来最好。

结果,它说我的答案是错误的。 T_T

谁能说出正确答案是什么以及为什么。

(大学声称的正确答案是选项 3) (在给出这篇文章的链接后,大学更正了选项 4 的解决方案)

(看了大家的cmets和解决方案,对执行过程有了更深入的了解,而不是仅仅解决一个愚蠢的错误MCQ...... GREAT COMMUNITY)。

【问题讨论】:

  • 那么你可能会质疑测试的有效性。类加载器(运行时)和解释(JVM 对已编译文件执行的操作)都在编译后发生。在编译之前发生的任何思想链都是错误的。再说一次,类加载器(运行时)在解释之后,所以,事实上,4 对我来说似乎也不正确。
  • 正确答案是 4,因为您从源代码 (E) 开始,然后将其编译 (C) 为字节码。由于 A(类加载器)和 B(解释)都适用于字节码,所以不能在 C 之前有 A 或 B,所以它不能是其他选项。其他人可能会将编译与 JIT 混淆。
  • 我很想听到[所谓的]“正确”答案,这样我们都可以无情地嘲笑它(;->)
  • @Stultuske 4 是正确的。源代码 -> 编译为字节码 -> 加载到内存(类加载器) -> 验证加载的代码 -> 此时就变得模糊了,因为解释代码是执行它的一种方式,所以 B 和 F 真的是一样的事情。
  • 真的吗?正确答案是说“解释”发生了两次,而“字节码验证”根本没有发生?还是你抄答案的时候出错了?

标签: java jvm


【解决方案1】:

正确的顺序是e-c-a-d-b-f,所以正确的答案是4

其他三个答案可证明是错误的,因为所有三个都有 a)c) 之前,但你根本不能有 a) 类加载器c) 编译 步骤之前生成类加载器应该加载的字节码。

┌──────────────────────────────────┐
│ e) Java Source Code (.java file) │     Obvious starting point
└──────────────────────────────────┘
                 ↓
 ┌────────────────────────────────┐
 │ c) Compilation (javac command) │
 └────────────────────────────────┘      Then we compile the source code
                 ↓                       to byte code.
     ┌────────────────────────┐
     │ Bytecode (.class file) │
     └────────────────────────┘
                 ↓
       ┌─────────────────┐               The classloader is responsible for
┌──────┤ a) Class Loader ├─ JVM ┐        locating the byte code and making it
│      └─────────────────┘      │        available to the JVM as a byte array
│                ↓              │
│ ┌───────────────────────────┐ │        In the linking phase of preparing a
│ │ d) Byte Code Verification │ │        class for use, the byte code is
│ └───────────────────────────┘ │        verified by the JVM.
│                ↓              │
│     ┌───────────────────┐     │
│     │ b) Interpretation │     │        This one is a bit iffy, but you can
│     └───────────────────┘     │        argue that the byte code is interpreted
│                ↓              │        before it is executed, but the JVM
│        ┌──────────────┐       │        could easily JIT-compile to native
│        │ f) Execution │       │        code without ever executing the code
│        └──────────────┘       │        in interpretation mode.
└───────────────────────────────┘

请注意,ClassLoader 稍后还会再次用于按需加载资源

【讨论】:

  • 问题本身存在一些基本缺陷。它从混合artifacts(源代码、类加载器)和procedures(编译、解释、执行)开始,即使尝试应用最慷慨的解释,“执行”是一个广义术语,实际上包含其他过程,“编译”可以指 javac,也可以指 JIT 编译器。为了火上浇油,javac 本身也是用 Java 编写的,并遵循相同的步骤。
猜你喜欢
  • 2017-06-28
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
相关资源
最近更新 更多