最近看《深入理解 Java 虚拟机》,看到这么一句
Java 不是在编译时就会检查类型吗?这个静态语言和动态语言的定义分别是啥?
1
kop1989 2020-04-11 23:14:52 +08:00
“动态”的“类型安全语言”。
|
2
majiaxin110 2020-04-11 23:16:03 +08:00
我怀疑这个动态指的并不是动态类型,我只知道 JVM 对动态类型语言有一些支持,坐等 JVM 大佬来解答
|
3
keepeye 2020-04-11 23:18:33 +08:00
只知道强类型弱类型,不懂啥叫动态类型
|
4
x97bgt OP @kop1989 「“动态”的类型安全」这句话应该咋解释?我理解成“运行时再检查类型”,这样不是跟“动态语言”的定义一样。
|
6
mxalbert1996 2020-04-11 23:40:16 +08:00 via Android
所以这段话从第一句后半开始不是都在解释为什么说它是动态的吗
|
7
liangdu 2020-04-12 00:31:43 +08:00 via Android
静态语言,编译器时就可以确定类型。
我们从 jvm 的字节码可以通过 fieldInfo 表中的 classInfo 索引确定 java 类成员的具体类型,所以很肯定的说 java 是一门静态语言。 “动态”的类型安全语言,是对虚拟机的实现的要求。类型安全是指,语义安全(这个我不懂)和安全访问非堆内存(不越界之类的)。动态的类型安全语言区别于静态的类型安全,在于要求 jvm 的运行时不停的做这个“类型安全监测”。 明白这一点,我们就知道 jvm 实现要求真高(如果减少安全检测 jvm 应该可以提速),这是“动态的类型安全语言”的性质之一。 其实是“动态的类型安全语言”,对内存访问是有做安全检测的,所以,可以看得出 java 是一门严谨的语言。 |
8
araaaa 2020-04-12 01:27:48 +08:00 via iPhone
更像是对解释型语言描述,javac 编译出的 class 本质是中间代码
|
9
rogwan 2020-04-12 05:36:20 +08:00 via iPhone
Java 是动态的类型安全语言
难道不是作者搞错了?按作者这样理解,那还有什么语言算静态,不全是动态吗? |
10
Cbdy 2020-04-12 08:07:55 +08:00 via Android
2020 年了,那个语言没点静态检查能力?没点动态内省能力?
|
11
x97bgt OP @liangdu “动态类型“和“动态的类型安全”实际上是两个概念?静态类型在编译后并不能完全确保变量的调用过程是安全的,在运行时还要再做检查?这个意思吗?
|
12
mxalbert1996 2020-04-12 11:10:00 +08:00 via Android
@rogwan 比如 C/C++ 就是静态的,你在 C/C++ 里越界访问数组或者访问空指针的时候直接就 segfault 了,也就是系统会直接杀掉你的程序,你对此没有任何办法。但在 Java 里 JVM 会先检查你访问的地址合不合法,如果不合法的话会抛出异常,你可以 catch 这个异常然后继续运行程序。
|
13
liangdu 2020-04-12 11:13:04 +08:00 via Android 1
|
14
rogwan 2020-04-12 11:31:45 +08:00 via iPhone
@mxalbert1996 这样的动态抛出异常,其他的真动态语言也会呀。作者这样是拗概念,混淆常识。
|
15
mxalbert1996 2020-04-12 19:39:46 +08:00 via Android
@rogwan 作者想表达的就是 Java 会在运行时动态地做检查,这跟真动态语言有什么关系?不要因为你知识少或者阅读能力差就诽谤别人。
|
16
rogwan 2020-04-12 21:16:22 +08:00
@mxalbert1996 我回复是你 @我的内容,你连这点理解力都没有吗?你的学识有多高?智商几何?不秀一下也好意思人身攻击?你这素质脑内充屎呀
|
17
mxalbert1996 2020-04-12 21:37:08 +08:00 via Android
@rogwan 我的学识嘛,其他不敢说,至少比一个认为所有语言都是动态的人要高吧。
|
18
rogwan 2020-04-12 22:57:53 +08:00
@mxalbert1996 哈哈,你这个理解力还好意思人身攻击?贬低别人知识少?敢问你哪个学校毕业的呀? ACM 拿过几块牌呀?你这跑出来是秀智商还是秀脑残呀?
|
19
penguinWWY 2020-04-13 01:23:35 +08:00
动态是用来描述类型安全的,
意思是执行时提供类型信息,进行类型检查,同样的概念映射到 C++就是 RTTI,Run-Time Type Identification |