jit 编译器与反射
jit compiler vs reflection
在研究这两个关键字的过程中,有一个地方我很困惑。
jit 编译器动态地解释或编译指令,即逐行。
我了解到反射对于动态地 运行 是必要的,因为 Java 是一种静态语言。
我不知道两者在功能上的区别。
jit编译器是动态解释和编译的,但是这种动态查找class类型等信息的行为不是吗?
首先你的问题有些表述不正确
The JIT compiler interprets or compiles instructions dynamically, that is, line-by-line.
这是不正确的:
JIT 编译器将代码从字节码编译为本机代码。它不解释代码。
它“及时”(在运行时)执行。 Dynamic 是一个可能的副词,但它有点没有抓住要点。 (JIT 编译通常只发生一次...)
JIT 编译不会“逐行”发生。 JIT编译的粒度是一个完整的方法
JIT 编译对程序也是透明的。它不会改变程序的行为方式......除了让它运行得更快。
I learned that reflection is necessary in order to run dynamically since Java is a static language.
这也是不正确的。 Java在很多方面都是动态的,没有反思。例如,Java 语言支持:
- 使用类型转换的动态类型,
instanceof
- 动态方法调用调度
- 通过标准 classloader
的动态绑定
等等。
Reflection 允许您执行某些使用从(静态)源代码编译的常规 Java 不切实际的动态操作。但是说 需要 在 Java 中做“动态”事情是不正确的(或循环的)。
实际上,反射和 JIT 是无关的:
JIT 是一种实现Java语言的技术。它不会改变语言的性质,也不会改变您可以用它做什么。它根本不是关于“动态”行为。此外,Java 实现不要求包含 JIT 编译器,实际上有些实现不包含。
反射是标准 Java class 库的基本组成部分。它允许您执行某些使用核心 Java 语言难以完成的“动态”操作。它肯定会影响 Java 程序的行为。
最后,您会发现“动态”在不同的上下文中具有广泛的含义。您需要注意不要混淆上下文中的含义。 (这对于母语不是英语的人来说不是一件容易的事...)
在研究这两个关键字的过程中,有一个地方我很困惑。
jit 编译器动态地解释或编译指令,即逐行。
我了解到反射对于动态地 运行 是必要的,因为 Java 是一种静态语言。
我不知道两者在功能上的区别。 jit编译器是动态解释和编译的,但是这种动态查找class类型等信息的行为不是吗?
首先你的问题有些表述不正确
The JIT compiler interprets or compiles instructions dynamically, that is, line-by-line.
这是不正确的:
JIT 编译器将代码从字节码编译为本机代码。它不解释代码。
它“及时”(在运行时)执行。 Dynamic 是一个可能的副词,但它有点没有抓住要点。 (JIT 编译通常只发生一次...)
JIT 编译不会“逐行”发生。 JIT编译的粒度是一个完整的方法
JIT 编译对程序也是透明的。它不会改变程序的行为方式......除了让它运行得更快。
I learned that reflection is necessary in order to run dynamically since Java is a static language.
这也是不正确的。 Java在很多方面都是动态的,没有反思。例如,Java 语言支持:
- 使用类型转换的动态类型,
instanceof
- 动态方法调用调度
- 通过标准 classloader 的动态绑定
等等。
Reflection 允许您执行某些使用从(静态)源代码编译的常规 Java 不切实际的动态操作。但是说 需要 在 Java 中做“动态”事情是不正确的(或循环的)。
实际上,反射和 JIT 是无关的:
JIT 是一种实现Java语言的技术。它不会改变语言的性质,也不会改变您可以用它做什么。它根本不是关于“动态”行为。此外,Java 实现不要求包含 JIT 编译器,实际上有些实现不包含。
反射是标准 Java class 库的基本组成部分。它允许您执行某些使用核心 Java 语言难以完成的“动态”操作。它肯定会影响 Java 程序的行为。
最后,您会发现“动态”在不同的上下文中具有广泛的含义。您需要注意不要混淆上下文中的含义。 (这对于母语不是英语的人来说不是一件容易的事...)