存储弱类型变量的方法
Posted
技术标签:
【中文标题】存储弱类型变量的方法【英文标题】:Methods of storing weakly typed variables 【发布时间】:2016-11-12 18:12:45 【问题描述】:在我的编译器的开发阶段,我遇到了一个非常复杂的问题:如何在我的语言中存储弱类型变量。
由于我允许在不明确指定其类型的情况下声明变量,并允许函数返回任一类型(例如函数可以返回标量 OR 数组),我现在面临着以何种形式存储这些变量的困难。
以下是我考虑过的可能性,但它们都有显着的开销:
将所有变量视为双精度列表 (List<double>
),并让第一个元素指定它是标量还是数组(例如 0
或 1
)。
将所有变量视为object
实例。
将所有变量视为TVar
(自定义类),可以是double
或List<double>
。
记住:
我打算拥有的唯一两种类型的变量是双精度和双精度数组,因为所有其他变量都可以从中派生(例如,char 是双精度的情况,字符串是字符数组等) 我正在使用ILAsm
,这是一种高级的汇编语言(基本上是.NET 中间语言)
【问题讨论】:
list-of-doubles 方法不允许您表示列表列表。 @sepp2k 列表列表可以被认为是一个多维列表,我计划支持它的第一个索引值大于 2(例如 3 -> 3 维数组/列表) 等 浮点数对于所有整数并不精确。 javascript 有这个问题。所有数字都有浮动。 @usr true,我正在考虑如何通过将明显的整数(例如 for 循环计数器)“优化”为原生int
类型来最小化这种影响
【参考方案1】:
这显然很大程度上取决于您的语言。如果您在编译时不修复变量类型,那么您需要使用类型信息包装所有值。 (这有时被称为“装箱”变量,尽管它并不是“装箱”的唯一含义。)
另一方面,您也许可以在编译时推断变量类型。例如,awk
(尽管它完全没有声明语法,但有时通过编译器对某种虚拟机实现)允许标量和数组变量,但很可能找出每个 awk 的类型变量:
除了作为函数参数传递之外,数组变量不能不带下标使用,因为awk
不允许数组赋值。所以任何带有下标的变量都必须是一个数组,而任何不带下标的变量,除了在函数调用中,都必须是一个标量。
函数也没有原型,但所有有用的参数必须要么在函数体中使用,要么传递给另一个函数。因此可以为每个函数创建一个原型,将每个变量标识为标量/数组/未知。
对函数调用的最少定点重复扫描将提供有关每个有用变量的精确信息。如果变量既用作标量又用作数组,则可能会引发错误。如果一个变量根本没有被使用(除了可能被传递给不使用相应参数的函数),那么这个变量可以被简单地消除,或者它可以被编译为一个(未使用的)标量。
这不足以完全键入awk
变量,因为存在三种标量类型,所以在大多数情况下仍需要装箱。在某些情况下,也可能推导出标量类型,尽管由于自动强制转换会比较棘手。但是,您的语言只有一个标量类型,因此类似于上述的策略可能是可行的。
【讨论】:
以上是关于存储弱类型变量的方法的主要内容,如果未能解决你的问题,请参考以下文章