R 类型识别的工作原理

How R type identification works

我研究过 R 使用动态类型,但我想了解更多相关信息。 解释器如何理解像下面这样的对象是数字?

var <- 5
str(var) 
OUTPUT: num 5

@Stefano,我不太确定我理解你的问题,但我猜 R 的 tokenization/syntax 规则允许解释器推断出 5 是一个数字文字,并且该类型信息与符号 table(环境)中的值一起保存在 var 名称下。

R 与其他动态类型语言一样,将值存储在特殊的数据结构中,这些数据结构不仅包含值本身,还包含元信息 关于 类型(通常称为类型“标签”)。

这在 R internals 中有详细描述。

简而言之,R 中的每个表达式在内部存储为 S-expression,在 C 代码中表示为称为 SEXPREC 的结构(或其一些小变体)。由于技术原因,SEXPREC 结构的实际定义很复杂,但它基本上归结为一个 header(元数据)、一个指向属性的指针、一些其他指针,最后是值本身。

在header中,前五位存储一个数字,指定表达式的类型。整数的编号为 12,non-integer 数值的编号为 13,字符串的编号为 9,依此类推。

在 R 中使用表达式的每一段代码都需要在某个时候检查此 meta-information 以确定表达式类型是什么,以及如何对其执行计算。这是动态语言通常比静态类型语言慢的部分原因:它们需要为(几乎)它们执行的每个操作执行额外的 book-keeping。