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。
我研究过 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。