存储弱类型变量的方法

时间:2016-07-10 20:11:10

标签: .net compiler-construction ilasm

在我的编译器的开发阶段,我遇到了一个非常复杂的问题:如何在我的语言中存储弱类型的变量。

由于我允许声明变量而不显式指定它们的类型,并且允许函数返回任何一种类型(例如,函数可以返回一个标量OR数组),我现在面临着将这些变量存储在哪种形式的难度。 / p>

以下是我所提出的可能性,但所有这些都有重要开销:

  • 将所有变量视为双精度列表(List<double>),并让第一个元素指定它是标量还是数组(例如01)。
  • 将所有变量视为object个实例。
  • 将所有变量视为TVar(自定义类),可以是doubleList<double>

请记住:

  • 我打算拥有的唯一两种类型的变量是双精度数和双数组,因为所有其他变量都可以从中派生出来(例如,char是double的情况,string是chars的数组,e.t.c。)
  • 我正在使用ILAsm这是一种更高级别的程序集(基本上是.NET中间语言)

1 个答案:

答案 0 :(得分:1)

这显然取决于你的语言。如果您在编译时没有修复变量类型,那么您需要使用类型信息包装所有值。 (这有时被称为&#34;拳击&#34;变量,虽然它不是&#34;拳击&#34;唯一可能意味着什么。)

另一方面,您可以在编译时推断出变量类型。例如,awk(尽管它完全没有声明语法,有时用某种虚拟机的编译器实现)允许标量和数组变量,但很有可能找出类型每个awk变量:

  1. 除了作为函数参数传递之外,如果没有下标,则不能使用数组变量,因为awk不允许数组赋值。因此,与下标一起使用的任何变量都必须是一个数组,除了调用函数之外,任何没有下标的变量都必须是标量。

  2. 函数也没有原型,但所有有用的参数必须在函数体中使用或传递给另一个函数。因此,可以为每个函数创建一个原型,将每个变量标识为标量/数组/未知。

  3. 对函数调用的最小定点重复扫描将提供有关每个有用变量的精确信息。如果变量既用作标量又用作数组,则可以抛出错误。如果根本没有使用变量(除了可能传递给不使用相应参数的函数),那么可以简单地消除变量,或者可以将其编译为(未使用的)标量。

  4. 这还不足以完全键入awk变量,因为有三种标量类型,因此在大多数情况下仍然需要装箱。在某些情况下,也可能推断出标量类型,尽管由于自动强制而变得更加棘手。但是,您的语言只有一个标量类型,因此类似于上述的策略可能是可行的。