How do dynamically typed languages work?
今天我学习了动态类型编程语言在运行时进行类型检查,而不是在编译时进行静态类型检查(如果我错了,请纠正我)。我想知道的是,在运行时,动态类型语言是如何发现类型的,以及它是如何工作的?而且动态类型语言也被称为值类型语言,在动态类型语言的情况下,类型与值相关联意味着什么?
由于我是一个初学者,我的问题会成为你们中的一些人的一个不好的问题,请试着从我的角度思考,我刚刚开始,我在任何地方都找不到这个答案。
更新
从类型系统的维基百科页面
Implementations of dynamically type-checked languages generally associate each runtime object with a"type tag" (i.e. a reference to a type) containing its type information. This runtime type information (RTTI) can also be used to implement dynamic dispatch, late binding, downcasting, reflection, and similar features.
现在什么是类型标记,它是如何工作的,我的意思是如果你能告诉我它在内存中是如何表示的?
这取决于实现。下面是关于实现如何决定表示值的三个粗略示例。好的。
术语说明:我将使用"value"这个词来讨论作为参数传递给函数、放入字段等的位。在许多情况下,一个值可能是或包括指向其他地方额外内存的指针。好的。1:带类型标记头的指针
在这个实现中,一个值仅仅是指向内存中一个对象的指针,并且每个对象都有一个"类型标记",位于同一个偏移量,表示它是什么类型的东西。它可以是一个简单的枚举或指向某种类型的"元类"。好的。
例如,一个整数由一个对象的指针表示,该对象有两个字段:第一个字段包含类型标记
优点是简单。装箱整数的缺点是,每个算术运算1)都要经过额外的指针间接寻址,2)需要为结果分配一个对象。这通常是非常缓慢的。好的。
Java虚拟机对所有类类型的变量和字段使用此表示。这就是为什么
另一种可能的表示方法是使用两个词来表示每个值。第一个是类型标记,第二个是立即值(对于整数、布尔值、字符等类型)或指针(对于字符串、对象、数组等)。好的。
它消除了与装箱整数等相关的分配和内存间接问题,但它使值表示比原来大两倍,这是浪费。好的。3:带标签位的一个字
第三种表示通过将类型标记和值压缩为一个单词来"优化"第二种表示。如果所有对象都被分配为32位对齐,那么每个有效指针都以2个零位结束。(或3位用于64位对齐等)这些位可用于区分极少数基本类型。例如,这里有一个标签系统:好的。
与上面的表示2一样,这个表示方案也避免了装箱(大多数)小数据,但它避免了膨胀,因为值仍然由一个词表示。它需要与垃圾收集器(识别和跟踪指针)进行一定程度的合作,但2也是如此。好的。
对于类似于语言的方案,它具有无限大小的整数以及其他类型的数字,例如"flonums"(浮点数)和"ratnums"(精确有理数或分数),像
1 2 3 4 5 | if a and b are both fixnums: add a and b directly on overflow, jump to the general addition function otherwise, that's the result otherwise, jump to the general addition function |
一般的加法功能只是简单地处理所有的情况,在必要时计算出促销,并对给定的数字类型做适当的工作。但是,如果大多数时候
虽然操作(原始算法、对象字段获取等)在检查和补偿标记位方面变得更加复杂,但这种表示方式快速而紧凑。这种方法的一个缺点是,如果你用一个典型的类型化、安全的语言编写一个解释器/VM,比如Java、C语言、ML等等,那么这个类型系统就不会让你把整数块变成指针。你可以用C语言,这是不安全的。好的。
这种表示思想的另一种变体是"NaN编码":有大约2^51位的模式,表示"不是数字"作为IEEE双精度浮点数。为什么不将有效的浮点数字表示为它们自己,并将其他值打包到NaN空间中?好的。
以下是一些参考资料:好的。
- 盗窃罪中的数据表示,方案的实施(上述3版本)
- 更详细地介绍相同想法的博客文章
好啊。
动态语言中的变量通常是对类实例或对象的引用(对于某些语言,有时内置数据类型为
它们可以在"生命周期"(存在垃圾收集)期间接收对不同对象(或类实例)的引用,因此它们的类型由对象的类型派生(它是
当确定对象的类型时,不同的语言将以不同的方式实现这一点。
例如,Python使用元类来确定类的类型,并在确定对象的类型时使用这些信息。
javascript使用的对象除了包含其普通属性说明符(类似于元类)之外,还包含普通数据类型(