在我的编译器的开发阶段,我遇到了一个非常复杂的问题:如何在我的语言中存储弱类型的变量。
由于我允许声明变量而不显式指定它们的类型,并且允许函数返回任何一种类型(例如,函数可以返回一个标量OR数组),我现在面临着将这些变量存储在哪种形式的难度。 / p>
以下是我所提出的可能性,但所有这些都有重要开销:
List<double>
),并让第一个元素指定它是标量还是数组(例如0
或1
)。object
个实例。TVar
(自定义类),可以是double
或List<double>
。请记住:
ILAsm
这是一种更高级别的程序集(基本上是.NET中间语言)答案 0 :(得分:1)
这显然取决于你的语言。如果您在编译时没有修复变量类型,那么您需要使用类型信息包装所有值。 (这有时被称为&#34;拳击&#34;变量,虽然它不是&#34;拳击&#34;唯一可能意味着什么。)
另一方面,您可以在编译时推断出变量类型。例如,awk
(尽管它完全没有声明语法,有时用某种虚拟机的编译器实现)允许标量和数组变量,但很有可能找出类型每个awk变量:
除了作为函数参数传递之外,如果没有下标,则不能使用数组变量,因为awk
不允许数组赋值。因此,与下标一起使用的任何变量都必须是一个数组,除了调用函数之外,任何没有下标的变量都必须是标量。
函数也没有原型,但所有有用的参数必须在函数体中使用或传递给另一个函数。因此,可以为每个函数创建一个原型,将每个变量标识为标量/数组/未知。
对函数调用的最小定点重复扫描将提供有关每个有用变量的精确信息。如果变量既用作标量又用作数组,则可以抛出错误。如果根本没有使用变量(除了可能传递给不使用相应参数的函数),那么可以简单地消除变量,或者可以将其编译为(未使用的)标量。
这还不足以完全键入awk
变量,因为有三种标量类型,因此在大多数情况下仍然需要装箱。在某些情况下,也可能推断出标量类型,尽管由于自动强制而变得更加棘手。但是,您的语言只有一个标量类型,因此类似于上述的策略可能是可行的。